|
![]() | 作者: yongmin [yongmin]
![]() |
登录 |
作者:daxia2002 转贴自:一蓑烟雨 算一算时间很久没有写文章了,时间过的可真快,这次提起笔写写,一方面总结一下,另一方 面证实一下自己还不算老吧。十一长假过了大半,培着老婆天天在家里,也算是打发一下时间吧。 写些什么呢,自己很清楚,这些年来一直在看雪和一衰烟雨论坛混,可是自己在脱壳方面还是壳盲。 最后决定还是谈谈Armadillo CopyMem-II+Debug-Blocker 保护方式脱壳,都是一些总结性的,都是 轻车熟路的套路,没什么创新,大牛们就别浪费时间了,小鸟们倒是可以一看,也许会有些收获。 这里我总结了一下方法:手工方法和工具辅助方法,再加上我的一点点"创新"。先简单说一下 这种保护方式特点:父进程调试子进程,在子进程里负责IAT的加密,子进程到达OEP后触发异常, 父进程负责子进程代码解密,然后再按照一定的算法加密回去,防止子进程被Dump。现有的脱壳方 式先dump子进程,然后再单独恢复IAT,这是因为IAT的加密在子进程里,OD无法调试子进程。OD是3 环的调试器,我们用0环的调试器就可以调试子进程了。当时我用softice+iceext调试子进程时也费 了一番周折,毕竟穿山甲反ICE还是很厉害的。现在我用国货:Syser,试了一段时间发现Syser稳定 性还算不错,至少在我的机器是这样的,而且穿山甲对其没有任何的防护,这也许是Syser在脱壳方 面的第一篇文章吧!让我们开始吧!我们先用新版的Armadillo给98notepad加壳作为试练品。在调试 过程中发现OD和Syser在硬件断点上打架,可在OD"调试选项">"调试"中去掉"使用硬件断点单步执行 或跟踪代码"复选框。 一、手工篇 (一)方法1 该方法也许是最早的方法了,国人某牛人首创,该方法简单易行,老少皆宜。 先bp WaitForDebugEvent,shift+f9,断下后ALT+F9返回,bc WaitFordebugEvent 去掉断点。 "查找">"所有常数">FFFFFFF8, 双击该行 "00434FAF or eax, FFFFFFF8",向上来到: /*434F68*/ cmp dword ptr [ebp-A60], 0 //这里下断点 /*434F6F*/ jl 0043521A /*434F75*/ mov ecx, dword ptr [ebp-A60] /*434F7B*/ cmp ecx, dword ptr [474414] /*434F81*/ jge 0043521A 我们在434F68处F2下断点.启动Syser,Ctrl+F12激活,>bpm outputdebugstringa x,下硬件断点, 我们利用这个断点来断下子进程.在OD里shift+f9运行,中断在Syser里,按x运行,这里中断4次,前2 次是父进程产生的,后2次是子进程产生的,第4次中断后,>bd 0禁用该断点,>bpm getmodulehandlea x 下硬件断点,我们开始找魔法跳.按x运行,我们观察堆栈窗口,当显示"VirtualAlloc"时,再按x运 行一次,断下后,>bd 1 禁用该断点. >g *esp,运行到子进程空间,往下找到魔法跳: 00d57ec6 jnz 00d57ecd //魔法跳 00d57ec8 jmp 00d57dbc >a 00d57ec6 nop //nop掉魔法跳 >a 00d57ec7 nop //nop掉魔法跳 >bpm createthread x //下断点在子进程中找OEP >x 运行,断下后>bd 2,F6运行到返回,F8单步一下,F6运行到返回,F8单步一下,往下找到: 00d8f1b4 call ecx //选中,F7运行到该行,此时ecx=004010cc=OEP,F8 单步一下,此时在OEP处还没 解码,触发异常中断在OD里,我们可以在OD里给子进程进行解码了. 在00435033处进行patch,先给[ebp-A60]置0 /*435033*/ add dword ptr [ebp-A60], 1 //[ebp-A60]指向当前解码快,置0从第一块解码 /*43503A*/ mov dword ptr [474418], 1 //[474418]指向父进程再次加密的解码快临界值, 置1为了欺骗父进程永不进行加密. /*435044*/ jmp 00434F68 bp WriteProcessMemory,下断点,shift+f9,断下后, 0013DD18 00437C40 /CALL 到 WriteProcessMemory 来自 notepad.00437C3A 0013DD1C 00000078 |hProcess = 00000078 (window) 0013DD20 00401000 |Address = 401000 0013DD24 00BA5EF8 |Buffer = 00BA5EF8 0013DD28 00001000 |BytesToWrite = 1000 (4096.) 0013DD2C 0013DD64 \pBytesWritten = 0013DD64 从堆栈可以看到开始给子进程OEP处解码了,d 00ba5ef5+(004010cc-00401000),修改该处为EB,FE, 让子进程进入循环.bc WriteProcessMemory,bc 434F68,bp 0043521A,shift+f9,子进程全部解 码,dump子进程,修复IAT,保存,将OEP改回原来的55,8B. (二)方法2 方法2是国外教程里的经典方法,找到那个加密call,nop掉,patch,让父进程强行解码.方法一和 方法二比较了一下,发现实质是一样的,一个在外围,一个在内部.那个加密call也很容易找到,"查找 ">"所有常数">FFFFFFF8 双击该行"004371CF or edx, FFFFFFF8",向下找到 /*43721B*/ call 004372A0 //这就是加密的CALL 后面的过程就留给你了,子进程的IAT处理是一样的. 二、工具辅助篇 手工脱壳尽管复杂些,但可以加深理解,理解之后我们可以利用工具加快脱壳的步伐。 (一)方法1 用Armadillo COPYMEMEII DUMP的一个LOADPE小插件,这个小工具的确方便,老大们说的很清楚 了。 先用方法二定位加密call,nop掉,bp WriteProcessMemory,用Syser处理子进程IAT加密,中断 到OD后,让子进程进入循环,用LOADPE小插件dump,修复IAT,保存,将OEP改回原来的55,8B. (二)方法2 用deroko/ARTeam提供的Armadillo CopyMem II dumper工具可以非常简单的dump。 dumper2.EXE notepad.exe 运行,用Syser处理子进程IAT加密,成功后提示子进程的PID,OEP, 并且自动dump和恢复了OEP原始值,我们只需修复IAT,保存即可。 (三)方法3 用AvAtAr//TEAM RESURREC提供的Armadillo Process Detach v1.3 Final,也非常简单的dump。 选择CopyMem-II选项,把目标拖进去,也是用 用Syser处理子进程IAT加密,成功后提示: Filename: notepad.EXE Parent process iD: [00000464] Processing... [PROTECTiON SYSTEM] Professional Edition [PROTECTiON OPTiONS] Debug-Blocker protection detected CopyMem-II protection detected Memory-Patching Protections enabled [CHiLD iNFO] Crypto call found: [0043721B] Child process iD: [000007F0] Entry point: [004010CC] Original bytes: [558BEC83] Detached successfully 此时用OD附加,f9,f12,恢复OEP原始数据,dump,修复IAT,保存。 总算写完了,断断续续用了一天时间,希望您看完之后有些收获,我就知足了,最后再次感谢 看雪和一衰烟雨论坛,感谢大家对我的支持和帮助。 |
地主 发表时间: 08-01-27 10:39 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号