-
-
[原创]TMD加壳VC程序OEP修复_新手学习教材
-
发表于:
2011-4-4 11:48
27670
-
[原创]TMD加壳VC程序OEP修复_新手学习教材
标 题: 【原创】TMD加壳VC程序OEP修复_新手学习教材
作 者: knightsoft(ryo)
时 间: 2011-04-04,11:40:00
链 接: http://bbs.pediy.com/showthread.php?t=131835
已测环境 :
XP SP3
修改版 FLY OD + StrongOD 0.2.6.415
脚本 Themida - Winlicense 1.x - 2.x Imports Fixer Edition 1.1 by SnD
Themida - Winlicense 1.x - 2.x Imports Fixer Edition 1.1 by SnD.txt
TMD加壳VC程序OEP修复_新手学习教材.part1.rar
TMD加壳VC程序OEP修复_新手学习教材.part2.rar
TMD加壳VC程序OEP修复_新手学习教材.part3.rar
TMD加壳VC程序OEP修复_新手学习教材.part4.rar
TMD加壳VC程序OEP修复_新手学习教材.part5.rar
脚本运行完,下内存401000断点断在这里。
00406AE9 6A 02 push 2
00406AEB 5F pop edi
00406AEC 57 push edi
00406AED 90 nop
00406AEE E8 89E87F77 call msvcrt.__set_app_type
00406AF3 59 pop ecx
00406AF4 830D 48D54100 FF or dword ptr ds:[41D548],FFFFFFFF
00406AFB 830D 4CD54100 FF or dword ptr ds:[41D54C],FFFFFFFF
00406B02 E8 D4867E77 call msvcrt.__p__fmode
00406B07 90 nop
00406B08 8B0D 20BE4100 mov ecx,dword ptr ds:[41BE20]
00406B0E 8908 mov dword ptr ds:[eax],ecx
00406B10 E8 8F867E77 call msvcrt.__p__commode
00406B15 90 nop
00406B16 8B0D 1CBE4100 mov ecx,dword ptr ds:[41BE1C]
00406B1C 8908 mov dword ptr ds:[eax],ecx
00406B1E A1 20B34000 mov eax,dword ptr ds:[40B320]
00406B23 8B00 mov eax,dword ptr ds:[eax]
00406B25 A3 44D54100 mov dword ptr ds:[41D544],eax
00406B2A E8 D2010000 call GenuineV.00406D01
00406B2F 391D 903C4100 cmp dword ptr ds:[413C90],ebx
00406B35 75 0C jnz short GenuineV.00406B43
这里已经是OEP以后了,也就是说OEP已经被偷了代码了。这时候看下参考程序的OEP头代码:
004222E2 > 55 push ebp
004222E3 8BEC mov ebp,esp
004222E5 6A FF push -1
004222E7 68 E8974200 push SerPortM.004297E8
004222EC 68 46244200 push <jmp.&MSVCRT._except_handler3>
004222F1 64:A1 00000000 mov eax,dword ptr fs:[0]
004222F7 50 push eax
004222F8 64:8925 00000000 mov dword ptr fs:[0],esp
004222FF 83EC 68 sub esp,68
00422302 53 push ebx
00422303 56 push esi
00422304 57 push edi
00422305 8965 E8 mov dword ptr ss:[ebp-18],esp
00422308 33DB xor ebx,ebx
0042230A 895D FC mov dword ptr ss:[ebp-4],ebx
0042230D 6A 02 push 2
0042230F FF15 4C5A4200 call dword ptr ds:[<&MSVCRT.__set_a>; msvcrt.__set_app_type
00422315 59 pop ecx
00422316 830D 801A4300 FF or dword ptr ds:[431A80],FFFFFFFF
0042231D 830D 841A4300 FF or dword ptr ds:[431A84],FFFFFFFF
00422324 FF15 485A4200 call dword ptr ds:[<&MSVCRT.__p__fm>; msvcrt.__p__fmode
0042232A 8B0D 741A4300 mov ecx,dword ptr ds:[431A74]
00422330 8908 mov dword ptr ds:[eax],ecx
00422332 FF15 445A4200 call dword ptr ds:[<&MSVCRT.__p__co>; msvcrt.__p__commode
00422338 8B0D 701A4300 mov ecx,dword ptr ds:[431A70]
0042233E 8908 mov dword ptr ds:[eax],ecx
00422340 A1 405A4200 mov eax,dword ptr ds:[<&MSVCRT._adj>
00422345 8B00 mov eax,dword ptr ds:[eax]
00422347 A3 7C1A4300 mov dword ptr ds:[431A7C],eax
0042234C E8 28010000 call SerPortM.00422479
00422351 391D 58FF4200 cmp dword ptr ds:[42FF58],ebx
00422357 75 0C jnz short SerPortM.00422365
00422359 68 76244200 push SerPortM.00422476
0042235E FF15 3C5A4200 call dword ptr ds:[<&MSVCRT.__setus>; msvcrt.__setusermatherr
00422364 59 pop ecx
参考后,可以看出,程序被偷的代码是这一部分的:
push ebp
mov ebp,esp
push -1h
push 04297E8h //这是需要更改的部分,在堆栈中寻找,程序不同,值可能不同
push _except_handler3 //这是需要更改的部分,在堆栈中寻找,程序不同,值可能不同
mov eax,dword ptr fs:[0h]
push eax
mov dword ptr fs:[0h],esp
sub esp,68h
push ebx
push esi
push edi
mov dword ptr ss:[ebp-18h],esp
xor ebx,ebx
mov dword ptr ss:[ebp-4h],ebx
push 2h
这时候看堆栈和寄存器窗口
EAX 0012FFE0
ECX 51006A60
EDX 00000000
EBX 00000000
ESP 0012FF10
EBP 0012FF94
ESI 005066B7 GenuineV.005066B7
EDI FFFF4000
EIP 00406AE9 GenuineV.00406AE9
看EBP部分,这个地址在堆栈窗中跟随
0012FF7C 0012FF10
0012FF80 0012FF9C
0012FF84 0012FFE0 指针到下一个 SEH 记录
0012FF88 00406D02 SE 句柄
0012FF8C 0040C090 GenuineV.0040C090
0012FF90 00000000
0012FF94 00004CB1
0012FF98 61F2FC4D
12FF8C的内容就是参考程序中的代码 004222E7 68 E8974200 push SerPortM.004297E8
12FF88的内容就是参考程序中的代码 004222EC 68 46244200 push <jmp.&MSVCRT._except_handler3>
所以在修复OEP时需要用到这2个参数
修复OEP的代码写在FOEP的上面,也就是这里的上面
00406AEE E8 89E87F77 call msvcrt.__set_app_type
开出部分区域用NOP填充后补全OEP处被偷的代码
00406AC1 > 55 push ebp
00406AC2 8BEC mov ebp,esp
00406AC4 6A FF push -1
00406AC6 68 026D4000 push dumped_.00406D02
00406ACB 68 90C04000 push dumped_.0040C090
00406AD0 64:A1 00000000 mov eax,dword ptr fs:[0]
00406AD6 50 push eax
00406AD7 64:8925 00000000 mov dword ptr fs:[0],esp
00406ADE 83EC 68 sub esp,68
00406AE1 53 push ebx
00406AE2 56 push esi
00406AE3 57 push edi
00406AE4 8965 E8 mov dword ptr ss:[ebp-18],esp
00406AE7 33DB xor ebx,ebx
00406AE9 895D FC mov dword ptr ss:[ebp-4],ebx
00406AEC 6A 02 push 2
修复好OEP处的代码后,重新定位EIP到00406AC1,纠正镜象大小后DUMP程序
由于这个程序的IAT部分未加密,所以到FOEP的时候,数据窗里显示的就是IAT表
IAT表的开始地址为
0040B000 <>77DC7B60 advapi32.RegisterEventSourceA
IAT表的结束地址为
0040B3E8 <>77D29849 user32.EnableWindow
所以这就得到了IAT修复的函数部分,用软件修复DUMP处程序的IAT部分
至此,程序修复已经完成了,打开程序可以运行,脱壳完成。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!