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,获取输入表。 这会得到一个完好的表了。 修复之后运行正常。。。 小弟第一次写脱文有什么不到之处请多多包函。。 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏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.