手动脱加密壳(IAT哈希)

1.找载入od
手动脱加密壳(IAT哈希)

发现esp定律就可以搞定
找OEP
手动脱加密壳(IAT哈希)
看到了一个函数但od没有注释 可能加密
手动脱加密壳(IAT哈希)
先去函数地址下断
手动脱加密壳(IAT哈希)
手动脱加密壳(IAT哈希)
函数出来了 说明oep没找错
手动脱加密壳(IAT哈希)
到这里那就去IAT下硬件写入断点
手动脱加密壳(IAT哈希)
重新运行程序下断成功
手动脱加密壳(IAT哈希)
这里就是IAT 填充函数了
这里先讲下加密壳原理
1。先遍历要加密的程序的IAT然后把一个个函数的名称计算下hash 把算出来的hash保存起来
2。加密IAT
3.运行程序时没有壳的情况下一般是链接器帮我们填充IAT 有壳程序 就是壳来做了
4.因此一定会做的一件事情是遍历 那些用到的模块 然后一个个算函数名的hash如果相等 说明是这个 程序要用到的api
5.找了api 先把api地址保存到一个地方
6.然后把加密后的地址填充IAT
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

到了这里就只能f7一直跟 按着f7不放会发现一些 函数名称
![](http://i2.51cto.com/images/blog/201805/26/2735ac7b81403f526933fe81f55bb562.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

同时它会一个个的字符取出来 (很定是一个字符串拷贝 那就有什么用呢)可能在算hash
断到跳转那也就是说明字符串取完了
手动脱加密壳(IAT哈希)
看看它要干嘛
手动脱加密壳(IAT哈希)
继续f7 发现要比对hash
手动脱加密壳(IAT哈希)
手动脱加密壳(IAT哈希)
到这里思路也就清析了 同时推断正确
那就在他相等的地方下断 其它断点可以去掉
手动脱加密壳(IAT哈希)
f9 下断成功
手动脱加密壳(IAT哈希)
到了这里也就是说找到了一个要填充的api 离最后不远了
盯着寄存器 慢慢看
手动脱加密壳(IAT哈希)
加模块基址了 说明很快要填充了
手动脱加密壳(IAT哈希)
单步 果然是一个api
手动脱加密壳(IAT哈希)
续断盯着寄存器
又给了edx
手动脱加密壳(IAT哈希)
手动脱加密壳(IAT哈希)
又入栈了
手动脱加密壳(IAT哈希)
手动脱加密壳(IAT哈希)
到拷贝了
手动脱加密壳(IAT哈希)
出栈了
手动脱加密壳(IAT哈希)
断续f7终于回到了起点
手动脱加密壳(IAT哈希)
到了这里 就要推出它真的api地址放哪
esc回退 写下来
去掉花指令

002E0502    8B4D A8         MOV ECX,DWORD PTR SS:[EBP-0x58]

edx 保存真正api地址
002E14DC    895401 FC       MOV DWORD PTR DS:[ECX+EAX-0x4],EDX                 ; 04.00475048

002E0D77    8B57 04         MOV EDX,DWORD PTR DS:[EDI+0x4]

002E0949    0355 E4         ADD EDX,DWORD PTR SS:[EBP-0x1C]                    ; 04.00400000

002E0EE2    8B45 A8         MOV EAX,DWORD PTR SS:[EBP-0x58]
eax保存 加密的地址 放在iat中
002E0895    8902            MOV DWORD PTR DS:[EDX],EAX     

这里就用了一个巧合 用到ecx

MOV DWORD PTR DS:[ECX+EAX-0x4],EDX 修改成 MOV ECX,EDX
MOV EAX,DWORD PTR SS:[EBP-0x58] 修改成 MOV EAX, ECX
重新运行程序
这里有点坑 可能修改有先后(因为我用的是查找opcode )
在我这里先修改这个
手动脱加密壳(IAT哈希)
再修改这个
手动脱加密壳(IAT哈希)
修复IAT
手动脱加密壳(IAT哈希)
正常运行
笔记

 OEP  
0047148B    55              PUSH EBP
0047148C    8BEC            MOV EBP,ESP
0047148E    6A FF           PUSH -0x1
00471490    68 28514700     PUSH 04.00475128
00471495    68 58214700     PUSH 04.00472158
0047149A    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]
004714A0    50              PUSH EAX                                           ; 04.0047148B
004714A1    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
004714A8    83EC 58         SUB ESP,0x58
004714AB    53              PUSH EBX
004714AC    56              PUSH ESI
004714AD    57              PUSH EDI
004714AE    8965 E8         MOV DWORD PTR SS:[EBP-0x18],ESP
004714B1    FF15 80504700   CALL DWORD PTR DS:[0x475080]
004714B7    33D2            XOR EDX,EDX                                        ; 04.<ModuleEntryPoint>

写入iat
002E14D8    8D6424 04       LEA ESP,DWORD PTR SS:[ESP+0x4]
002E14DC    895401 FC       MOV DWORD PTR DS:[ECX+EAX-0x4],EDX                 ; kernel32.HeapCreate
002E14E0  ^ E9 15F2FFFF     JMP 002E06FA
002E14E5    FF75 F4         PUSH DWORD PTR SS:[EBP-0xC]
002E14E8  ^ E9 54F7FFFF     JMP 002E0C41
002E14ED    031E            ADD EBX,DWORD PTR DS:[ESI]
002E14EF    E8 61FAFFFF     CALL 002E0F55
002E14F4    5A              POP EDX                                            ; kernel32.HeapCreate
002E14F5  ^ E9 C0F8FFFF     JMP 002E0DBA
002E14FA    837D AC 01      CMP DWORD PTR SS:[EBP-0x54],0x1
002E14FE  ^ E9 0AFAFFFF     JMP 002E0F0D
002E1503    8D6424 04       LEA ESP,DWORD PTR SS:[ESP+0x4]
002E1507    59              POP ECX

002E0502    8B4D A8         MOV ECX,DWORD PTR SS:[EBP-0x58]

002E14DC    895401 FC       MOV DWORD PTR DS:[ECX+EAX-0x4],EDX                 ; 04.00475048

002E0D77    8B57 04         MOV EDX,DWORD PTR DS:[EDI+0x4]

002E0949    0355 E4         ADD EDX,DWORD PTR SS:[EBP-0x1C]                    ; 04.00400000

002E0EE2    8B45 A8         MOV EAX,DWORD PTR SS:[EBP-0x58]

002E0895    8902            MOV DWORD PTR DS:[EDX],EAX                         ; 填充IAT

猜你喜欢

转载自blog.51cto.com/haidragon/2120607