00401500 >/$ 55 push ebp //OD载入
00401501 |. 8BEC mov ebp,esp //开始F8跟吧
00401503 |. 53 push ebx
00401504 |. 56 push esi
00401505 |. 57 push edi
00401506 |. BF 04304000 mov edi,甲壳2模?00403004
004015A1 |. 60 pushad
004015A2 |. 54 push esp
004015A3 |. FF35 28304000 push dword ptr ds:[0x403028] ; 甲壳2模?00403004
004015A9 |. FF15 20304000 call dword ptr ds:[0x403020] //这个CALL我们F7进入卡机代码
004015AF |. 5F pop edi
004015B0 |. 5E pop esi
004015B1 |. B8 01000000 mov eax,0x1
00E41020 55 push ebp //来到这里超卡啦
00E41021 8BEC mov ebp,esp //这里需要注意啦,这里会不停的申请空间
00E41023 83EC 60 sub esp,0x60 //我们需要跟进CALL去慢慢解读
00E41026 53 push ebx
00E41027 56 push esi
00E41028 57 push edi
00E41045 8945 F0 mov dword ptr ss:[ebp-0x10],eax //这里将申请来的内存空间传送
00E41048 837D F0 00 cmp dword ptr ss:[ebp-0x10],0x0 //比较是否申请的内存空间是否为0
00E4104C 75 1C jnz short 00E4106A //这里如果内存空间为0则向下执行
00E4104E 6A 00 push 0x0
00E41050 68 A050E400 push 0xE450A0 //如果内存空间为0就提示对话框后退出
00E41055 68 8C50E400 push 0xE4508C
00E4105A 6A 00 push 0x0
00E4105C FF15 3450E400 call dword ptr ds:[0xE45034] ; USER32.MessageBoxA
00E41062 6A 00 push 0x0
00E41064 FF15 1050E400 call dword ptr ds:[0xE45010] ; kernel32.ExitProcess
00E41077 50 push eax
00E41078 8B4D F0 mov ecx,dword ptr ss:[ebp-0x10]
00E4107B 51 push ecx
00E4107C E8 AF260000 call 00E43730 //这里我们跟进去,因为这里有一个解码步骤的
00E41081 83C4 0C add esp,0xC
00E41084 8945 EC mov dword ptr ss:[ebp-0x14],eax
00E41087 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
00E43730 55 push ebp //跟进CALL之后停在这里
00E43731 8BEC mov ebp,esp //继续F8跟吧
00E43733 83EC 58 sub esp,0x58
00E43736 53 push ebx
00E43737 56 push esi
00E437DE 8B45 F4 mov eax,dword ptr ss:[ebp-0xC] //这里开始对我们的内存空间做手脚
00E437E1 0345 E8 add eax,dword ptr ss:[ebp-0x18]
00E437E4 8B4D FC mov ecx,dword ptr ss:[ebp-0x4]
00E437E7 8A51 01 mov dl,byte ptr ds:[ecx+0x1]
00E437EA 8810 mov byte ptr ds:[eax],dl
00E437EC ^ EB DF jmp short 00E437CD //这里循环处理
00E43803 0345 10 add eax,dword ptr ss:[ebp+0x10]
00E43806 3945 FC cmp dword ptr ss:[ebp-0x4],eax
00E43809 75 08 jnz short 00E43813
00E4380B 8B45 F4 mov eax,dword ptr ss:[ebp-0xC]
00E4380E 2B45 08 sub eax,dword ptr ss:[ebp+0x8]
00E43811 EB 05 jmp short 00E43818 //以上我就不一一的说啦,就是申请一个临时的跳转空间而已
00E43813 ^ E9 2DFFFFFF jmp 00E43745 //这里继续循环处理
00E410D1 E8 FA060000 call 00E417D0 //这里F7继续跟进
00E410D6 8945 E8 mov dword ptr ss:[ebp-0x18],eax
00E410D9 68 7050E400 push 0xE45070 ; ASCII "COMCTL32.dll"
00E410DE FF15 0C50E400 call dword ptr ds:[0xE4500C] ; kernel32.LoadLibraryA
00E410E4 8945 E4 mov dword ptr ss:[ebp-0x1C],eax
00E417D0 55 push ebp //我们F7跟进后停在这里
00E417D1 8BEC mov ebp,esp //作者在一段一样是申请一个临时的过度空间
00E417D3 83EC 4C sub esp,0x4C
00E417D6 53 push ebx
00E417D7 56 push esi
00E417D8 57 push edi
00E4181F A3 0061E400 mov dword ptr ds:[0xE46100],eax //在这里将申请的临时空间传送
00E41824 A1 D063E400 mov eax,dword ptr ds:[0xE463D0] //在下面会对临时空间的代码进行修改
00E41829 A3 9C60E400 mov dword ptr ds:[0xE4609C],eax //但是这个不重要因为今天我们不去临时空间
00E4182E A1 D063E400 mov eax,dword ptr ds:[0xE463D0]
00E41833 A3 C063E400 mov dword ptr ds:[0xE463C0],eax
00E41838 8B45 10 mov eax,dword ptr ss:[ebp+0x10]
00E4183B A3 A060E400 mov dword ptr ds:[0xE460A0],eax
10E50000 9C pushfd //这里就是作者在内存空间申请修改后的代码
10E50001 60 pushad
10E50002 8925 9860E400 mov dword ptr ds:[0xE46098],esp
10E50008 A1 A460E400 mov eax,dword ptr ds:[0xE460A4]
10E5000D A3 6463E400 mov dword ptr ds:[0xE46364],eax
10E50012 8B25 6463E400 mov esp,dword ptr ds:[0xE46364]
10E50018 8BEC mov ebp,esp
10E5001A B8 9C60E400 mov eax,0xE4609C
10E5001F C700 00000000 mov dword ptr ds:[eax],0x0
10E50025 B8 C063E400 mov eax,0xE463C0
10E5002A C700 00000000 mov dword ptr ds:[eax],0x0 //从这里看因为上个版本我跟过这次主程序有所不同但是可以判断
10E50030 B8 6027E400 mov eax,0xE42760 //我们可以得出结论就是作者很快就会解码程序啦
10E50035 FFE0 jmp eax //这里在上一次我搞的那个保护框程序那里是跳向程序代码出现的地址
00E41104 8B55 0C mov edx,dword ptr ss:[ebp+0xC]
00E41107 52 push edx
00E41108 E8 53330000 call 00E44460 //这个CALL我们F7跟进去瞧瞧
00E4110D 5F pop edi
00E4110E 5E pop esi
00E44460 55 push ebp //这里继续
00E44461 8BEC mov ebp,esp
00E44463 83EC 50 sub esp,0x50
00E44466 53 push ebx ; 甲壳2模?00404180
00E44467 56 push esi
00E44468 57 push edi
00E44469 8B45 10 mov eax,dword ptr ss:[ebp+0x10]
00E4446C 50 push eax
00E4446D E8 4EFEFFFF call 00E442C0 //这里F7跟进去
00E44472 8945 FC mov dword ptr ss:[ebp-0x4],eax
00E44475 8D45 F8 lea eax,dword ptr ss:[ebp-0x8]
00E442C0 55 push ebp //跟进CALL来到这里
00E442C1 8BEC mov ebp,esp
00E442C3 81EC 88000000 sub esp,0x88
00E442C9 53 push ebx
00E442CA 56 push esi
00E442CB 57 push edi
00E442CC 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
00E442CF 8B48 14 mov ecx,dword ptr ds:[eax+0x14]
00E442D2 81C1 78030000 add ecx,0x378
00E442D8 894D EC mov dword ptr ss:[ebp-0x14],ecx
00E442DB 6A 40 push 0x40
00E442DD 68 00100000 push 0x1000
00E442E2 8B45 EC mov eax,dword ptr ss:[ebp-0x14]
00E442E5 50 push eax
00E442E6 6A 00 push 0x0
00E442E8 FF15 1450E400 call dword ptr ds:[0xE45014] ; kernel32.VirtualAlloc
00E442EE 8945 E8 mov dword ptr ss:[ebp-0x18],eax //这里申请出来的内存空间就是放我们程序代码的啦
00E442F1 837D E8 00 cmp dword ptr ss:[ebp-0x18],0x0
00E442F5 75 1C jnz short 00E44313
00E44313 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] //这里将我们的程序完整的放到了临时空间
00E44316 8945 F0 mov dword ptr ss:[ebp-0x10],eax //我这里传送的值是10E80000
00E44319 8B45 08 mov eax,dword ptr ss:[ebp+0x8]
00E4431C 8B48 18 mov ecx,dword ptr ds:[eax+0x18]
00E4432A 51 push ecx
00E4432B E8 00F4FFFF call 00E43730 //这CALL里将我们的程序解码,具体解码步骤也是赋值那种形式
00E44330 83C4 0C add esp,0xC //里面的指令和申请内存空间修改的临时过度跳转地址修改方法是一样的
00E44333 8945 E4 mov dword ptr ss:[ebp-0x1C],eax //这里就是我们最佳的DUMP时机,我们按照下面图所示转存
00E44336 8B45 08 mov eax,dword ptr ss:[ebp+0x8] //我这里的临时转存的空间就是10E80000
00E44339 8B4D E4 mov ecx,dword ptr ss:[ebp-0x1C]
00E4433C 3B48 14 cmp ecx,dword ptr ds:[eax+0x14]
第一步
第二步
第三步
第四步
第四步就是把我们转存出来的程序的拓展名Region10E80000-10F79000.dmp改成XXXX.EXE就达到了完美脱壳啦
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: