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

脱壳技术,Armadillo 3.6主程序脱壳,Armadillo

2010-1-30 18:20| 发布者: admin| 查看: 83| 评论: 0|原作者: 青鸾峰


脱壳技术,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出来的文件的同一地址。




最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏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.

返回顶部