找回密码
 注册
搜索
热搜: 回贴

RM转换精灵V 7.1 主程序脱壳,脱壳,脱壳技术

2010-1-30 18:24| 发布者: admin| 查看: 72| 评论: 0|原作者: 九天玄女


RM转换精灵V 7.1 主程序脱壳,脱壳,脱壳技术
2008年06月23日 星期一 下午 07:13
【文章标题】: RM转换精灵V 7.1 主程序脱壳

【作 者】: xiaoboy

【邮 箱】: xiao-boy@qq.com

【主 页】: 木有

【软件名称】: 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 /$Content$nbsp; 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 /$Content$nbsp; 90 NOP

004068D5 |. E8 DDC6F8FF CALL 00392FB7 //这里有好多 CALL 00392FB7 不知道做什么的。。再跟

004068DA |. 8BC0 MOV EAX, EAX //注意记住这个地址。。

004068DC |$Content$nbsp; 90 NOP

004068DD |. E8 D5C6F8FF CALL 00392FB7

004068E2 |. 8BC0 MOV EAX, EAX

004068E4 |$Content$nbsp; 90 NOP

004068E5 |. E8 CDC6F8FF CALL 00392FB7

004068EA |. 8BC0 MOV EAX, EAX

004068EC |$Content$nbsp; 90 NOP

004068ED |. E8 C5C6F8FF CALL 00392FB7

004068F2 |. 8BC0 MOV EAX, EAX

004068F4 |$Content$nbsp; 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 /$Content$nbsp; 90 NOP

004068D5 |. E8 DDC6F8FF CALL 00392FB7 //这里有好多 CALL 00392FB7 不知道做什么的。。再跟

004068DA |. 8BC0 MOV EAX, EAX //注意记住这个地址。。

004068DC |$Content$nbsp; 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,获取输入表。

这会得到一个完好的表了。

修复之后运行正常。。。

  

小弟第一次写脱文有什么不到之处请多多包函。。


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 19:14 , Processed in 0.344447 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部