1 查看壳程序信息
使用ExeInfoPe
2 用OD找OEP
- 拖进OD
因为vc6.0特征的第一个调用的是GetVersion(),给GetVersion()下 硬件断点
在OD看内存布局,一般.rdata的最前面是放的IAT,而且OD数据窗口默认就是.rdata的起始位置。
也可以点一个call /jmp [];看一下来找IAT表
对那个地方下一个硬件写入断点 --DWORD,即当前面的壳程序在修改的时候就能段下来找到壳的加密算法的地方
- 这里只是为了快速脱壳所以下硬件断点,快速定位加密修改IAT的地方,但后面部分将对整个壳详细分析:。
3 对壳详细分析
- 发现 这就是解密IAT代码。
;1.解密程序第一句:
0012FF30 E8 CALL 0012FF36
;--------------------------------
;2.跳转到 0012ff36后
0012FF36 POP EAX;其实这儿主要是为了弹出前面的返回地址,好自己push返回地址
0012FF37 EB JMP SHORT 0012FF3A
;----------------------------------
;3.简单pop EAX 后又添砖0012ff3a:
0012FF3A B8 MOV EAX,0x????;.结合后面的代码,发现是取得的代码0x15异或加密后的代码
0012FF3F EB JMP SHORT 0012FF42
;将EAX 赋值为0x400 ,然后又跳转
;----------------------------------
;.跳转到 0012FF42:
0012FF42 XOR EAX,0x15151515;9.这样就迎刃而解了,这儿是解密。
0012FF47 EB JMP SHORT 0012FF4A
;将EAX和0x 15151515 异或计算加密后 继续跳转 0012FF4A
;-------------------------------------
;.跳转到 0012ff4a:
0012FF4A PUSH EAX;10.把解密的真正地址作为返回地址
0012FF4B EB JMP SHORT 0012FF4F
;push了现在的 40000 XOR 0X15151515后的值作为返回地址,又跳转
;--------------------------------------
;.再结合后面一点的代码:
004385B9 FF15 CC924300 CALL DWORD PTR DS:[<GetProcAddress>]; kernel32.GetProcAddress
004385BF 6A PUSH 0x40
004385C1 PUSH 0x3000
004385C6 6A PUSH 0x20
004385C8 XOR EAX,0x15151515
004385CD 6A PUSH 0x0
004385CF DB MOV DWORD PTR SS:[EBP-0x25],EAX ; 7.放入地址 -- 0x25刚好是用来存放地址的
;------------------------------------------------------------
综述:
4 修正前面分析的加密算法
- 这时候我们只需要保存正确的函数地址值到IAT,那么这个程序就能脱掉了。