==========================================================================
对1.00D脱壳手记!――整理
-by mening
==========================================================================
第一寻找OEP
---------------------------------------------------------------------------
//OD
00401000 m> 68 0140CC07 push main.07CC4001
00401005 E8 01000000 call main.0040100B
0040100A C3 retn
0040100B C3 retn
---------------------------------------------------------------------------
//26次异常后!在25次异常时F8就可以跟到OEP!这里是我的方法!
或者是CTRL+M打开内存在4010000下内存访问断点同样能到OEP这里补充一下!看你喜欢什么了。。。
0C6639EC 3100 xor dword ptr ds:[eax],eax //从这里LORDPE然后重建PE头!才可以要不120MB很头大的。
0C6639EE 64:8F05 00000000 pop dword ptr fs:[0]
0C6639F5 58 pop eax
0C6639F6 833D B07E660C 00 cmp dword ptr ds:[C667EB0],0
0C6639FD 74 14 je short 0C663A13
0C6639FF 6A 0C push 0C
0C663A01 B9 B07E660C mov ecx,0C667EB0
0C663A06 8D45 F8 lea eax,dword ptr ss:[ebp-8]
0C663A09 BA 04000000 mov edx,4
0C663A0E E8 2DD1FFFF call 0C660B40
0C663A13 FF75 FC push dword ptr ss:[ebp-4]
0C663A16 FF75 F8 push dword ptr ss:[ebp-8]
0C663A19 8B45 F4 mov eax,dword ptr ss:[ebp-C]
0C663A1C 8338 00 cmp dword ptr ds:[eax],0
0C663A1F 74 02 je short 0C663A23
0C663A21 FF30 push dword ptr ds:[eax]
0C663A23 FF75 F0 push dword ptr ss:[ebp-10]
0C663A26 FF75 EC push dword ptr ss:[ebp-14]
0C663A29 C3 retn //F2下断 SHIFT+F9运行到这里 F2取消断点
---------------------------------------------------------------------------
此时,堆载中的东东为:
0012FF5C 0C67A6AC
0012FF60 00400000 main.00400000
0012FF64 BEC6080D
0012FF68 0012FFA4 //ESP定律0012FFA4+C=12FF68
0012FF6C 0C650000
0012FF70 0C630000
0012FF74 0C664138
0012FF78 0C670E88
0012FF7C 0C67A6AC
0012FF80 00400000 main.00400000
此时在命令处下断 HR 0012FF68
SHIFT+F9运行!
0C67A32C /EB 44 jmp short 0C67A372 //F8跟入
0C67A32E |EB 01 jmp short 0C67A331
0C67A330 |9A 51579CFC BF00 call far 00BF:FC9C5751
0C67A337 |0000 add byte ptr ds:[eax],al
0C67A339 |00B9 00000000 add byte ptr ds:[ecx],bh
0C67A33F |F3:AA rep stos byte ptr es:[edi]
0C67A341 |9D popfd
0C67A342 |5F pop edi
0C67A343 |59 pop ecx
0C67A344 |C3 retn
//飞向光明之顶
0C67A372 03C3 add eax,ebx
0C67A374 BB 4F010000 mov ebx,14F
0C67A379 0BDB or ebx,ebx
0C67A37B 75 07 jnz short 0C67A384
0C67A37D 894424 1C mov dword ptr ss:[esp+1C],eax
0C67A381 61 popad
0C67A382 50 push eax
0C67A383 C3 retn
0C67A384 E8 00000000 call 0C67A389
0C67A389 5D pop ebp
0C67A38A 81ED 4DE14B00 sub ebp,4BE14D
//按F8走
006366F8 E8 797B0000 call main.0063E276 //F8来这里!!
006366FD 8945 9C mov dword ptr ss:[ebp-64],eax
00636700 F645 D0 01 test byte ptr ss:[ebp-30],1
00636704 74 06 je short main.0063670C
00636706 0FB745 D4 movzx eax,word ptr ss:[ebp-2C]
0063670A EB 03 jmp short main.0063670F
//往上看哦!
0063663D FF62 14 jmp dword ptr ds:[edx+14]
00636640 C3 retn
00636641 0000 add byte ptr ds:[eax],al //这个是真的!
00636643 0000 add byte ptr ds:[eax],al
00636645 0000 add byte ptr ds:[eax],al
00636647 0000 add byte ptr ds:[eax],al
00636649 0000 add byte ptr ds:[eax],al
0063664B 0000 add byte ptr ds:[eax],al
0063664D 0000 add byte ptr ds:[eax],al
0063664F 0000 add byte ptr ds:[eax],al
00636651 0000 add byte ptr ds:[eax],al
00636653 0000 add byte ptr ds:[eax],al
00636655 0000 add byte ptr ds:[eax],al
00636657 0000 add byte ptr ds:[eax],al
00636659 0000 add byte ptr ds:[eax],al
0063665B 0000 add byte ptr ds:[eax],al
0063665D 0000 add byte ptr ds:[eax],al
0063665F 0000 add byte ptr ds:[eax],al
00636661 0000 add byte ptr ds:[eax],al
00636663 0000 add byte ptr ds:[eax],al
00636665 0000 add byte ptr ds:[eax],al
00636667 FF15 FCB06400 call dword ptr ds:[64B0FC] //看见这个OEP了吗?这个是假的!曾经好几次看到就因为疏忽没有减-00400000因此,被误为错误!!
0063666D 33D2 xor edx,edx
0063666F 8AD4 mov dl,ah
00636671 8915 A8F4CB07 mov dword ptr ds:[7CBF4A8],edx
-------------------------------------------------------------------------------------
二、现在我们修复
不用多说了只要用IMPORTREC就可以了,恩记得修复指针哦!可以用右键里的插件!
最后了用WINHEX打开!查找
E8FF15FCB0640033D28AD48915A8F4CB078BC881E1FF
在这个前面将一串0改为以下的内容建立文件头!
558BEC6AFF680004650068D0A1630064A100000000506489250000000083EC585356578965E8
现在可以点击运行MAIN了而且大小是2.50MB恩我在官服没出现广告,也没什么掉线!
希望大家测试一下!
基本上在官方正常!
0C67A06C 896C24 00 mov dword ptr ss:[esp],ebp*
0C67A070 8BEC mov ebp,esp*
0C67A072 6A FF push -1*
0C67A074 68 00046500 push 650400*
0C67A079 68 D0A16300 push 63A1D0*
0C67A07E 64:A1 00000000 mov eax,dword ptr fs:[0]*
0C67A0A6 894424 00 mov dword ptr ss:[esp],eax*
0C67A0AA 64:8925 0000000>mov dword ptr fs:[0],esp*
0C67A0B1 83EC 58 sub esp,58*
0C67A0D6 895C24 00 mov dword ptr ss:[esp],ebx
0C67A0FC 897424 00 mov dword ptr ss:[esp],esi
0C67A122 897C24 00 mov dword ptr ss:[esp],edi ; main.005616A8
0C67A126 8965 E8 mov dword ptr ss:[ebp-18],esp*
//以上是我找到的现在我们将部分代码还原化!
原码:
PUSH EBP *
0C4CA688 8BEC MOV EBP,ESP
0C4CA68A 6A FF PUSH -1
0C4CA68C 68 00046500 PUSH 650400 //这个是破解文件的,
0C4CA691 68 D0A16300 PUSH 63A1D0 //看具体情况!!
MOV EAX,DWORD PTR FS:[0] *
PUSH EAX *
MOV DWORD PTR FS:[0],ESP *
SUB ESP,58 *
PUSH EBX *
PUSH ESI *
push edi*
MOV DWORD PTR SS:[EBP-18],ESP *
//不添这个程序无法正常运行!这个是PE头!
这个就是我们要改的文件头如果你改PUSH EBP为mov dword ptr ss:[esp],ebp这个也可以是等效的。
[课程]Android-CTF解题方法汇总!