TA的每日心情 | 奋斗 2019-12-9 15:37 |
---|
签到天数: 44 天 [LV.5]常住居民I
终身vip会员
- UID
- 9295
- 元宝
- 279
- 威望
- 60
- 贡献
- 3
- 信誉值
- 0
- 精华
- 0
- 在线时间
- 19 小时
- 注册时间
- 2017-10-31
- 最后登录
- 2019-12-9
- 违规
- 0
- 积分
- 196
|
跟进去看下流程
00E77D14 90 nop
00E77D15 51 push ecx 保存环境
00E77D16 66:F7D1 not cx 垃圾代码
00E77D19 8B4C24 04 mov ecx,dword ptr ss:[esp+0x4] 栈顶+4(调用CALL的返回地址)给ECX,
00FB7CFF 8D49 01 lea ecx,dword ptr ds:[ecx+0x1] 取 返回地址+1的值 给ECX
01013FB5 894C24 04 mov dword ptr ss:[esp+0x4],ecx 重新写入到返回处
01013FB9 B9 A1598A00 mov ecx,008A59A1 计算地址
010566B2 8B89 94C36C00 mov ecx,dword ptr ds:[ecx+0x6CC394] 计算地址
00E95200 8D89 19378077 lea ecx,dword ptr ds:[ecx+0x77803719] 计算地址
00FEA363 870C24 xchg dword ptr ss:[esp],ecx 真实函数地址给栈顶,还原环境
010ABADE C3 retn
这个 有点不一样啊,很简单 看调用CALL 的下面有一个 RETN啊,这要是正常返回 程序还不得跑飞啊,VMP巧妙的利用 4 5 6三行代码 就搞定了,这写壳的人真是脑洞大开啊!
所有的IAT加密就这样完了吗??? NO 还有更脑洞大开的 往下看
跟进去看看
0119D768 90 nop
0106B2C9 872C24 xchg dword ptr ss:[esp],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:[eax+0xBEF741] 计算地址
00F3E281 66:0F4FE8 cmovg bp,ax 垃圾代码
00F3E285 66:8BE8 mov bp,ax 垃圾代码
00F3E288 8D80 903F170C lea eax,dword ptr ds:[eax+0xC173F90] 计算地址
00F3E28E 0FB7E8 movzx ebp,ax 垃圾代码
00F3E291 8BE8 mov ebp,eax 真实函数地址给 EBP
00F3E293 58 pop eax 还原 寄存器
011B5D71 C3 retn
这是在干啥呢?? 咋把真实函数地址 给了 EBP呢? 看调用处的下面 有一个 call ebp 明白了吧 这是把 mov xx,[????????] 整成了一个CALL哦,再来看下堆栈 调用处pop EBP , CALL内 第2行 有把栈顶的值还原了,然后把函数的返回地址重新PUSH进去,这里处理的很巧妙,所有 调用处的 pop ebp也是垃圾指令,这就完了???NO还有往下看
跟进去看下
00E97E5D 90 nop
00E97E5E 0FBFDB movsx ebx,bx 垃圾代码
010C1083 50 push eax 保存环境
010C1084 8B4424 04 mov eax,dword ptr ss:[esp+0x4] 获取当前CALL的返回地址给EAX
00E2EB3F 8D40 01 lea eax,dword ptr ds:[eax+0x1] 获取当前CALL返回地址+1给EAX
00E2EB42 0F45DB cmovne ebx,ebx 垃圾代码
00E2EB45 66:0FB6DB movzx bx,bl 垃圾代码
00E2EB49 894424 04 mov dword ptr ss:[esp+0x4],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:[eax+0xC08CF5] 计算地址
0117037E 0FB7DC movzx ebx,sp 垃圾代码
01170381 0F41DE cmovno ebx,esi 垃圾代码
01170384 F6D7 not bh 垃圾代码
01170386 8D80 145A2C32 lea eax,dword ptr ds:[eax+0x322C5A14] 计算地址
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
|
评分
-
查看全部评分
|