关注作者:JuruoAssociation 原创于 CSDN
原创不易,谢绝转载。点击支持原文
IDA Pro9.0汇编中的字符串查找方法和主入口逐层分析过程。不提供最终资源,仅供学习。参考学习IDA Pro 9.0。
✅观察程序表现
坚果墙wordscheck源文件在github上开源,但是很明显开了个寂寞,放了若干exe、bin和几个客户端请求示例
下载下来的提示要privateKey,一年300比网费还贵。没有privateKey的版本功能非常糟糕,详细版本信息在此处查看。
✅推测检测方式
观察程序运行模式为服务器,且私钥有有效期,私钥应该在启动时被检测
进一步确定私钥有联网检测。由于没有key并不会退出,推测是修改了变量用于标志是否注册成功,若未注册,后续将会限制功能
✅调试程序
先PEid一下,64位UPX
解压后再扫,含有GO文件头,然而GO语言不好反编译,还是直接汇编调试
上IDA Pro9.0,可以通过主入口点逐层分析,也可以通过搜索附近的字符串,前者可以获得更全面的检查信息但费时费力,后者更快捷需要一定经验。
⭐主入口点分析
一共三种视图:Text view传统视窗。Graph view是以函数为单位,从明显的入口点开始,挖到所有的retn位置,然后处理出其中的跳转关系分块。
Proximity view将函数在上一步基础进一步集成,将关键元素和各个函数的引用和调用关系上下链接,方便静态查找。
大致思路:目标函数就是那个F8以后开始正常运行并提示你未注册的,然后就重启调试,调试到该函数F7步入下一层。
备忘录:快捷键自定义非常不方便,默认设置大量冲突,但是开了Legacy就会有传统的快捷键例如F2标记断点,F4运行Cursor,F7F8F9都有。Alt滚轮左右滑动。本程序直接Ctrl+C结束可能会带崩IDA,建议先Detach。
⭐字符串追踪
Text搜索建议购买私钥,没有结果,推测进行了隐藏。
但附近的privatekey:
找到了,后面有个条件WarnLg,测试一下就知道了,确定目标就是qword_1DA2768
。
考虑到这可能是中途变量,直接改多半会引发错误,还是要xref找到写函数
第一个是企业版标志函数,第三个是标准版检测。如果有做主入口分析可以发现,实际上在loadLicense
中的离线key检查也是要先过这个函数(隐隐不对劲?)
汇编代码如下:
;第1块
mov rax, cs:qword_1DA14F8
lea rbx, aServersetmnSha ; "serversetmn;sha bisharp;sha"
mov ecx, 6
call gopkg_in_ini_2ev1__ptr_File_Section
lea rbx, aPrivatekey_2 ; "privatekey"
mov ecx, 0Ah
call gopkg_in_ini_2ev1__ptr_Section_Key
mov rbx, [rax+28h] ; string
mov rcx, [rax+30h]
call gopkg_in_ini_2ev1__ptr_Key_transformValue
mov [rsp+48h+var_10], rax
mov [rsp+48h+var_18], rbx
cmp rbx, 32h ; 如果字符串长度rbx大于0x32就进入报错退出
jle short loc_854440
;第3块
loc_854440:
cmp rbx, 17h ; rbx必须是0x17才允许继续第4块
jnz short loc_8544C5
;第4块
mov rcx, rax
mov rdi, rbx
lea rax, aAZaZ09_0 ; "^[A-Za-z0-9]+$"
mov ebx, 0Eh
call regexp_MatchString
nop dword ptr [rax]
test al, al ; 只要满足以上正则表达式就执行第6块,否则执行第5块报错退出
jnz short loc_85448F
;第5块
mov rax, cs:qword_1DA14F0 ; _ptr_golog_Logger
lea rbx, aPrivatekeyErro ; "privatekey errorproto: bad UTF-8proxy-c"...
mov ecx, 10h
xor edi, edi ; _slice_interface_
xor esi, esi
mov r8, rsi
xchg ax, ax
call github_com_davyxu_golog__ptr_Logger_Errorf
mov eax, 1
call os_Exit
;第6块
loc_85448F:
mov rbx, [rsp+48h+var_18]
mov cs:qword_1DA2768, rbx ; 目标被赋值rbx
cmp cs:dword_1DFB160, 0
jnz short loc_8544B2
一眼丁真,不是注册机。不可能只有一个正则表达式匹配,而且跟踪transformValue
得到ebx实际上就是字符串长度。也就是说只要长度是0x17,只有大小写字母和数字的字符串就能搞定1DA2768(变成0x17),只能说是个合规性检查,合规就不提醒Warn。
于是瞎编一个23位的字串。
再跟踪字串data error
得到sendVerify
函数,最上面检查key有效性,后面跟踪调试见机行事即可
紫色是未注册跳转路线,蓝色是修正后的路线。然后Edit-Patch program-Apply patches to input file即可,注意备份
没想着离线使用,就只分析了上面的线索,下面离线key检查可能还有其他步骤