|
破文作者: 幽谷客 发表时间: 2007-5-5 01:51 链接地址: http://www.unpack.cn/viewthread.php?tid=12453 在刚开始学脱壳的时候,在相关论坛看到过有人脱过这个软件的壳,外加破解, 但是照着那篇文章练了3个晚上脱壳后的软件并没有像作者说的——“运行ImportREC 1.6,选择这个进程。 把OEP改为00038570,点IT AutoSearch,函数全部有效。FixDump,正常运行!” 运行起来,3个月后的今天,才知道那篇文章并不完整,今天我用和那篇文章的作者不太一样的方法来脱这个软件的壳。 这是我的处女作,写得好请大家鼓励,写得不好请大家多提宝贵意见。 PEID查壳:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks Armadillo find: ★ 目标为Armadillo保护 ★ 特征识别 = DC2CE414 保护系统级别为 (标准版) ◆所用到的保护模式有◆ 屏蔽调试器 【备份密钥设置】 无任何注册表操作 【程序压缩设置】 最好/最慢地压缩方式 【其它保护设置】 ★分离子进程★ 子进程标识号为 : 00000924 入口点为 : 0052A914 原始字节为 : 558B OD载入,忽略所有异常,隐藏OD 0052A914 >/$ 55 push ebp 载入后停在这里 0052A915 |. 8BEC mov ebp, esp 0052A917 |. 6A FF push -1 0052A919 |. 68 D0455300 push 005345D0 0052A91E |. 68 34A45200 push 0052A434 ; SE 处理程序安装 0052A923 |. 64:A1 0000000>mov eax, dword ptr fs:[0] 0052A929 |. 50 push eax 0052A92A |. 64:8925 00000>mov dword ptr fs:[0], esp 0052A931 |. 83EC 58 sub esp, 58 0052A934 |. 53 push ebx 0052A935 |. 56 push esi 0052A936 |. 57 push edi 0052A937 |. 8965 E8 mov dword ptr [ebp-18], esp ******************************************************************************************* 分离父进程,使程序把自己当成子进程运行 在命令行下断:BP OpenMutexA F9运行 7C80EA1B > 8BFF mov edi, edi 断在这里 7C80EA1D 55 push ebp 7C80EA1E 8BEC mov ebp, esp 7C80EA20 51 push ecx 7C80EA21 51 push ecx 断下来后暂时不要取消断点,ALT+F9返回 0052585D . 85C0 test eax, eax 返回到这里 0052585F . 74 04 je short 00525865 在这里将 0052585F 这一行的 JE改成它的相反JNZ 0052585D . 85C0 test eax, eax 0052585F 75 04 jnz short 00525865 改完后F9运行,断在了刚才的断点上 7C80EA1B > 8BFF mov edi, edi 断在这里 7C80EA1D 55 push ebp 7C80EA1E 8BEC mov ebp, esp 7C80EA20 51 push ecx 7C80EA21 51 push ecx ALT+F9再次返回 00525C4D . 85C0 test eax, eax 返回到这里 00525C4F . 0F85 82010000 jnz 00525DD7 在这里将 00525C4F 这一行的 JNZ改成它的相反JZ 00525C4D . 85C0 test eax, eax 00525C4F 0F84 82010000 je 00525DD7 改完后F9运行,断在了刚才的断点上,现在取消断点。此时父进程分离完毕. ************************************************************************************************** 寻找Magic Jump,避开IAT加密 CTRL+G ——输入 GetModuleHandleA——确定 7C80B6A1 > 8BFF mov edi, edi 来到这里 7C80B6A3 55 push ebp 7C80B6A4 8BEC mov ebp, esp 7C80B6A6 837D 08 00 cmp dword ptr [ebp+8], 0 7C80B6AA 74 18 je short 7C80B6C4 在这里下硬件执行断点 7C80B6AC FF75 08 push dword ptr [ebp+8] 在7C80B6AA一行下硬件执行断点,然后F9运行N次,注意看堆栈窗口,寻找合适的返回时机 第一次 0012E008 /0012E044 0012E00C |00C060DB 返回到 00C060DB 来自 kernel32.GetModuleHandleA 0012E010 |00C1B808 ASCII "kernel32.dll" 0012E014 |00565E94 PowerPoi.00565E94 0012E018 |00565E94 PowerPoi.00565E94 第二次0012E008 /0012E044 0012E00C |00C060DB 返回到 00C060DB 来自 kernel32.GetModuleHandleA 0012E010 |00C1B7FC ASCII "user32.dll" 0012E014 |00565E94 PowerPoi.00565E94 0012E018 |00565E94 PowerPoi.00565E94 第三次0012E044 /0012F44C 0012E048 |00C10375 返回到 00C10375 来自 kernel32.GetModuleHandleA 0012E04C |00C91FE8 ASCII "KERNEL32.dll" 0012E050 |00565E94 PowerPoi.00565E94 0012E054 |00565E94 PowerPoi.00565E94 第四次0012E028 /0012E040 0012E02C |00C0653E 返回到 00C0653E 来自 kernel32.GetModuleHandleA 0012E030 |00000000 0012E034 |00565E94 PowerPoi.00565E94 0012E038 |00565E94 PowerPoi.00565E94 第四次就是最佳返回时机,还有一个特征就是 7C80B6AA一行的JE跳转是实现的 取消硬件执行断点,ALT+F9返回 00C0653E 8B4D 08 mov ecx, dword ptr [ebp+8] 返回到这里 00C06541 3BC8 cmp ecx, eax 00C06543 75 07 jnz short 00C0654C 00C06545 B8 A8B3C100 mov eax, 0C1B3A8 00C0654A EB 2F jmp short 00C0657B 00C0654C 393D D8B7C100 cmp dword ptr [C1B7D8], edi 00C06552 B8 D8B7C100 mov eax, 0C1B7D8 00C06557 74 0C je short 00C06565 这里就是Magic Jump 00C06559 3B48 08 cmp ecx, dword ptr [eax+8] 00C0655C 74 1A je short 00C06578 00C0655E 83C0 0C add eax, 0C 00C06561 3938 cmp dword ptr [eax], edi 00C06563 ^ 75 F4 jnz short 00C06559 将Magic Jump处的JE改成JMP *************************************************************************************************** 到达OEP 按M打开内存,在00401000上F2下断,F9运行 00442B52 6A 60 push 60 这里就是OEP 00442B54 68 782A4B00 push 004B2A78 00442B59 E8 32190000 call 00444490 00442B5E BF 94000000 mov edi, 94 00442B63 8BC7 mov eax, edi 00442B65 E8 E6F6FFFF call 00442250 00442B6A 8965 E8 mov dword ptr [ebp-18], esp 00442B6D 8BF4 mov esi, esp 00442B6F 893E mov dword ptr [esi], edi 00442B71 56 push esi 在这里脱壳修复(ImportREC显示所有的函数都有效)转存。 优化:删除区段“.text1”、“.data1”、“.pdata”然后“重建PE”!程序由脱壳后的2.07MB变为1.32MB. ****************************************************************************************************** 去掉程序错误检测 运行脱壳修复后的程序,提示错误。这应该是程序检测的问题。OD载入优化过的文件,在命令行下断 bp MessageBoxA,F9运行 77D5058A > 8BFF mov edi, edi ; dumped3_.004E3BAC 中断在这里 77D5058C 55 push ebp 77D5058D 8BEC mov ebp, esp 77D5058F 833D BC04D777 0>cmp dword ptr [77D704BC], 0 中断后取消断点,ALT+F9返回,此时程序运行时那个提示框出现了,点击确定 004A2665 FF15 5CB44A00 call dword ptr [<&user32.MessageBoxA>>; USER32.MessageBoxA 004A266B 85FF test edi, edi ; dumped3_.004E3BAC 中断在这里 可以看出应该是004A2665 一行出现错误提示框的,往上翻一下,在这一段的断首F2下断 004A2577 55 push ebp 在这里F2下断 004A2578 8DAC24 68FFFFFF lea ebp, dword ptr [esp-98] 004A257F 81EC 18010000 sub esp, 118 004A2585 A1 A0DF4C00 mov eax, dword ptr [4CDFA0] .......................................... .......................................... .......................................... 004A2665 FF15 5CB44A00 call dword ptr [<&user32.MessageBoxA>>; USER32.MessageBoxA 004A266B 85FF test edi, edi ; dumped3_.004E3BAC 下好断后,点快捷工具栏上的 X 关闭程序,然后在重新载入程序,F9运行 004A2577 55 push ebp 断在这里 004A2578 8DAC24 68FFFFFF lea ebp, dword ptr [esp-98] 004A257F 81EC 18010000 sub esp, 118 004A2585 A1 A0DF4C00 mov eax, dword ptr [4CDFA0] 004A258A 53 push ebx 此时注意看堆栈窗口 0012BC5C 0043B268 返回到 dumped3_.0043B268 来自 dumped3_.004A26AA CTRL+G输入0043B268,确定 0043B263 E8 42740600 call 004A26AA 0043B268 8D46 F0 lea eax, dword ptr [esi-10] 来到这里 应该是0043B263处的CALL调用,往上翻一下,看有没有跳转能跳过这个CALL 0043B22C /74 30 je short 0043B25E 0043B22E |48 dec eax 0043B22F |74 22 je short 0043B253 0043B231 |51 push ecx 0043B232 |8D46 F0 lea eax, dword ptr [esi-10] 0043B235 |896424 0C mov dword ptr [esp+C], esp 0043B239 |8BFC mov edi, esp 0043B23B |50 push eax 0043B23C |E8 CF8FFCFF call 00404210 0043B241 |83C0 10 add eax, 10 0043B244 |83C4 04 add esp, 4 0043B247 |8907 mov dword ptr [edi], eax 0043B249 |E8 72FDFFFF call 0043AFC0 0043B24E |83C4 04 add esp, 4 0043B251 |EB 15 jmp short 0043B268 这个可以跳过 0043B253 |56 push esi 0043B254 |E8 1B860000 call 00443874 0043B259 |83C4 04 add esp, 4 0043B25C |EB 0A jmp short 0043B268 这个可以跳过 0043B25E \6A 00 push 0 0043B260 6A 10 push 10 0043B262 56 push esi 0043B263 E8 42740600 call 004A26AA 0043B268 8D46 F0 lea eax, dword ptr [esi-10] 这两个跳转都可以跳转,但都没有实现,那么应该是上面的跳转问题了,通过修改上面个两个跳转还是不能使下面的两个跳转实现。 在0043B22C一行F2下断,关闭程序,然后在重新载入程序,F9运行 0043B22C /74 30 je short 0043B25E 断在这里 0043B22E |48 dec eax 0043B22F |74 22 je short 0043B253 此时注意对占窗口 0012BC84 0043B313 返回到 dumped3_.0043B313 来自 dumped3_.0043B200 CTRL+G输入0043B313,确定 0043B304 68 48F04A00 push 004AF048 ; ASCII "System fault, the application will be shut down immediately!" 程序启动时的错误提示 0043B309 E8 02AFFCFF call 00406210 0043B30E E8 EDFEFFFF call 0043B200 0043B313 83C4 04 add esp, 4 中断在这里 此时我们很清楚的在上面几行的注释栏中看到程序启动时的错误提示,往上翻可以看到,只要0043B2FB一行的这个跳转能跳走, 就不会出现错误提示了,将0043B2FB一行的JNZ改成JMP然后保存修改程序此时就可以正常运行了。 0043B2FB 75 21 jnz short 0043B31E 将这里的JNZ改成JMP 0043B2FD 51 push ecx 0043B2FE 8BCC mov ecx, esp 0043B300 896424 24 mov dword ptr [esp+24], esp 0043B304 68 48F04A00 push 004AF048 ; ASCII "System fault, the application will be shut down immediately!" 0043B309 E8 02AFFCFF call 00406210 0043B30E E8 EDFEFFFF call 0043B200 0043B313 83C4 04 add esp, 4 程序采用了Armadillo的注册模块,脱壳后自然就不必注册了,30次的试用限制也不存在了。经过上面的修改,和破解版的一样。附件下载:http://www.unpack.cn/attachment.php?aid=8145 |
|
---|