1.PEID查壳
Upack 2.x - 3.x Heuristic Mode -> Dwing
2.载入OD,一上来就是一个大跳转,先F8跟一会
00401030 >- E9 56D40300 jmp 跑跑排行.0043E48B ; //程序入口点 00401035 42 inc edx ; 跑跑排行.<ModuleEntryPoint> 00401036 79 44 jns short 跑跑排行.0040107C 00401038 77 69 ja short 跑跑排行.004010A3 0040103A 6E outs dx,byte ptr es:[edi] 0040103B 67:40 inc eax ; kernel32.BaseThreadInitThunk 0040103D 0000 add byte ptr ds:[eax],al
3.来到这里,我们看到一个push,可以使用ESP定律,下硬件访问断点,然后shift+F9运行一下
0043E49B F3:AB rep stos dword ptr es:[edi] 0043E49D AD lods dword ptr ds:[esi] 0043E49E 50 push eax 0043E49F 97 xchg eax,edi ; //ESP定律 0043E4A0 51 push ecx 0043E4A1 58 pop eax 0043E4A2 8D5485 5C lea edx,dword ptr ss:[ebp+eax*4+0>
4.ESP落脚点,这里就是落脚点了,别忘了清除硬件断点,然后继续F8,记住基本原则,向上跳转的下一行F4
0043E60E /E3 1B jecxz short 跑跑排行.0043E62B ; //ESP落脚点 0043E610 |8A07 mov al,byte ptr ds:[edi] 0043E612 |47 inc edi 0043E613 |04 18 add al,0x18 0043E615 |3C 02 cmp al,0x2 0043E617 ^|73 F7 jnb short 跑跑排行.0043E610 ; //向上跳转的下一行F4 0043E619 |8B07 mov eax,dword ptr ds:[edi] 0043E61B |3C 01 cmp al,0x1
5.经常脱壳的朋友应该发现了,这里应该就是指向OEP的关键跳转了(因为第二列中间有个横杠),但是你会发现F8跳不过去,跳转没有实现,因为跳转的上一行”or eax,eax”这句话不解释了,需要一定的汇编基础,http://www.52pojie.cn/thread-420306-1-1.html可以在这个界面对照着查一下,也许你会懂,不懂我也没办法,然后我们需要做的是在这个跳转这行右键—断点—条件—输入”eax==0”—F9—F8,这样我们就实现了他的跳转
0043E631 46 inc esi 0043E632 AD lods dword ptr ds:[esi] 0043E633 09C0 or eax,eax 0043E635 >- 0F84 E3BDFCFF je 跑跑排行.0040A41E ; //指向OEP的跳转 0043E63B 56 push esi 0043E63C 97 xchg eax,edi 0043E63D FF53 FC call dword ptr ds:[ebx-0x4]
6.来到OEP,可以脱壳了
0040A41E 55 push ebp ; //来到OEP 0040A41F 8BEC mov ebp,esp 0040A421 6A FF push -0x1 0040A423 68 C8CB4000 push 跑跑排行.0040CBC8 0040A428 68 A4A54000 push 跑跑排行.0040A5A4 0040A42D 64:A1 00000000 mov eax,dword ptr fs:[0] 0040A433 50 push eax 0040A434 64:8925 0000000>mov dword ptr fs:[0],esp 0040A43B 83EC 68 sub esp,0x68
7.运行,查壳
运行OK,查壳:Microsoft Visual C++ v6.0
来源:https://www.cnblogs.com/JianXu/p/5158382.html