- UID
- 36176
注册时间2007-11-2
阅读权限40
最后登录1970-1-1
独步武林
TA的每日心情 | 慵懒 2018-4-24 11:02 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
----------------------------------------------------------------
[ 破文标题 ] PECompact 2.X 脱壳后输入表修复
[ 破文作者 ] zgmap
[ 破解工具 ] OD,IR,LordPE
[ 破解平台 ] Windows XP SP3
[ 软件名称 ] Total Video Converter 3.21 汉化版
[ 软件大小 ] RAR压缩11.3 MB
[ 原版下载 ] http://down.huacolor.com/down/zgmap/totalvideoconverter.rar
[ 保护方式 ] PECompact 2.X
[ 软件简介 ] 视频转换工具
[ 破解声明 ] 菜鸟学习阶段中,脱壳接触时间不长,也算不上脱文...
[ 破解过程 ]------------------------------------------------
这个软件的主程序主要是用了PECompact的插件来进行保护,一般的脱壳方式是不适用的,下面我将采用两种方法来进行脱壳处理:
第一种方法是寻找magic jump,避开IAT加密:
OD设置忽略所有异常,载入程序:
00401000 > B8 38AB7D00 MOV EAX,tvc.007DAB38
00401005 50 PUSH EAX
00401006 64:FF35 0000000>PUSH DWORD PTR FS:[0]
0040100D 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00401014 33C0 XOR EAX,EAX
00401016 8908 MOV DWORD PTR DS:[EAX],ECX
00401018 50 PUSH EAX
。。。。。。。。。。
bp VirtualFree下断,F9一次,断在:
7C809B84 > 8BFF MOV EDI,EDI
7C809B86 55 PUSH EBP
7C809B87 8BEC MOV EBP,ESP
7C809B89 FF75 10 PUSH DWORD PTR SS:[EBP+10]
7C809B8C FF75 0C PUSH DWORD PTR SS:[EBP+C]
7C809B8F FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C809B92 6A FF PUSH -1
7C809B94 E8 09000000 CALL kernel32.VirtualFreeEx
7C809B99 5D POP EBP
7C809B9A C2 0C00 RETN 0C
。。。。。。。。。。
不取消断点,alt+F9返回:
003A0A91 5F POP EDI ; 00D288EE
003A0A92 8BC6 MOV EAX,ESI
003A0A94 5E POP ESI
003A0A95 5D POP EBP
003A0A96 5B POP EBX
003A0A97 83C4 10 ADD ESP,10
003A0A9A C2 0C00 RETN 0C
。。。。。。。。。。
Ctrl+B查找二进制字符串:89 02
来到:
003A143D 50 PUSH EAX
003A143E FF75 FC PUSH DWORD PTR SS:[EBP-4]
003A1441 FF93 4D1F0010 CALL DWORD PTR DS:[EBX+10001F4D] ;magic call,F2断下,F9一次运行断在此处,取消断点后F7进入
003A1447 5A POP EDX
003A1448 85C0 TEST EAX,EAX
003A144A ^ 0F84 6FFFFFFF JE 003A13BF
003A1450 8906 MOV DWORD PTR DS:[ESI],EAX
003A1452 8902 MOV DWORD PTR DS:[EDX],EAX
003A1454 83C2 04 ADD EDX,4
003A1457 83C6 04 ADD ESI,4
003A145A ^ EB AC JMP SHORT 003A1408
003A145C 33C0 XOR EAX,EAX
003A145E 5E POP ESI
003A145F 5F POP EDI
003A1460 5B POP EBX
003A1461 C9 LEAVE
003A1462 C2 1000 RETN 10
。。。。。。。。。。
F7进入后,来到:
003A00F1 55 PUSH EBP
003A00F2 8BEC MOV EBP,ESP
003A00F4 83C4 FC ADD ESP,-4
003A00F7 53 PUSH EBX
003A00F8 57 PUSH EDI
003A00F9 56 PUSH ESI
003A00FA E8 00000000 CALL 003A00FF
003A00FF 5B POP EBX
003A0100 81EB 0C119400 SUB EBX,94110C
003A0106 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
003A0109 40 INC EAX
003A010A 75 18 JNZ SHORT 003A0124
003A010C 8B75 0C MOV ESI,DWORD PTR SS:[EBP+C]
003A010F 81FE FFFF0000 CMP ESI,0FFFF
003A0115 76 0D JBE SHORT 003A0124
003A0117 8D83 A0119400 LEA EAX,DWORD PTR DS:[EBX+9411A0]
003A011D 5E POP ESI
003A011E 5F POP EDI
003A011F 5B POP EBX
003A0120 C9 LEAVE
003A0121 C2 0C00 RETN 0C
003A0124 FF75 10 PUSH DWORD PTR SS:[EBP+10]
003A0127 FF75 0C PUSH DWORD PTR SS:[EBP+C]
003A012A FF75 08 PUSH DWORD PTR SS:[EBP+8]
003A012D FF93 29109400 CALL DWORD PTR DS:[EBX+941029]
003A0133 3B83 41109400 CMP EAX,DWORD PTR DS:[EBX+941041] ;对函数GetProAddress进行加密
003A0139 75 06 JNZ SHORT 003A0141 ;magic jump 改为jmp
003A013B 8D83 55119400 LEA EAX,DWORD PTR DS:[EBX+941155]
003A0141 5E POP ESI
003A0142 5F POP EDI
003A0143 5B POP EBX
003A0144 C9 LEAVE
003A0145 C2 0C00 RETN 0C
。。。。。。。。。。
Ctrl+B查找二进制字符串75 06,注意要勾选整个块:
003A0178 FF93 2D109400 CALL DWORD PTR DS:[EBX+94102D]
003A017E 3B83 41109400 CMP EAX,DWORD PTR DS:[EBX+941041]
003A0184 75 06 JNZ SHORT 003A018C ;这里改为jmp
003A0186 8D83 55119400 LEA EAX,DWORD PTR DS:[EBX+941155]
003A018C 5E POP ESI
003A018D 5F POP EDI
003A018E 5B POP EBX
003A018F C9 LEAVE
003A0190 C2 0400 RETN 4
。。。。。。。。。。
两处改完后F9运行,停在:
7C809B84 > 8BFF MOV EDI,EDI ; tvc.00400000
7C809B86 55 PUSH EBP
7C809B87 8BEC MOV EBP,ESP
7C809B89 FF75 10 PUSH DWORD PTR SS:[EBP+10]
7C809B8C FF75 0C PUSH DWORD PTR SS:[EBP+C]
7C809B8F FF75 08 PUSH DWORD PTR SS:[EBP+8]
7C809B92 6A FF PUSH -1
7C809B94 E8 09000000 CALL kernel32.VirtualFreeEx
7C809B99 5D POP EBP
7C809B9A C2 0C00 RETN 0C
。。。。。。。。。。
取消断点,alt+F9返回:
003A0DAF 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C] ;F8单步走
003A0DB2 03C7 ADD EAX,EDI
003A0DB4 5D POP EBP
003A0DB5 5E POP ESI
003A0DB6 5F POP EDI
003A0DB7 5B POP EBX
003A0DB8 C3 RETN
。。。。。。。。。。
007DABD8 8985 3F130010 MOV DWORD PTR SS:[EBP+1000133F],EAX ; tvc.00491AEE
007DABDE 8BF0 MOV ESI,EAX
007DABE0 8B4B 14 MOV ECX,DWORD PTR DS:[EBX+14]
007DABE3 5A POP EDX
007DABE4 EB 0C JMP SHORT tvc.007DABF2
007DABE6 03CA ADD ECX,EDX
007DABE8 68 00800000 PUSH 8000
007DABED 6A 00 PUSH 0
007DABEF 57 PUSH EDI
007DABF0 FF11 CALL DWORD PTR DS:[ECX]
007DABF2 8BC6 MOV EAX,ESI
007DABF4 5A POP EDX
007DABF5 5E POP ESI
007DABF6 5F POP EDI
007DABF7 59 POP ECX
007DABF8 5B POP EBX
007DABF9 5D POP EBP
007DABFA FFE0 JMP EAX ;跳向OEP
。。。。。。。。。。
00491AEE 55 PUSH EBP
00491AEF 8BEC MOV EBP,ESP
00491AF1 6A FF PUSH -1
00491AF3 68 E8A84E00 PUSH tvc.004EA8E8
00491AF8 68 E81A4900 PUSH tvc.00491AE8 ; JMP 到 msvcrt._except_handler3
00491AFD 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
00491B03 50 PUSH EAX
00491B04 64:8925 0000000>MOV DWORD PTR FS:[0],ESP
00491B0B 83EC 68 SUB ESP,68
00491B0E 53 PUSH EBX
。。。。。。。。。。
剩下的就是用LordPE完整dump程序,IR修复,函数全部有效,修复后的程序可以运行
第二种方法是采用普通脱壳方式来寻找OEP,主要讲一下如何找回无效函数:
依然是OD设置忽略所有异常,载入程序,我们可以用ESP定律或者push 8000等方法都能来到OEP,这些我就不展开讲了
到了OEP以后,LordPE dump,IR修复,发现有一个无效函数, 1、3级追踪是回不来的,cut掉以后发现程序无法运行,因为你把有用的函数给干掉了,只好手动修复,先看一下我们那个无效函数是什么:
加基址后应该是4CA198,这个函数该如何去找?我们可以想个办法,先看一下有效的函数是如何出来的
OD从新载入程序,先以这个无效函数的下面那个函数为例(也就是4CA19C)
命令行输入:dd 4CA19C
然后在数据窗口中右键下内存访问断点,F9运行,第13次后来到(要注意每次F9以后等待的时间长短不一,有时会有一点点卡):
003A1450 8906 MOV DWORD PTR DS:[ESI],EAX ; kernel32.LoadLibraryA
003A1452 8902 MOV DWORD PTR DS:[EDX],EAX
003A1454 83C2 04 ADD EDX,4
003A1457 83C6 04 ADD ESI,4
003A145A ^ EB AC JMP SHORT 003A1408
003A145C 33C0 XOR EAX,EAX
003A145E 5E POP ESI
003A145F 5F POP EDI
003A1460 5B POP EBX
003A1461 C9 LEAVE
003A1462 C2 1000 RETN 10
。。。。。。。。。。
这时注意观察一下反汇编窗口和寄存器窗口,可以看出4CA19C的函数为kernel32.LoadLibraryA:
。。。。。。。。。。
我们用同样的方式去找4CA198这个无效函数,到了这里以后却显示不出来,原因就是4CA198这个函数经过magic call以后已经被加密
接着上面到达的地址003A1450,我们F8单步走
003A1450 8906 MOV DWORD PTR DS:[ESI],EAX ;F8单步
003A1452 8902 MOV DWORD PTR DS:[EDX],EAX
003A1454 83C2 04 ADD EDX,4
003A1457 83C6 04 ADD ESI,4
003A145A ^ EB AC JMP SHORT 003A1408 ;这里回跳
。。。。。。。。。。
来到:
003A1408 C783 C21A0010 00000000 MOV DWORD PTR DS:[EBX+10001AC2],0 ;继续F8向下看
003A1412 8B02 MOV EAX,DWORD PTR DS:[EDX]
003A1414 85C0 TEST EAX,EAX
003A1416 74 44 JE SHORT 003A145C
003A1418 52 PUSH EDX
003A1419 8983 C21A0010 MOV DWORD PTR DS:[EBX+10001AC2],EAX
003A141F A9 00000080 TEST EAX,80000000
003A1424 74 09 JE SHORT 003A142F
003A1426 25 FFFFFF7F AND EAX,7FFFFFFF
003A142B 6A 00 PUSH 0
003A142D EB 0E JMP SHORT 003A143D
003A142F 8B4D 08 MOV ECX,DWORD PTR SS:[EBP+8]
003A1432 0341 08 ADD EAX,DWORD PTR DS:[ECX+8]
003A1435 33C9 XOR ECX,ECX
003A1437 66:8B08 MOV CX,WORD PTR DS:[EAX]
003A143A 51 PUSH ECX
003A143B 40 INC EAX
003A143C 40 INC EAX
003A143D 50 PUSH EAX ;这里寄存器中出现4CA19C下面那个函数(也就是4CA1A0)的正确API
003A143E FF75 FC PUSH DWORD PTR SS:[EBP-4]
003A1441 FF93 4D1F0010 CALL DWORD PTR DS:[EBX+10001F4D]
003A1447 5A POP EDX
003A1448 85C0 TEST EAX,EAX
003A144A ^ 0F84 6FFFFFFF JE 003A13BF
。。。。。。。。。。
如此循环,到了003A143D以后显示出正确的API,这样的话我们就可以通过dd 4CA194(也就是无效函数上面的函数地址)下内存访问断点来找出4CA198真正的函数是什么:
。。。。。。。。。。
用IR修复的时候将无效函数改为: GetProAddress,保存,软件运行一切OK!
-----------------------------------------------------------------------------------------------------
感谢您能看完...
视频教程下载地址:http://down.huacolor.com/down/zgmap/PECompact 2.X 脱壳后输入表修复.rar |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入我们
x
|