VM绕过技巧(易语言)
最后更新于
最后更新于
找到按钮事件特征码的位置,可以发现call调用的是[ebp-4]
的值的位置,若找到[ebp-4]
的值是从哪里来的,就算别人把按钮事件特征码整个给vm掉了,也能追踪到按钮事件特征码
在按钮事件特征码附近有个beginprocessevent
函数,在它下面有一个汇编是给将eax
的值赋值给[ebp-4]
,而eax
的值是从beginprocessevent
函数返回的,当触发按钮操作后,eax
的值是不等于0的,所以在下个条件断点
运行程序点击按钮,断点断下来后按enter进入call test.krnln_?BeginProcessEvent@CKrnl>
,里面有许多个retn,在每个retn处都下断
点击运行程序,如果不触发按钮事件还能断下来的断点我们直接取消掉,直至找到按钮触发的断点
程序在retn处断下来后查看OD右边的寄存器窗口的eax值,此处eax的值为4010D8
eax的值就是[epb-4]的值,ctrl+G搜eax的值跳转到按钮事件特征码的函数头位置
提取retn断点处的特征码用于以后可直接追踪按钮事件特征码
通常写易语言软件的作者都会将按钮事件特征码整段都给vm掉,但是他们忽略了一个点, 没有把按钮事件特征码其外层的call进行vm, 而这个外层call走的是易语言的内核函数
在按钮事件特征码的call下断点,查看右下角的堆栈窗口可找到外层call
鼠标右键反汇编窗口跟随,找到外层call test.krnln_?Notify@CKrnlApp@@QAEHHK>
进入这个call找到函数头部并提取特征码:64 A1 00 00 00 00 6A FF 68 ?? ?? ?? ?? 50 64 89 25 00 00 00 00 83 EC 10 53 55 8B 6C 24 28
首先准备好易语言的dll文件来用作后续的dll注入,为了识别是否注入成功,这里写了一个信息框
将要破解的软件的按钮事件特征码给vm掉
将加完vm后的软件拖入OD,使用StrongOD插件注入dll,这里选择远程注入
在代码节搜索前面所记述的特征码,发现有两处,第一个地址为40ee20
,第二个地址为9c19a40
,40ee20
是程序本身的,9c19a40
是注入的dll的
ctrl+G转到对应的地址,修改其汇编代码,将call 40ee20
修改为call 9c19a40
通过查询模块窗口,发现这个9c19a40
是在注入的dll的代码段的范围之内,然后双击这个dll进入它的代码段
搜索按钮事件特征码并下断点(其实就是在注入的dll下按钮事件特征码断点)
运行程序点击按钮,发现程序在刚刚下的断点断下了
F7单步步入这个call,这个call的地址就是真正的按钮事件函数,并没有任何的vm痕迹
新建一个易语言程序并将其拖入OD打开,二进制搜索FF 25
转到易语言体处的第三个jmp下断
然后一路往下跟,跟到calltest.krnln_?LibInitUserProgram
,F7进如此call
走到mov eax,dword ptr ds:[___eapp_info]
,并提取其特征: 55 8B EC 6A FF 68 ?? ?? ?? ?? 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 81 EC AC 01 00 00
将此处的内存地址复制下来,到内存窗口里搜索此地址
在内存窗口找到第二行第四列所对应的地址550370
,然后转到此地址处
在内存窗口里往下拉,直至可以看到左边的ascii窗口处有“按钮”字样,其实这是一个结构体,里面有些成员是用于追踪按钮事件的偏移量
怎么知道哪个是偏移量呢?有一个规律05....01....43,这个43
就是偏移量,也就是说05...01再往后的值就是偏移量
回到反汇编窗口的易语言体处然后往上拉,找到nop下面的反汇编地址,此处地址是4010ac
注意:此处的反汇编代码是不固定的,不一定是pop esi,有时候是push ebp
计算4010ac + 43(偏移量) = 4010EF, 计算出的这个地址就是按钮事件的函数头部
准备好一个vm好了的易语言程序,这里就不演示VM过程了
在OD搜索createwindow
然后下断,这一步的操作是为了让vm把壳吐出来
内存中搜索前文所准备好的特征码:55 8B EC 6A FF 68 ?? ?? ?? ?? 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 81 EC AC 01 00 00
,找到关键函数地址0x437600
根据前文的讲过的操作寻找到偏移量(过程不演示了),偏移量是B0
转到易语言体的反汇编处往上拉,nop下面的地址是401004
,然后加上偏移量等于4010b4
,这个地址就是按钮事件函数地址