VM绕过技巧(易语言)

0x1追踪[EBP-4]

介绍

找到按钮事件特征码的位置,可以发现call调用的是[ebp-4]的值的位置,若找到[ebp-4]的值是从哪里来的,就算别人把按钮事件特征码整个给vm掉了,也能追踪到按钮事件特征码

实例

在按钮事件特征码附近有个beginprocessevent函数,在它下面有一个汇编是给将eax的值赋值给[ebp-4],而eax的值是从beginprocessevent函数返回的,当触发按钮操作后,eax的值是不等于0的,所以在下个条件断点

image-20220821180315681
image-20220821162511719

运行程序点击按钮,断点断下来后按enter进入call test.krnln_?BeginProcessEvent@CKrnl>,里面有许多个retn,在每个retn处都下断

image-20220821162703429

点击运行程序,如果不触发按钮事件还能断下来的断点我们直接取消掉,直至找到按钮触发的断点

image-20220821180414811

程序在retn处断下来后查看OD右边的寄存器窗口的eax值,此处eax的值为4010D8

image-20220821180605123

eax的值就是[epb-4]的值,ctrl+G搜eax的值跳转到按钮事件特征码的函数头位置

image-20220821180750504

提取retn断点处的特征码用于以后可直接追踪按钮事件特征码

image-20220821182702777

0X2重载内核Dll

介绍

通常写易语言软件的作者都会将按钮事件特征码整段都给vm掉,但是他们忽略了一个点, 没有把按钮事件特征码其外层的call进行vm, 而这个外层call走的是易语言的内核函数

在按钮事件特征码的call下断点,查看右下角的堆栈窗口可找到外层call

image-20220821204121034

鼠标右键反汇编窗口跟随,找到外层call test.krnln_?Notify@CKrnlApp@@QAEHHK>

image-20220821204327384

image-20220821211909354

进入这个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

image-20220821212420520

实例

首先准备好易语言的dll文件来用作后续的dll注入,为了识别是否注入成功,这里写了一个信息框

image-20220821212723579

将要破解的软件的按钮事件特征码给vm掉

image-20220821212906329
image-20220821212914802

将加完vm后的软件拖入OD,使用StrongOD插件注入dll,这里选择远程注入

image-20220821213006366
image-20220821213018357

在代码节搜索前面所记述的特征码,发现有两处,第一个地址为40ee20,第二个地址为9c19a4040ee20是程序本身的,9c19a40是注入的dll的

image-20220821213115214

ctrl+G转到对应的地址,修改其汇编代码,将call 40ee20修改为call 9c19a40

image-20220821213243057

通过查询模块窗口,发现这个9c19a40是在注入的dll的代码段的范围之内,然后双击这个dll进入它的代码段

image-20220821213352760

搜索按钮事件特征码并下断点(其实就是在注入的dll下按钮事件特征码断点)

image-20220821213514880

运行程序点击按钮,发现程序在刚刚下的断点断下了

image-20220821213712457

F7单步步入这个call,这个call的地址就是真正的按钮事件函数,并没有任何的vm痕迹

image-20220821213751434

0X3偏移量追钟按钮事件

介绍

新建一个易语言程序并将其拖入OD打开,二进制搜索FF 25转到易语言体处的第三个jmp下断

image-20220821214328818

然后一路往下跟,跟到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

image-20220821214653031
image-20220821214704562

将此处的内存地址复制下来,到内存窗口里搜索此地址

image-20220821214836942
image-20220821214912864

在内存窗口找到第二行第四列所对应的地址550370,然后转到此地址处

image-20220821214940838
image-20220821215056436

在内存窗口里往下拉,直至可以看到左边的ascii窗口处有“按钮”字样,其实这是一个结构体,里面有些成员是用于追踪按钮事件的偏移量

怎么知道哪个是偏移量呢?有一个规律05....01....43,这个43就是偏移量,也就是说05...01再往后的值就是偏移量

image-20220821215321282

回到反汇编窗口的易语言体处然后往上拉,找到nop下面的反汇编地址,此处地址是4010ac

注意:此处的反汇编代码是不固定的,不一定是pop esi,有时候是push ebp

image-20220821215705379

计算4010ac + 43(偏移量) = 4010EF, 计算出的这个地址就是按钮事件的函数头部

image-20220821215712677

实例

准备好一个vm好了的易语言程序,这里就不演示VM过程了

在OD搜索createwindow然后下断,这一步的操作是为了让vm把壳吐出来

image-20220821220112480

内存中搜索前文所准备好的特征码: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

image-20220821220214020
image-20220821220229144

根据前文的讲过的操作寻找到偏移量(过程不演示了),偏移量是B0

image-20220821220418276

转到易语言体的反汇编处往上拉,nop下面的地址是401004,然后加上偏移量等于4010b4,这个地址就是按钮事件函数地址

image-20220821220445522

最后更新于