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

脱壳技术,Armadillo 3.X脱壳 修复,Armadillo

2010-1-30 18:20| 发布者: admin| 查看: 88| 评论: 0|原作者: 柳梦璃


脱壳技术,Armadillo 3.X脱壳 修复,Armadillo
2008年06月23日 星期一 下午 04:33
最近大家对Armadillo 3.X脱壳的研究文章很多了,再写就有灌水的嫌疑。只是前几天答应fly写一篇的,我不想失言。





工具:OllyDBG1.1汉化版;LordPE ;Import.Reconstructor.v1.6.Fanal.CHS

操作系统:WIN2K3

目标程序:围棋助手8.13a





围棋助手8.13a是Armadillo 3.X(standard protection plus Debug-Blocker)方式加的壳,就是用Ricardo Narvaja的文章的方法

无法脱壳的方式。由于有了mysqladm大虾对Armadillo的深入研究的文章,Armadillo加的壳脱起来就容易多了。请大家先看看那篇文章

(http://www.chat001.com/forum/crackforum/282540.html)强烈推荐!



第一步:查找OEP

用OD载入主程序Go600.exe后隐藏OD,忽略所有异常。然后BP OpenMutexA,F9运行中断在OpenMutexA函数的人口,Ctrl G填入00401000 然后输入下面的代码(mysqladm大虾的杰作,感谢):



00401000 60 PUSHAD

00401001 9C PUSHFD

00401002 68 B4FB1200 PUSH 12FBB4

00401007 33C0 XOR EAX,EAX

00401009 50 PUSH EAX

0040100A 50 PUSH EAX

0040100B E8 E694A677 CALL KERNEL32.CreateMutexA

00401010 9D POPFD

00401011 61 POPAD

00401012 - E9 8F9FA777 JMP KERNEL32.OpenMutexA



在00401000行新建起源,F9运行,再次中断在OpenMutexA函数的入口,在cpu窗口中看到ERROR_SUCCESS (00000000)说明上面的代码运行成功

程序把自己当成子进程运行了。命令行输入:bp VirtualProtect F9运行被中断在这个函数的入口地址,继续F9运行直到在堆栈窗口中看到内存地址不在4XXXXXXX范围时:





0012C0DC 00B5DB42 /CALL 到 VirtualProtect 来自 00B5DB3C ;<--看这里

0012C0E0 00401000 |Address = Go6000.00401000

0012C0E4 0006C000 |Size = 6C000 (442368.)

0012C0E8 00000004 |NewProtect = PAGE_READWRITE

0012C0EC 0012D7FC \pOldProtect = 0012D7FC



关闭原来所有的断点,在OD中Alt M打开内存窗口,在00401000 开始程序的代码段下内存访问断点,F9运行被中断在入口地址:



00460C3C >PUSH EBP ;<--完好的入口

00460C3D >MOV EBP,ESP

00460C3F >PUSH -1

00460C41 >PUSH Go6000.004733E8

00460C46 >PUSH Go6000.00460DA6 ; JMP to msvcrt._except_handler3

00460C4B >MOV EAX,DWORD PTR FS:[0]

00460C51 >PUSH EAX

00460C52 >MOV DWORD PTR FS:[0],ESP

00460C59 >SUB ESP,68



拿出LordPE程序dump主程序。



第二步:修复IAT

上面dump后打开ImportREC在入口地址填60C3C 按自动搜索IAT 发现IAT表的首地址是46D000,大小00000B24

记下这个地址,重新加载主程序,重复上面的过程,直到bp VirtualProtect后发现内存地址不在4XXXXXXX范围时,

堆栈中为

0012C0DC 00B5DB42 /CALL 到 VirtualProtect 来自 00B5DB3C ;<--看这里

0012C0E0 00401000 |Address = Go6000.00401000

0012C0E4 0006C000 |Size = 6C000 (442368.)

0012C0E8 00000004 |NewProtect = PAGE_READWRITE

0012C0EC 0012D7FC \pOldProtect = 0012D7FC



Alt F9回到主程序中,直到回到主程序时是下面的代码:

00B5E866 CALL DWORD PTR DS:[B6C134] ; kernel32.VirtualProtect

00B5E86C PUSH 1 ;Alt F9回到的地方

00B5E86E POP EAX

00B5E86F TEST EAX,EAX

00B5E871 JE 00B5EBF0

00B5E877 AND WORD PTR SS:[EBP-1884],0

00B5E87F AND DWORD PTR SS:[EBP-188C],0

00B5E886 AND DWORD PTR SS:[EBP-1888],0

00B5E88D MOV EAX,DWORD PTR SS:[EBP-1378]

00B5E893 MOVSX EAX,BYTE PTR DS:[EAX]

00B5E896 TEST EAX,EAX

00B5E898 JNZ 00B5E9AA

00B5E89E MOV DWORD PTR SS:[EBP-18DC],0B479AB

00B5E8A8 MOV DWORD PTR SS:[EBP-18D8],0B478FC

00B5E8B2 MOV DWORD PTR SS:[EBP-18D4],0B4791F

00B5E8BC MOV DWORD PTR SS:[EBP-18D0],0B47932

00B5E8C6 MOV DWORD PTR SS:[EBP-18CC],0B4796F

00B5E8D0 MOV DWORD PTR SS:[EBP-18C8],0B47974

00B5E8DA MOV DWORD PTR SS:[EBP-18C4],0B47979

00B5E8E4 MOV DWORD PTR SS:[EBP-18C0],0B479E0

00B5E8EE MOV DWORD PTR SS:[EBP-18BC],0B4797E

00B5E8F8 MOV DWORD PTR SS:[EBP-18B8],0B479A4

00B5E902 MOV DWORD PTR SS:[EBP-18B4],0B479AB

00B5E90C MOV DWORD PTR SS:[EBP-18B0],0B478FC

00B5E916 MOV DWORD PTR SS:[EBP-18AC],0B4791F

00B5E920 MOV DWORD PTR SS:[EBP-18A8],0B47932

00B5E92A MOV DWORD PTR SS:[EBP-18A4],0B479D1

00B5E934 MOV DWORD PTR SS:[EBP-18A0],0B479D6

00B5E93E MOV DWORD PTR SS:[EBP-189C],0B479DB

00B5E948 MOV DWORD PTR SS:[EBP-1898],0B479E0

00B5E952 MOV DWORD PTR SS:[EBP-1894],0B4797E

00B5E95C MOV DWORD PTR SS:[EBP-1890],0B47A06

00B5E966 LEA ECX,DWORD PTR SS:[EBP-13A4]

00B5E96C CALL 00B41040

00B5E971 MOVZX EAX,AL

00B5E974 CDQ

00B5E975 PUSH 14

00B5E977 POP ECX

00B5E978 IDIV ECX

00B5E97A MOV EAX,DWORD PTR SS:[EBP-1668]

00B5E980 MOV ECX,DWORD PTR SS:[EBP EDX*4-18DC]

00B5E987 MOV DWORD PTR DS:[EAX],ECX

00B5E989 MOV EAX,DWORD PTR SS:[EBP-1668]

00B5E98F ADD EAX,4

00B5E992 MOV DWORD PTR SS:[EBP-1668],EAX

00B5E998 MOV EAX,DWORD PTR SS:[EBP-1378]

00B5E99E INC EAX

00B5E99F MOV DWORD PTR SS:[EBP-1378],EAX

00B5E9A5 JMP 00B5EBF0

00B5E9AA MOV EAX,DWORD PTR SS:[EBP-1378]

00B5E9B0 MOVZX EAX,BYTE PTR DS:[EAX]

00B5E9B3 CMP EAX,0FF

00B5E9B8 JNZ 00B5EA48

00B5E9BE MOV EAX,DWORD PTR SS:[EBP-1378]

00B5E9C4 INC EAX

00B5E9C5 MOV DWORD PTR SS:[EBP-1378],EAX

00B5E9CB MOV EAX,DWORD PTR SS:[EBP-1378]

00B5E9D1 MOV AX,WORD PTR DS:[EAX]

00B5E9D4 MOV WORD PTR SS:[EBP-1884],AX

00B5E9DB MOV EAX,DWORD PTR SS:[EBP-1378]

00B5E9E1 INC EAX

00B5E9E2 INC EAX

00B5E9E3 MOV DWORD PTR SS:[EBP-1378],EAX

00B5E9E9 CMP DWORD PTR SS:[EBP-1654],0

00B5E9F0 JE SHORT 00B5EA43

00B5E9F2 MOV EAX,DWORD PTR SS:[EBP-1654]

00B5E9F8 MOV DWORD PTR SS:[EBP-18E0],EAX

00B5E9FE JMP SHORT 00B5EA0F

00B5EA00 MOV EAX,DWORD PTR SS:[EBP-18E0]

00B5EA06 ADD EAX,0C

00B5EA09 MOV DWORD PTR SS:[EBP-18E0],EAX

00B5EA0F MOV EAX,DWORD PTR SS:[EBP-18E0]

00B5EA15 CMP DWORD PTR DS:[EAX 8],0

00B5EA19 JE SHORT 00B5EA43

00B5EA1B MOVZX EAX,WORD PTR SS:[EBP-1884]

00B5EA22 MOV ECX,DWORD PTR SS:[EBP-18E0]

00B5EA28 MOVZX ECX,WORD PTR DS:[ECX 4]

00B5EA2C CMP EAX,ECX

00B5EA2E JNZ SHORT 00B5EA41

00B5EA30 MOV EAX,DWORD PTR SS:[EBP-18E0]

00B5EA36 MOV EAX,DWORD PTR DS:[EAX 8]

00B5EA39 MOV DWORD PTR SS:[EBP-1888],EAX

00B5EA3F JMP SHORT 00B5EA43

00B5EA41 JMP SHORT 00B5EA00

00B5EA43 JMP 00B5EAE3

00B5EA48 MOV EAX,DWORD PTR SS:[EBP-1378]

00B5EA4E MOV DWORD PTR SS:[EBP-188C],EAX

00B5EA54 PUSH 0

00B5EA56 PUSH DWORD PTR SS:[EBP-1378]

00B5EA5C CALL 00B64A80

00B5EA61 POP ECX

00B5EA62 POP ECX

00B5EA63 INC EAX

00B5EA64 MOV DWORD PTR SS:[EBP-1378],EAX

00B5EA6A CMP DWORD PTR SS:[EBP-1654],0

00B5EA71 JE SHORT 00B5EAE3

00B5EA73 MOV EAX,DWORD PTR SS:[EBP-1654]

00B5EA79 MOV DWORD PTR SS:[EBP-18E4],EAX

00B5EA7F JMP SHORT 00B5EA90

00B5EA81 MOV EAX,DWORD PTR SS:[EBP-18E4]

00B5EA87 ADD EAX,0C

00B5EA8A MOV DWORD PTR SS:[EBP-18E4],EAX

00B5EA90 MOV EAX,DWORD PTR SS:[EBP-18E4]

00B5EA96 CMP DWORD PTR DS:[EAX 8],0

00B5EA9A JE SHORT 00B5EAE3

00B5EA9C PUSH 100

00B5EAA1 LEA EAX,DWORD PTR SS:[EBP-19E4]

00B5EAA7 PUSH EAX

00B5EAA8 MOV EAX,DWORD PTR SS:[EBP-18E4]

00B5EAAE PUSH DWORD PTR DS:[EAX]

00B5EAB0 CALL 00B4509A

00B5EAB5 ADD ESP,0C

00B5EAB8 LEA EAX,DWORD PTR SS:[EBP-19E4]

00B5EABE PUSH EAX

00B5EABF PUSH DWORD PTR SS:[EBP-188C]

00B5EAC5 CALL 00B6B950

00B5EACA POP ECX

00B5EACB POP ECX

00B5EACC TEST EAX,EAX

00B5EACE JNZ SHORT 00B5EAE1

00B5EAD0 MOV EAX,DWORD PTR SS:[EBP-18E4]

00B5EAD6 MOV EAX,DWORD PTR DS:[EAX 8]

00B5EAD9 MOV DWORD PTR SS:[EBP-1888],EAX

00B5EADF JMP SHORT 00B5EAE3

00B5EAE1 JMP SHORT 00B5EA81

00B5EAE3 CMP DWORD PTR SS:[EBP-1888],0

00B5EAEA JNZ SHORT 00B5EB2B

00B5EAEC MOVZX EAX,WORD PTR SS:[EBP-1884]

00B5EAF3 TEST EAX,EAX

00B5EAF5 JE SHORT 00B5EB06

00B5EAF7 MOVZX EAX,WORD PTR SS:[EBP-1884]

00B5EAFE MOV DWORD PTR SS:[EBP-2C50],EAX

00B5EB04 JMP SHORT 00B5EB12

00B5EB06 MOV EAX,DWORD PTR SS:[EBP-188C]

00B5EB0C MOV DWORD PTR SS:[EBP-2C50],EAX

00B5EB12 PUSH DWORD PTR SS:[EBP-2C50]

00B5EB18 PUSH DWORD PTR SS:[EBP-1650]

00B5EB1E CALL 00B46EF7

00B5EB23 POP ECX

00B5EB24 POP ECX

00B5EB25 MOV DWORD PTR SS:[EBP-1888],EAX

00B5EB2B CMP DWORD PTR SS:[EBP-1888],0

00B5EB32 JNZ 00B5EBCE

00B5EB38 MOVZX EAX,WORD PTR SS:[EBP-1884]

00B5EB3F TEST EAX,EAX

00B5EB41 JE SHORT 00B5EB96

00B5EB43 CALL DWORD PTR DS:[B6C0D4] ; ntdll.RtlGetLastWin32Error

00B5EB49 CMP EAX,32

00B5EB4C JNZ SHORT 00B5EB5A

00B5EB4E MOV DWORD PTR SS:[EBP-1888],0B46EEC

00B5EB58 JMP SHORT 00B5EB94

00B5EB5A MOV EAX,DWORD PTR SS:[EBP 8]

00B5EB5D MOV EAX,DWORD PTR DS:[EAX]

00B5EB5F MOV DWORD PTR DS:[EAX],3

00B5EB65 CALL DWORD PTR DS:[B6C0D4] ; ntdll.RtlGetLastWin32Error

00B5EB6B PUSH EAX

00B5EB6C MOVZX EAX,WORD PTR SS:[EBP-1884]

00B5EB73 PUSH EAX

00B5EB74 PUSH DWORD PTR SS:[EBP-1770]

00B5EB7A PUSH 0B72120 ; ASCII "File "%s", ordinal %d (error %d)"

00B5EB7F MOV EAX,DWORD PTR SS:[EBP 8]

00B5EB82 PUSH DWORD PTR DS:[EAX 4]

00B5EB85 CALL 00B64B3C

00B5EB8A ADD ESP,14

00B5EB8D XOR EAX,EAX

00B5EB8F JMP 00B5F824

00B5EB94 JMP SHORT 00B5EBCE

00B5EB96 MOV EAX,DWORD PTR SS:[EBP 8]

00B5EB99 MOV EAX,DWORD PTR DS:[EAX]

00B5EB9B MOV DWORD PTR DS:[EAX],3

00B5EBA1 CALL DWORD PTR DS:[B6C0D4] ; ntdll.RtlGetLastWin32Error

00B5EBA7 PUSH EAX

00B5EBA8 PUSH DWORD PTR SS:[EBP-188C]

00B5EBAE PUSH DWORD PTR SS:[EBP-1770]

00B5EBB4 PUSH 0B720FC ; ASCII "File "%s", function "%s" (error %d)"

00B5EBB9 MOV EAX,DWORD PTR SS:[EBP 8]

00B5EBBC PUSH DWORD PTR DS:[EAX 4]

00B5EBBF CALL 00B64B3C

00B5EBC4 ADD ESP,14

00B5EBC7 XOR EAX,EAX

00B5EBC9 JMP 00B5F824

00B5EBCE MOV EAX,DWORD PTR SS:[EBP-1668]

00B5EBD4 MOV ECX,DWORD PTR SS:[EBP-1888]

00B5EBDA MOV DWORD PTR DS:[EAX],ECX

00B5EBDC MOV EAX,DWORD PTR SS:[EBP-1668]

00B5EBE2 ADD EAX,4

00B5EBE5 MOV DWORD PTR SS:[EBP-1668],EAX

00B5EBEB JMP 00B5E86C





这段代码就是解码和加密IAT表的地方,查找的方法就是上面说的,比较容易。所以下次脱这种壳时就不要分二步了



经分析发现:

00B5E980 MOV ECX,DWORD PTR SS:[EBP EDX*4-18DC]

00B5E987 MOV DWORD PTR DS:[EAX],ECX <--这里



上面这个地址就是把输入表的模块分段数据用加密地址代替,所以把上面的代码修改为:



00B5E980 XOR ECX,ECX



恢复分段标志00 00 00 00



又发现:

00B5EA6A CMP DWORD PTR SS:[EBP-1654],0

00B5EA71 JE SHORT 00B5EAE3 <--这里



上面这个地址就是通过标志加密输入表的地方,修改为JMP即可:



00B5EA6A CMP DWORD PTR SS:[EBP-1654],0

00B5EA71 JMP SHORT 00B5EAE3 ; <---********这里改为jmp



修改完成后,在内存窗口中下代码段的访问中断,F9运行中断在入口地址处,用ImportREC修复IAT成功。



第三步:去暗桩



运行ImportREC修复后的程序,发现程序无法运行且出现系统内存减小的错误。用OD加载,F9运行发现程序进入了这个死循环:



004107FE CALL EDI // 效验函数

00410800 TEST BL,BL

00410802 MOV EDI,EAX

00410804 JNZ SHORT dumped_.00410815 // 修改

00410806 PUSH 1F40 \

0041080B CALL | <--死循环

00410810 ADD ESP,4 |

00410813 JMP SHORT dumped_.00410806 /





修改上面的代码:



00410804 Jmp SHORT dumped_.00410815



用OD保存修改,再次运行程序,出现错误如果你的OD设置为及时调试程序,那么按‘取消’键就会调出OD的调试窗口,调试加载后在

堆栈窗口中发现这个错误是



0012EC44 00446175 返回到 dumped_?00446175 来自

0012EC48 00000000



在代码窗口中Ctrl G输入446175地址,回到程序中:



00446164 JMP SHORT dumped_?00446168

00446166 XOR ESI,ESI

00446168 PUSH 0

0044616A LEA ECX,DWORD PTR DS:[ESI 2CC]

00446170 CALL

00446175 PUSH 0

00446177 MOV ECX,ESI



发现是00446170 CALL 这个函数出现的错误,向上看看:





00446108 PUSH 0

0044610A PUSH 186A8

0044610F LEA ECX,DWORD PTR SS:[ESP 28]

00446113 CALL

00446118 LEA EDX,DWORD PTR SS:[ESP B]

0044611C PUSH EBX

0044611D PUSH EDX

0044611E LEA ECX,DWORD PTR SS:[ESP 28]

00446122 CALL

00446127 PUSH dumped_?00480F84

0044612C LEA ECX,DWORD PTR SS:[ESP 1C]

00446130 MOV BYTE PTR SS:[ESP 54],BL

00446134 CALL

00446139 MOV AL,BYTE PTR SS:[ESP B]

0044613D MOV BYTE PTR SS:[ESP 48],3

00446142 CMP AL,9C

00446144 JE SHORT dumped_?0044618D

00446146 CMP AL,0CE

00446148 JE SHORT dumped_?0044618D

0044614A CMP AL,34

0044614C JE SHORT dumped_?0044618D

0044614E CMP AL,1C

00446150 JE SHORT dumped_?0044618D

00446152 CALL

00446157 TEST EAX,EAX

00446159 JE SHORT dumped_?00446166

0044615B MOV EDX,DWORD PTR DS:[EAX]

0044615D MOV ECX,EAX

0044615F CALL DWORD PTR DS:[EDX 7C]

00446162 MOV ESI,EAX

00446164 JMP SHORT dumped_?00446168

00446166 XOR ESI,ESI

00446168 PUSH 0

0044616A LEA ECX,DWORD PTR DS:[ESI 2CC]

00446170 CALL <--这个函数出错

00446175 PUSH 0

00446177 MOV ECX,ESI

00446179 CALL

0044617E PUSH 0FA0

00446183 CALL

00446188 ADD ESP,4

0044618B JMP SHORT dumped_?0044617E

0044618D LEA ECX,DWORD PTR SS:[ESP 20]

00446191 CALL

00446196 LEA ECX,DWORD PTR SS:[ESP 18]

0044619A MOV BYTE PTR SS:[ESP 48],2





分析发现:



00446142 CMP AL,9C

00446144 JE SHORT dumped_?0044618D

00446146 CMP AL,0CE

00446148 JE SHORT dumped_?0044618D

0044614A CMP AL,34

0044614C JE SHORT dumped_?0044618D

0044614E CMP AL,1C

00446150 JE SHORT dumped_?0044618D



都能跳过这个错误的地方,所以把上面的任何一个跳转修改为JMP 无条件跳转即可。修改代码,用OD保存修改后的程序,重新运行OK 到这里程序脱壳修复成功。







fxyang[OCN][BCG][FCG]



2004.3.14


最新评论

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-29 23:22 , Processed in 0.246756 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部