IDA Pro9.0汇编字符串查找跟踪坚果墙wordscheck结构

关注作者: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位置,然后处理出其中的跳转关系分块。
Graph view
Proximity view将函数在上一步基础进一步集成,将关键元素和各个函数的引用和调用关系上下链接,方便静态查找。
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有效性,后面跟踪调试见机行事即可
Proximity view
紫色是未注册跳转路线,蓝色是修正后的路线。然后Edit-Patch program-Apply patches to input file即可,注意备份

不存在
不通
无效
有效且版本对应
无效
有效
存在
检查离线key
检查网络
network interrupt
联网检查key
data interrupt
二次验证
disabled interrupt
加载service

没想着离线使用,就只分析了上面的线索,下面离线key检查可能还有其他步骤

✅ 参考资料

IDA Pro实用技巧
IDA Pro&王哥
坚果墙文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值