【文章标题】: RM转换精灵V 7.1 主程序脱壳
【作 者】: xiaoboy
【邮 箱】: [email]xiao-boy@qq.com[/email]
【主 页】: 木有
【软件名称】: RM转换精灵脱壳
【下载地址】: http://www.flyhua.net
【加壳方式】: 未知壳
【保护方式】: IAT加密
【工 具】: flyODBG、PEiD、ImportREC
【操作平台】: XPSP2
【软件介绍】: 可以把rm和rmvb文件转换为AVI、VCD、SVCD、DVD、MPE
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教! 小弟弟一次写脱文 有错误之处请多多指教!
--------------------------------------------------------------------------------
【详细过程】
1. 找OEP
peid显示:Microsoft Visual C++ 6.0 [Overlay] 不知道什么壳 先用peid 得插件试试找OEP (本人的一向习惯)
居然提示00518460,不知道是真的还是假的
2 二、dump程序
用flyODBG载入 停在下面
0066D000 R> 55 PUSH EBP
0066D001 8BEC MOV EBP, ESP
0066D003 6A FF PUSH -1
0066D005 68 2A2C0A00 PUSH 0A2C2A
0066D00A 68 38900D00 PUSH 0D9038
0066D00F 64:A1 00000000 MOV EAX, DWORD PTR FS:[0]
Ctrl+G 00518460
00518460 . 0000 ADD BYTE PTR DS:[EAX], AL
00518462 ? 0000 ADD BYTE PTR DS:[EAX], AL
00518464 ? 0000 ADD BYTE PTR DS:[EAX], AL
00518466 . 0000 ADD BYTE PTR DS:[EAX], AL
00518468 ? 0000 ADD BYTE PTR DS:[EAX], AL
0051846A ? 0000 ADD BYTE PTR DS:[EAX], AL
然后 00518460 处下硬件执行断点,F9运行。停在00518460
00518460 . 55 PUSH EBP
00518461 . 8BEC MOV EBP, ESP
00518463 . 83C4 F0 ADD ESP, -10
00518466 . 53 PUSH EBX
00518467 . B8 C07E5100 MOV EAX, RMtoVCD.00517EC0
0051846C . E8 27E5EEFF CALL RMtoVCD.00406998
00518471 . 8B1D 1CE85100 MOV EBX, DWORD PTR DS:[51E81C] ; RMtoVCD.0051FBF4
00518477 . 8B03 MOV EAX, DWORD PTR DS:[EBX]
00518479 . E8 26F0F5FF CALL RMtoVCD.004774A4
0051847E . A1 A0EA5100 MOV EAX, DWORD PTR DS:[51EAA0]
00518483 . 8B00 MOV EAX, DWORD PTR DS:[EAX]
00518485 . 8B48 6C MOV ECX, DWORD PTR DS:[EAX+6C]
00518488 . B2 01 MOV DL, 1
0051848A . A1 E0685100 MOV EAX, DWORD PTR DS:[5168E0]
以上看来是真的OEP了 是Borland Delphi 6.0 - 7.0编译的。
接着就用flyODBG自带的Ollydump插件 dump 出来保存。
本来这就以为收工的了,可是想用ImportREC 修复IAT 时才发现IAT加密了
以上做的基本无用功。各位不要见笑说我这写些,我只是想把过程写的详细写。
既然加了密,当然就要修复哦,就让我们来跟踪他的IAT表藏那去了。
00518460 . 55 PUSH EBP
00518461 . 8BEC MOV EBP, ESP
00518463 . 83C4 F0 ADD ESP, -10
00518466 . 53 PUSH EBX
00518467 . B8 C07E5100 MOV EAX, RMtoVCD.00517EC0
0051846C . E8 27E5EEFF CALL RMtoVCD.00406998 ///这跟进
00518471 . 8B1D 1CE85100 MOV EBX, DWORD PTR DS:[51E81C] ; RMtoVCD.0051FBF4
00518477 . 8B03 MOV EAX, DWORD PTR DS:[EBX]
00518479 . E8 26F0F5FF CALL RMtoVCD.004774A4
就到了这里:
00406998 /$ 53 PUSH EBX
00406999 |. 8BD8 MOV EBX, EAX
0040699B |. 33C0 XOR EAX, EAX
0040699D |. A3 C0905100 MOV DWORD PTR DS:[5190C0], EAX
004069A2 |. 6A 00 PUSH 0
004069A4 |. E8 2BFFFFFF CALL RMtoVCD.004068D4 //一般的Borland Delphi 6.0 - 7.0的程序在这都是 kernel32.GetModuleHandleA这个函数 明显加了密 再跟进去
004069A9 |. A3 68F65100 MOV DWORD PTR DS:[51F668], EAX
004069AE |. A1 68F65100 MOV EAX, DWORD PTR DS:[51F668]
就到了这里:
004068D4 /$ 90 NOP
004068D5 |. E8 DDC6F8FF CALL 00392FB7 //这里有好多 CALL 00392FB7 不知道做什么的。。再跟
004068DA |. 8BC0 MOV EAX, EAX //注意记住这个地址。。
004068DC |$ 90 NOP
004068DD |. E8 D5C6F8FF CALL 00392FB7
004068E2 |. 8BC0 MOV EAX, EAX
004068E4 |$ 90 NOP
004068E5 |. E8 CDC6F8FF CALL 00392FB7
004068EA |. 8BC0 MOV EAX, EAX
004068EC |$ 90 NOP
004068ED |. E8 C5C6F8FF CALL 00392FB7
004068F2 |. 8BC0 MOV EAX, EAX
004068F4 |$ 50 PUSH EAX
004068F5 |. 6A 40 PUSH 40
就到了这里:
00392FB7 50 PUSH EAX ///这时开始处理表的时候了。那我们就F4到这。
00392FB8 8BC4 MOV EAX, ESP
00392FBA 60 PUSHAD
00392FBB 8BD8 MOV EBX, EAX
00392FBD E8 04000000 CALL 00392FC6
00392FC2 52 PUSH EDX
00392FC3 24 39 AND AL, 39
00392FC5 005D 8B ADD BYTE PTR SS:[EBP-75], BL
00392FC8 6D INS DWORD PTR ES:[EDI], DX
00392FC9 008B 7B048BB5 ADD BYTE PTR DS:[EBX+B58B047B], CL
00392FCF 7C 0C JL SHORT 00392FDD
00392FD1 0000 ADD BYTE PTR DS:[EAX], AL
00392FD3 03F5 ADD ESI, EBP
00392FD5 8B06 MOV EAX, DWORD PTR DS:[ESI]
00392FD7 33D2 XOR EDX, EDX
00392FD9 B9 02000000 MOV ECX, 2
00392FDE F7E1 MUL ECX
00392FE0 D1E8 SHR EAX, 1
00392FE2 3BF8 CMP EDI, EAX
00392FE4 75 10 JNZ SHORT 00392FF6
00392FE6 0AD2 OR DL, DL
00392FE8 75 07 JNZ SHORT 00392FF1
00392FEA E9 A6000000 JMP 00393095
00392FEF EB 05 JMP SHORT 00392FF6
00392FF1 E9 AA000000 JMP 003930A0
00392FF6 83C6 08 ADD ESI, 8
00392FF9 66:9C PUSHFW
00392FFB E8 04000000 CALL 00393004
00393000 0010 ADD BYTE PTR DS:[EAX], DL
00393002 40 INC EAX
00393003 0083 C404EB04 ADD BYTE PTR DS:[EBX+4EB04C4], AL
00393009 31C8 XOR EAX, ECX
0039300B 3F AAS
0039300C 00EB ADD BL, CH
0039300E 04 F0 ADD AL, 0F0
00393010 0F4000 CMOVO EAX, DWORD PTR DS:[EAX]
00393013 66:9D POPFW
00393015 70 06 JO SHORT 0039301D
00393017 71 04 JNO SHORT 0039301D
00393019 A8 C8 TEST AL, 0C8
0039301B 3F AAS
0039301C 0072 07 ADD BYTE PTR DS:[EDX+7], DH
0039301F 73 05 JNB SHORT 00393026
00393021 880F MOV BYTE PTR DS:[EDI], CL
00393023 E0 3E LOOPDNE SHORT 00393063
00393025 00EB ADD BL, CH
00393027 AD LODS DWORD PTR DS:[ESI]
00393028 74 08 JE SHORT 00393032
0039302A 75 06 JNZ SHORT 00393032
0039302C 9A 00E03D00 E876 CALL FAR 76E8:003DE000
00393033 07 POP ES
00393034 77 05 JA SHORT 0039303B
00393036 E7 BB OUT 0BB, EAX
00393038 EC IN AL, DX
00393039 3E:0078 07 ADD BYTE PTR DS:[EAX+7], BH
0039303D 79 05 JNS SHORT 00393044
0039303F EA 000F41FF 669C JMP FAR 9C66:FF410F00
00393046 EB 06 JMP SHORT 0039304E
00393048 E8 01AADB3D CALL 3E14DA4E
0039304D 006A 02 ADD BYTE PTR DS:[EDX+2], CH
00393050 EB 06 JMP SHORT 00393058
00393052 E8 A0994700 CALL 0080C9F7
00393057 9A 7311EB05 E80A CALL FAR 0AE8:05EB1173
0039305E 0029 ADD BYTE PTR DS:[ECX], CH
00393060 E9 E80C0000 JMP 00393D4D
00393065 008B FF0F41FE ADD BYTE PTR DS:[EBX+FE410FFF], CL
0039306B ^ 73 F4 JNB SHORT 00393061
0039306D 9A 20143100 83C4 CALL FAR C483:00311420
00393074 04 EB ADD AL, 0EB
00393076 04 D0 ADD AL, 0D0
00393078 39C7 CMP EDI, EAX
0039307A 00FF ADD BH, BH
0039307C 0C 24 OR AL, 24
0039307E 71 04 JNO SHORT 00393084
00393080 BA 88260079 MOV EDX, 79002688
00393085 D27A 01 SAR BYTE PTR DS:[EDX+1], CL
00393088 E7 83 OUT 83, EAX
0039308A C40466 LES EAX, FWORD PTR DS:[ESI]
0039308D 9D POPFD
0039308E EB 05 JMP SHORT 00393095
00393090 B8 EF0F410F MOV EAX, 0F410FEF
00393095 8B46 04 MOV EAX, DWORD PTR DS:[ESI+4]
00393098 8903 MOV DWORD PTR DS:[EBX], EAX
0039309A 61 POPAD
0039309B 58 POP EAX
0039309C 8B00 MOV EAX, DWORD PTR DS:[EAX]
0039309E FFE0 JMP NEAR EAX
003930A0 8B46 04 MOV EAX, DWORD PTR DS:[ESI+4] ; RMtoVCD.005212AC
// 注意信息窗口
DS:[0039337B]=005212AC (RMtoVCD.005212AC)
EAX=004068DA (RMtoVCD.004068DA)
在数据窗口跟踪0039337B 得到如下一个很有规律的对应表:
00393377 804068DA //这个就是在上面让大家记住的地址。。
0039337B 005212AC RMtoVCD.005212AC//这个待会看完下面就知道了。。
0039337F 80406BCA
00393383 005212B4 RMtoVCD.005212B4
00393387 80406BC2
0039338B 005212B8 RMtoVCD.005212B8
0039338F 80406BBA
00393393 005212BC RMtoVCD.005212BC
00393397 80406BB2
0039339B 005212C0 RMtoVCD.005212C0
0039339F 80406BAA
003933A3 005212C4 RMtoVCD.005212C4
003933A7 80406BA2
003933AB 005212C8 RMtoVCD.005212C8
接着F7...
003930A3 8903 MOV DWORD PTR DS:[EBX], EAX
003930A5 61 POPAD
003930A6 58 POP EAX
003930A7 83C4 04 ADD ESP, 4
003930AA 8B00 MOV EAX, DWORD PTR DS:[EAX] ; kernel32.GetModuleHandleA
到这里,信息窗口里终于出现函数了 。。。
DS:[005212AC]=7C80B529 (kernel32.GetModuleHandleA)
EAX=005212AC (RMtoVCD.005212AC)
在数据窗口跟踪005212AC 得到一个很完整的IAT表。。如下
005212AC 7C80B529 kernel32.GetModuleHandleA // 这个就是上面对照表的另一个地址数据。。
005212B0 00000000
005212B4 77DA7883 ADVAPI32.RegQueryValueExA
005212B8 77DA761B ADVAPI32.RegOpenKeyExA
005212BC 77DA6BF0 ADVAPI32.RegCloseKey
005212C0 77DA7753 ADVAPI32.OpenProcessToken
005212C4 77DCD11B ADVAPI32.LookupPrivilegeValueA
005212C8 77DCC534 ADVAPI32.AdjustTokenPrivileges
005212CC 00000000
005212D0 7C80C729 kernel32.lstrcpyA
005212D4 7C81EE79 kernel32.lstrcmpA
005212D8 7C822BB7 kernel32.WritePrivateProfileStringA
。。。。。。。。。。。。。。。。。。。。。。。。。。。。//其中一部分
003930AC FFE0 JMP NEAR EAX // 跳到函数去了。
下面我们来分析下这个对照表的关系:
004068D4 /$ 90 NOP
004068D5 |. E8 DDC6F8FF CALL 00392FB7 //这里有好多 CALL 00392FB7 不知道做什么的。。再跟
004068DA |. 8BC0 MOV EAX, EAX //注意记住这个地址。。
004068DC |$ 90 NOP
00393377 804068DA //这个就是在上面让大家记住的地址。。
0039337B 005212AC RMtoVCD.005212AC//这个待会看完下面就知道了。。
005212AC 7C80B529 kernel32.GetModuleHandleA // 这个就是上面对照表的另一个地址数据。。
005212B0 00000000
这下子清晰了吧, 这个表就是根据call 392FB7 地址来得到对应的函数的对照表。
既然这样就写代码修复吧,重新打开flyODBG载入程序 下断00518460, F9运行就停在OEP了。
然后找个空白段写入以下代码:
90 NOP //然后在这新建EIP
00394237 60 PUSHAD
00394238 9C PUSHFD
00394239 BB A7313900 MOV EBX, 3931A7 //对照表开始位置
0039423E 8B03 MOV EAX, DWORD PTR DS:[EBX]
00394240 2D 00000080 SUB EAX, 80000000
00394245 66:C740 FB FF25 MOV WORD PTR DS:[EAX-5], 25FF
0039424B 8B4B 04 MOV ECX, DWORD PTR DS:[EBX+4]
0039424E 8948 FD MOV DWORD PTR DS:[EAX-3], ECX
00394251 83C3 08 ADD EBX, 8
00394254 81FB 17413900 CMP EBX, 394117
0039425A 7D 0A JGE SHORT 00394266 //对照表结束位置
0039425C ^ EB E0 JMP SHORT 0039423E
0039425E 0000 ADD BYTE PTR DS:[EAX], AL
00394260 0000 ADD BYTE PTR DS:[EAX], AL
00394262 0000 ADD BYTE PTR DS:[EAX], AL
00394264 0000 ADD BYTE PTR DS:[EAX], AL
00394266 9D POPFD
00394267 61 POPAD //结束
现在回到OEP 在新建EIP后用flyODBG自带的Ollydump插件 dump 出来保存。
打开 ImportREC 选择程序 OPE:00118460 ,然后自动查找IAT,获取输入表。
这会得到一个完好的表了。
修复之后运行正常。。。
小弟第一次写脱文有什么不到之处请多多包函。。
--------------------------------------------------------------------------------
【版权声明】: 转载请注明作者并保持文章的完整, 谢谢!
2006年02月16日 02:01:39
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!