脱壳技术,Armadillo 3.6主程序脱壳,Armadillo 2008年06月23日 星期一 下午 04:30 工具:OllyDBG1.1汉化版;LordPE 操作系统:WIN2K 目标程序:Armadillo.exe(3.6主程序) 最近大家对Armadillo 3.6脱的研究有所升温,有标准加壳的还有CopyMemII Debug模式的加壳的等等。于是本人也凑个热闹:来个其主程序的脱文。较之他们的不同点是:一是主程序脱壳难度大点;二是不用其它辅助dump工具。(初步脱壳,没有修复) 一、寻找OEP并Dump进程 用OllyDBG加载后,停留在入口004A2000处,记下入口开始二字节(60E8)以便修复IAT用。用插件IsDebuggerPresent隐藏ollydbg并在调试设置里忽略掉所有异常(全钩上)。 在命令窗口里下断点:bp WaitForDebugEvent,然后F9运行。断在WaitForDebugEvent入口(按F2取消断点)。查看堆栈窗口: 0012DA98 00487F67 /CALL 到 WaitForDebugEvent 来自 Armadill.00487F61 0012DA9C 0012EB5C |pDebugEvent = 0012EB5C 0012DAA0 000003E8 \Timeout = 1000. ms 0012DAA4 0012FF04 0012DAA8 00000000 0012DAAC 00497B99 Armadill.00497B99 其中第2行0012EB5C就是发生调试事件时具体内容存放地址。到次行点击鼠标右键然后在菜单选择“转存中跟随”,以便在转存窗口随时观察0012EB5C开始一段地址中的数据变化。 到CPU窗口,Ctrl-G:0048858A,然后在0048858A处设置硬件执行断点。此断点是偶经过无数次跟踪分析而找到的最佳切入点(本人独创,绝无2家),主要是为了便于Dump进程,至于为什么大家看在此处断下后的代码分析片断。 ok,在所设硬件断点处断下。察看0012EB5C开始一段地址中的数据: 0012EB5C 01 00 00 00 58 06 00 00 ...X .. 0012EB64 30 04 00 00 01 00 00 80 0 .. .. 0012EB6C 00 00 00 00 00 00 00 00 ........ 0012EB74 B0 28 44 00 02 00 00 00 ?D. ... [0012EB74]=004428B0,这就是我们要找的OEP! 接着来看断点处的代码每行尾部//为说明) 0048858A CMP DWORD PTR SS:[EBP-A30],0 //[EBP-A30]为01000H大小的块号(0-47),0对应00401000块;1对应00402000块;依次类推。 00488591 JL Armadill.00488840 00488597 MOV ECX,DWORD PTR SS:[EBP-A30] 0048859D CMP ECX,DWORD PTR DS:[4B85E4] //[4B85E4]为块的总个数,本程序=48h 004885A3 JGE Armadill.00488840 004885A9 MOV EDX,DWORD PTR SS:[EBP-9BC] 004885AF AND EDX,0FF 004885B5 TEST EDX,EDX 004885B7 JE Armadill.0048866A 004885BD PUSH 0 004885BF MOV ESI,DWORD PTR SS:[EBP-A30] 004885C5 SHL ESI,4 004885C8 MOV EAX,DWORD PTR SS:[EBP-A30] 004885CE AND EAX,80000007 004885D3 JNS SHORT Armadill.004885DA 004885D5 DEC EAX 004885D6 OR EAX,FFFFFFF8 004885D9 INC EAX 004885DA XOR ECX,ECX 004885DC MOV CL,BYTE PTR DS:[EAX 4B6A80] 004885E2 MOV EDX,DWORD PTR SS:[EBP-A30] 004885E8 AND EDX,80000007 004885EE JNS SHORT Armadill.004885F5 004885F0 DEC EDX 004885F1 OR EDX,FFFFFFF8 004885F4 INC EDX 004885F5 XOR EAX,EAX 004885F7 MOV AL,BYTE PTR DS:[EDX 4B6A81] 004885FD MOV EDI,DWORD PTR DS:[ECX*4 4B2260] 00488604 XOR EDI,DWORD PTR DS:[EAX*4 4B2260] 0048860B MOV ECX,DWORD PTR SS:[EBP-A30] 00488611 AND ECX,80000007 00488617 JNS SHORT Armadill.0048861E 00488619 DEC ECX 0048861A OR ECX,FFFFFFF8 0048861D INC ECX 0048861E XOR EDX,EDX 00488620 MOV DL,BYTE PTR DS:[ECX 4B6A82] 00488626 XOR EDI,DWORD PTR DS:[EDX*4 4B2260] 0048862D MOV EAX,DWORD PTR SS:[EBP-A30] 00488633 CDQ 00488634 MOV ECX,1C 00488639 IDIV ECX 0048863B MOV ECX,EDX 0048863D SHR EDI,CL 0048863F AND EDI,0F 00488642 ADD ESI,EDI 00488644 MOV EDX,DWORD PTR DS:[4B85D4] 0048864A LEA EAX,DWORD PTR DS:[EDX ESI*4] 0048864D PUSH EAX 0048864E MOV ECX,DWORD PTR SS:[EBP-A30] 00488654 PUSH ECX 00488655 CALL Armadill.0048A659 //解密数据并复制到对应的块。 0048865A ADD ESP,0C 0048865D AND EAX,0FF 00488662 TEST EAX,EAX 00488664 JE Armadill.00488840 察看[EBP-A30]的值如下: 0012EB48 41 00 00 00 01 49 13 00 A... I . 修改0012eb48处的值为0,从第一块开始解密并复制数据到00401000处,大小01000H.为了循环直到所有数据全部解密,偶修改了0048865D处的代码如下: 0048865D:inc dword ptr [0012eb48] 00488663:nop 00488664:jmp 0048858A 到数据转存窗口,Ctrl-G:004B85E4,用来观察004B85E4和004B85E8二处数据。其中004B85E4单元为总块数;004B85E8单元为已经解密的块数,如果解密块数>=23H,则会对第0块即00401000处代码实现加密并改变该块读写权限不能进行任何操作(GUARD),所以当004B85E8 的值到了20h时就修改为0(也可以在21/22H时改,但不能超过23H). F9继续运行,(中间记得修改004B85E8的值)在该硬件断点中断48h次后,运行LordPE,选择第2个进程(有2个同名进程),即可完全dump. 二、得到引入表 重头再来,用OllyDBG加载,设置bp DebugActiveProcess。断下后察看堆栈窗口: 0012DA9C 00487DDB /CALL 到 DebugActiveProcess 来自 Armadill.00487DD5 0012DAA0 0000057C \ProcessId = 57C 0012DAA4 0012FF04 0012DAA8 00000000 子进程ID为57C,另外打开一个ollydbg程序,附加到这个57c进程,OK。 按ALT F9来到入口处,修改入口指令EB FE为60 E8(第一步记下的),结果: 004A2000 >PUSHAD 004A2001 CALL Armadill.004A2006 004A2006 POP EBP 004A2007 PUSH EAX 004A2008 PUSH ECX 004A2009 JMP SHORT Armadill.004A201A 取消DebugActiveProcess断点,设置bp OpenMutexA断点,断下后取消。 察看堆栈窗口: 0012F574 004797F1 /CALL 到 OpenMutexA 来自 Armadill.004797EB 0012F578 001F0001 |Access = 1F0001 0012F57C 00000000 |Inheritable = FALSE 0012F580 0012FBB4 \MutexName = "57C::DAAD341ECC" 0012F584 0012FF04 在00401000空白处输入代码: 00401000 60 PUSHAD 00401001 68 B4FB1200 PUSH 12FBB4 00401006 6A 00 PUSH 0 00401008 6A 00 PUSH 0 0040100A E8 D08BA877 CALL KERNEL32.CreateMutexA 0040100F 61 POPAD 00401010 -E9 D48CA877 JMP KERNEL32.OpenMutexA 在00401000地址按鼠标右键,然后在菜单中选择“此处新建EIP”。 设置bp LoadLibraryA断点,第2次断下后,再F8跟,就会发现00E18000开始就是原来未经任何修改的引入表。用LordPe把起始地址00e18000,大小03000h全部dump出来,并编辑修改到第一步dump出来的文件的同一地址。 |
|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )
GMT+8, 2024-9-29 23:33 , Processed in 0.159264 second(s), 12 queries , Gzip On, MemCache On.
Powered by Discuz! X3.5
© 2001-2023 Discuz! Team.