声明:
1.只为纪录自己成长历程,高手勿喷
2.您的热心是新手持续发帖的动力
1.PEID查壳
Upack 2.x - 3.x Heuristic Mode -> Dwing
2.载入OD,一上来就是一个大跳转,先F8跟一会
[Asm] 纯文本查看 复制代码 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运行一下
[Asm] 纯文本查看 复制代码 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
[Asm] 纯文本查看 复制代码 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,这样我们就实现了他的跳转
[Asm] 纯文本查看 复制代码 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,可以脱壳了
[Asm] 纯文本查看 复制代码 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
|