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
|
5、还原IAT
随便找一个IAT调用函数跟一下,刚好OEP下面就有两个 FF25 型的IAT 调用,跟进去看下
还是啥都看不懂,不过没关系 既然是调用IAT函数,肯定会在某一时刻调到真实函数地址去的 继续跟下面把整个跟的流程贴上来
这是整个流程的实际执行的代码 ,现在分析下
01059D91 53 push ebx 保护环境
01059D92 66:0FB6DB movzx bx,bl 垃圾代码
01059D96 66:BB 5D55 mov bx,0x555D 垃圾代码
01059D9A BB 5AC27200 mov ebx,0072C25A 这才是最终对EBX操作所以上面两条都是没用的代码
00F3BBFF 8B9B 25697400 mov ebx,dword ptr ds:[ebx+0x746925] 计算地址
01196B98 8D9B 5071F632 lea ebx,dword ptr ds:[ebx+0x32F67150] 计算地址
00EA9FC2 871C24 xchg dword ptr ss:[esp],ebx 和栈顶交换,并还原EBX的原始值
00F9FC9D C2 0400 retn 0x4 还原EBX 并返回函数
这时候看下堆栈 栈顶出现真实函数的地址
00F9FC9D C2 0400 retn 0x4 分析下这条指令的执行流程,先EIP=栈顶的值 也就是真实函数地址,栈顶+4+4 懂汇编的人就会发现,栈顶+8的位置保存是当前CALL的返回地址 那执行了这条指令后返回地址不是没有了么?因为这个IAT调用 没加密前是 FF25型的 也就是 jmp [????????] 所以不需要返回地址 ,而调用这个IAT的时候 是有一个CALL的进CALL的时候就会PUSH返回地址到堆栈,所以这个IAT处理的很巧妙!执行完真实函数后直接就返回到调用IATCALL的下面继续执行了。
看图片发现 这个CALL 下面有一条 RETN指令 看来这条 是VMP加上去的了,但是不要忽略了这条指令 因为这条指令很重要,VMP在获取 IAT地址的最后RETN的地址 会随机JMP到代码他添加的RETN 上,并不完全是在壳段 所以这个RETN 要留到最后处理。
再找一个FF25 型的IAT调用看看
跟进去看下,下面是执行流程代码
00FB7DC7 90 nop
00FB7DC8 0FB7D6 movzx edx,si 垃圾代码
00FB7DCB 66:0FBED1 movsx dx,cl 垃圾代码
00FB7DCF 5A pop edx 出栈
00FB7DD0 871424 xchg dword ptr ss:[esp],edx 交换栈顶的值,还原 EDX原始值
00FB7DD3 52 push edx 保护环境
00FB7DD4 66:0FBED1 movsx dx,cl 垃圾
00FB7DD8 0FB7D6 movzx edx,si 垃圾
00FB7DDB BA B7757D00 mov edx,007D75B7 计算地址
010DFDAD 8B92 3D036900 mov edx,dword ptr ds:[edx+0x69033D] 计算地址
0102B837 8D92 B52FE512 lea edx,dword ptr ds:[edx+0x12E52FB5] 计算地址
00EACB30 871424 xchg dword ptr ss:[esp],edx 函数真实地址给栈顶 并还原环境
0115D36E C2 0400 retn 0x4
这个FF25 CALL 的第四行 有个POP edx 而进这个CALL之前 有一个push edx ,可以看出 这个push edx 也是垃圾代码是 VMP自己添加上去的,看来VMP 会随机在上下 填充一个字节,在上面就是 PUSH 一个寄存器,在下面就是 retn
找一个 FF15型的CALL看看
跟进去看下流程
010B27B9 BE B34E6E0B mov esi,0xB6E4EB3 垃圾代码
00EFFC5B 5E pop esi 出栈
00EEB9B0 873424 xchg dword ptr ss:[esp],esi 交换栈顶的值,还原 ESI原始值
00F437BB 56 push esi 保存环境
00F8D827 BE 4B084800 mov esi,0048084B 计算地址
00FA55B3 8BB6 C005B900 mov esi,dword ptr ds:[esi+0xB905C0] 计算地址
010E8053 8DB6 3F68AD31 lea esi,dword ptr ds:[esi+0x31AD683F] 计算地址
00F44191 873424 xchg dword ptr ss:[esp],esi 真实函数地址给栈顶,还原环境
0057A761 C3 retn
第二行 pop esi 看来这个CALL 的push esi 是垃圾指令了,但是 发现这个 是retn 为什么不是,retn 04 呢?因为这个是 FF15 型调用,也就是 call [????????] 需要执行完后返回到call 下面继续执行
再找一个FF15型调用看看
|
|