1.载入 OD
发现esp定律就可以搞定
找OEP
看到了一个函数但od没有注释 可能加密
先去函数地址下断
函数出来了 说明oep没找错
到这里那就去IAT下硬件写入断点
重新运行程序下断成功
这里就是IAT 填充函数了
这里先讲下加密壳原理
1。先遍历要加密的程序的IAT然后把一个个函数的名称计算下hash 把算出来的hash保存起来
2。加密IAT
3.运行程序时没有壳的情况下一般是加载器帮我们填充IAT 有壳程序 就是壳来做了
4.因此一定会做的一件事情是遍历 那些用到的模块 然后一个个算函数名的hash如果相等 说明是这个 程序要用到的api
5.找了api 先把api地址保存到一个地方
6.然后把加密后的地址填充IAT
/
到了这里就只能f7一直跟 按着f7不放会发现一些 函数名称
![](https://s1.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
断到跳转那也就是说明字符串取完了
看看它要干嘛
继续f7 发现要比对hash
到这里思路也就清析了 同时推断正确
那就在他相等的地方下断 其它断点可以去掉
f9 下断成功
到了这里也就是说找到了一个要填充的api 离最后不远了
盯着寄存器 慢慢看
加模块基址了 说明很快要填充了
单步 果然是一个api
续断盯着寄存器
又给了edx
又入栈了
到拷贝了 这里就步过了
出栈了
断续f7终于回到了起点
到了这里 就要推出它真的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
正常运行
笔记
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
转载于:https://blog.51cto.com/haidragon/2120607