爆破vm代码关键点之某文本编辑辑xxxxEdit4.3.1(4480)的分析与爆破
本帖最后由 无闻无问 于 2020-11-14 12:19 编辑官方介绍:身躯小巧,性能卓越,自定义功能完善,丰富的主题和脚本,完美的编码、大字符集字符显示,无论您是哪个级别的码农,它都会给您带来不一样的体验!此软件,未注册有30天左右的试用期,试用期满后,弹出未注册提示框,并且不能再使用软件。(如果下载尚在试用期,可调整系统时间,即可过期)
一、分析前思考或准备:
1.重启验证,解决了它等于解决了注册问题。
2.关键代码被VM了,说明进入VM的地方即可能是关键的地方。
3. 去除exe的重定位,防止随机基址影响分析(使PE工具CFF Explorer去除)。
4.X64dbg。
温馨提示:不同机器,不同版本X64dbg,文中部分内容可能不同!电脑内存要大,x64dbg这厮跟踪和分析数据特别吃内存……
二、定位VM位置。
1.内存布局中,找到VM段,下内存访问断点(同时注意记下vm段的基址)。然后运行程序,断在了这个VM段的地方。
2.堆栈回溯,找VM入口(也可不用找)。在“调用堆栈”窗口中,找最近的一个用户模块的调用call。(如果堆栈显示较少,可右键,单击“显示可能的调用堆栈帧”显示更多调用)跟随过去,往下翻找(有点多)跳转到VM段的jmp大跳转……
应该是这里:
当然,也可在CPU窗口,右键,搜索-当前模块-命令,快键ctrl+shift+f,输入命令jmp0x 00000001403C13AF即RIP暂停在VMP段处的地址。找到入口后,下好断点。
3. 确定VM的出口,应该就是入口下方一大堆int3后的正常代码了。下好断点!
4. 重复上面下vmp段内存断点的方法,找到第2、3次的VM入口点和出口点。分别是:
三、确定程序注册的关键位置。
通过以上的操作知道,有3次进入VM段,说明这3个地方是作者不愿意破解者看到的,但哪一处才是重要的呢?我们既然3个地方出入口都下好了断点,重新运行一下,看看未注册提示框在哪一次出入VM的时候弹出,基本就可以确定那一次就是较为关键,可以优先分析突破的了(如果启动软件没有弹出到期未注册的提示框可以改系统时间让其弹出)。
通过运行,可以发现,未注册过期提示框是在第2次VM出口后未进入第3次VM时弹出,由此基本可以确定关键的判断在第2次VM中了。切换断点窗口,禁用第1次出入口和第3次出入口的断点。仅保留第2次VM入口和出口的断点。
四、跟踪vm代码。
重新载入并运行程序,使之暂停在第2次VM入口点断点处,单步一次,进入VM中。切换到“跟踪”窗口,右键—启动运行跟踪,设置好跟踪文件保存位置。然后单击菜单“追踪”—“步进直到条件满足”。可将最大单步次数设置到最大。
设置好了,单击确定,然后静静等吧(时间取决于电脑性能)……
等到暂停在第2次VM出口的断点处,约3A14ED行记录。切换到“跟踪”窗口,右击,停止运行跟踪……在跟踪记录的结尾不远处,我们看到一个非常有趣的注册表键,这个键就是记录使用期的:
3A14DF00000001403BF43B5Bpop rbxrbx:L"Software\\Classes\\ZQBKAF8AUWBZAFGAWAAT"
五、分析、查找可疑关键点。
在“跟踪”窗口,右键,搜索—常数,表达式中输入:0000000000000040,静静等待搜索结果(时间取决于电脑性能)。
提示:为什么要搜索0x40,这是前辈们的总结,不清楚的可查看以下文章及有关vmp NAND(与非门)与EFLAGS标志位的文章,本帖也是参考以下前辈文章:
https://bbs.pediy.com/thread-224732.htm
在结果“引用”窗口,下方筛选一下,andrax,rcx,注意rcx前有个空格……
接下来,就是体力活了……
逐行选中,右键,复制—索引,切换到追踪窗口,ctrl+G,粘贴索引,跳到位置处,在该行,右键,信息,查看rax与rcx的具体值,如果rax为40,rcx为246或FFFFxxxx打头的就要留意,下好断点……
提示:其实可以在追踪窗口中,选择全部,右键—复制—选区,到文件,保存为文本或*.csv格式,利用其它软件分析,但x64dbg可能有严重BUG,当追踪数据达上十万行时,写入文件就会卡死,物理内存占用达95%左右。估计,大量申请了内存没有及时释放致后面操作没法继续……
全部筛选完可疑的行,下好断点,然后重新运行程序,当and rax,rcx语句执行完,rax为40时,尝试将rax置0……
通过反复排查,最终可确定以下两处即为关键点:
00000001403B8663 |48:23C1 | and rax,rcx | rax=40,rax=246========结果要0
00000001403B8B71 |48:23C1 |and rax,rcx |40+RCX:FFFFFFFFFFFFFD68 ====结果要0
找到后,就可以HOOK了,找到以下空白地方补代码:HOOK代码及位置:
00000001401C8A98| 48:83F8 40 |cmp rax,40
00000001401C8A9C| 0F85 C9FB1E00 |jne everedit.1403B866B
00000001401C8AA2| 48:81F9 46020000 |cmp rcx,246
00000001401C8AA9| 0F85 BCFB1E00 |jne everedit.1403B866B
00000001401C8AAF| B8 00000000 |mov eax,0
00000001401C8AB4| E9 B2FB1E00 |jmp everedit.1403B866B
00000001401C8AB9| 48:83F8 40 |cmp rax,40
00000001401C8ABD| 0F85 B6001F00 |jne everedit.1403B8B79
00000001401C8AC3| 48:81F9 68FDFFFF |cmp rcx,FFFFFFFFFFFFFD68
00000001401C8ACA| 0F85 A9001F00 |jne everedit.1403B8B79
00000001401C8AD0| B8 00000000 |mov eax,0
00000001401C8AD5| E9 9F001F00 |jmp everedit.1403B8B79
二进制:
48 83 F8 40 0F85 C9 FB 1E 00 48 81 F9 46 02 00 00 0F 85 BC FB 1E 00 B8 00 00 00 00 E9 B2 FB1E 00 48 83 F8 40 0F 85 B6 00 1F 00 48 81 F9 68 FD FF FF 0F 85 A9 00 1F 00 B800 00 00 00 E9 9F 00 1F 00
将00000001403B8663和00000001403B8B71处下方的jmpxxxxxx,更改jmp到HOOK地方。
00000001403B866348:23C1and rax,rcx
00000001403B8666E9 2D04E1FFjmp everedit.1401C8A98jmp到HOOK处
00000001403B8B7148:23C1and rax,rcx
00000001403B8B74E9 40FFE0FFjmp everedit.1401C8AB9
更改完毕后,右键—补丁(ctrl+p)--全选—修补文件。至此,爆破完成!效果如图:
如果关于菜单,仍有未注册提示,可修改注册以下键值:
@=hex:f7,2e,af,5f,00,00,00,00
"Value"=dword:00000001
将Value改为0,或直接删除键值。
最后,由衷感谢前辈大神们在vmp分析征程上的无私奉献。因为你们,使得我等小菜鸟也能简单触及一下令人望而生畏的vmp!心中万分欣喜!谢谢你们!
同时,向本帖中涉及的软件及作者说声抱歉:拿你的软件作为分析学习的对象!
在此也郑重说明,本帖只是学习分析vmp用,请勿商业用途!请尊重作者劳动成果,如果喜欢,购买正版支持作者。
故不提供成品,敬请谅解! @无闻无问 @无闻无问@无闻无问
不要成品 不要成品不要成品 ,重要的事情说三次。
只求等价原装货。{:301_971:} 写的很不错 学习了 不过这个排版看着头疼
呃呃。。。 大佬nb,手刚VM 大佬nb,手刚VM 冥界3大法王 发表于 2020-11-14 12:40
@无闻无问 @无闻无问@无闻无问
不要成品 不要成品不要成品 ,重要的事情说三次。
只求等价原装货。{ ...
官网下,老大 学习了。。:Dweeqw 学习一下,多谢大佬分享。 师傅好吊,那个时间还没有学VM,现在已经炉火纯青了。差距越来越大。 朱朱你堕落了 发表于 2020-11-14 13:06
师傅好吊,那个时间还没有学VM,现在已经炉火纯青了。差距越来越大。
兄弟不要笑,我只是跟着看雪大佬的帖子理一下,纯粹模仿…