zainv673799 发表于 2017-12-5 16:40:57

VMP脱壳脚本(3)

跟进去看下流程
00E77D14    90            nop
00E77D15    51            push ecx            保存环境            
00E77D16    66:F7D1         not cx         垃圾代码
00E77D19    8B4C24 04       mov ecx,dword ptr ss:    栈顶+4(调用CALL的返回地址)给ECX,
00FB7CFF    8D49 01         lea ecx,dword ptr ds:   取 返回地址+1的值 给ECX
01013FB5    894C24 04       mov dword ptr ss:,ecx重新写入到返回处
01013FB9    B9 A1598A00   mov ecx,008A59A1 计算地址
010566B2    8B89 94C36C00   mov ecx,dword ptr ds: 计算地址
00E95200    8D89 19378077   lea ecx,dword ptr ds: 计算地址
00FEA363    870C24          xchg dword ptr ss:,ecx真实函数地址给栈顶,还原环境      
010ABADE    C3            retn
这个 有点不一样啊,很简单 看调用CALL 的下面有一个 RETN啊,这要是正常返回 程序还不得跑飞啊,VMP巧妙的利用 4 5 6三行代码 就搞定了,这写壳的人真是脑洞大开啊!
所有的IAT加密就这样完了吗??? NO还有更脑洞大开的 往下看
https://attach.52pojie.cn/forum/201602/20/012925jmimh0vvlqi7fq09.png
跟进去看看
0119D768    90            nop
0106B2C9    872C24          xchg dword ptr ss:,ebp         交换栈顶的值,还原栈顶
00F3E26F    55            push ebp                              保存返回地址
00F3E270    F7D5            not ebp                               垃圾代码
00F3E272    50            push eax                              保存环境
00F3E273    B8 D41D4300   mov eax,00431DD4计算地址
00F3E278    66:8BEB         mov bp,bx垃圾代码
00F3E27B    8B80 41F7BE00   mov eax,dword ptr ds:计算地址
00F3E281    66:0F4FE8       cmovg bp,ax垃圾代码
00F3E285    66:8BE8         mov bp,ax   垃圾代码
00F3E288    8D80 903F170C   lea eax,dword ptr ds:计算地址
00F3E28E    0FB7E8          movzx ebp,ax 垃圾代码
00F3E291    8BE8            mov ebp,eax   真实函数地址给 EBP
00F3E293    58            pop eax   还原 寄存器
011B5D71    C3            retn
这是在干啥呢?? 咋把真实函数地址 给了 EBP呢? 看调用处的下面 有一个 call ebp 明白了吧 这是把   mov xx,[????????]整成了一个CALL哦,再来看下堆栈 调用处popEBP , CALL内 第2行 有把栈顶的值还原了,然后把函数的返回地址重新PUSH进去,这里处理的很巧妙,所有 调用处的 pop ebp也是垃圾指令,这就完了???NO还有往下看
https://attach.52pojie.cn/forum/201602/20/014822di7u9icipiz53uuo.png
跟进去看下
00E97E5D    90            nop
00E97E5E    0FBFDB          movsx ebx,bx垃圾代码
010C1083    50            push eax                  保存环境   
010C1084    8B4424 04       mov eax,dword ptr ss:      获取当前CALL的返回地址给EAX
00E2EB3F    8D40 01         lea eax,dword ptr ds:   获取当前CALL返回地址+1给EAX
00E2EB42    0F45DB          cmovne ebx,ebx    垃圾代码
00E2EB45    66:0FB6DB       movzx bx,bl垃圾代码
00E2EB49    894424 04       mov dword ptr ss:,eax保存返回地址
00E2EB4D    B8 012C4300   mov eax,00432C01 计算地址
00E2EB52    66:0FBEDB       movsx bx,bl 垃圾代码
00E2EB56    66:8BDF         mov bx,di 垃圾代码
01170378    8B80 F58CC000   mov eax,dword ptr ds: 计算地址
0117037E    0FB7DC          movzx ebx,sp 垃圾代码
01170381    0F41DE          cmovno ebx,esi      垃圾代码
01170384    F6D7            not bh 垃圾代码
01170386    8D80 145A2C32   lea eax,dword ptr ds: 计算地址
0117038C    B3 85         mov bl,0x85 垃圾代码
0117038E    8ADE            mov bl,dh 垃圾代码
01170390    8BD8            mov ebx,eax   真实函数地址给 EBX            
01170392    0FBFC2          movsx eax,dx 垃圾代码
01170395    C6C4 E2         mov ah,0xE2 垃圾代码
01170398    0FC8            bswap eax             垃圾代码            
0117039A    58            pop eax      还原环境                  
0117039B    C3            retn
认真看 了上面的部分,这里不难理解了吧, 4 5 8行处理调用处的 下面 retn 的,函数是获取 EBX的调用值的

一共6种 IAT相关的处理,所以我是 一边写脚本一边骂写 VMP壳的人,要不要这么坑啊!不多说了下面贴上脚本!需要的自己去下! 链接:https://pan.baidu.com/s/1geYm4YB 密码:km9e

页: [1]
查看完整版本: VMP脱壳脚本(3)