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

脱壳技术,Armadillo V3.6双进程标准壳 ------神速脱壳大法,Armadillo

2010-1-30 18:19| 发布者: admin| 查看: 88| 评论: 0|原作者: 江海


脱壳技术,Armadillo V3.6双进程标准壳 ------神速脱壳大法,Armadillo
2008年06月23日 星期一 下午 04:27
下载页面: http://www.superrsoft.com/cn/srcom.htm

软件大小: 5794 KB

软件语言: 中文

软件类别: 国产软件 / 共享版 / 网络辅助

应用平台: Win9x/NT/2000/XP



【说明】:此破文结合了Fly、mysqladm、pyzpyz、jwh51、骨灰C( MM)大虾们所写的破文,在此谢谢他们了,这是我第一次学OLLYDBG和脱Armadillo的壳,请各位大侠多多指教!



【作者声明】:只作为学习技术用,没有其他任何商业目的,失误之处敬请诸位大侠赐教!



【调试环境】:Win2000、Ollydbg、PEiD、LordPE、ImportREC



—————————————————————————————————

【脱壳过程】:



设置Ollydbg忽略所有的异常选项。用IsDebug 1.4插件去掉Ollydbg的调试器标志。



————————————————————————

一、使程序把自己当成子进程运行

00567000 > $Content$nbsp;60 PUSHAD //进入OD后停在这!

00567001 . E8 00000000 CALL iepro.00567006

00567006 $Content$nbsp;5D POP EBP

00567007 . 50 PUSH EAX

00567008 . 51 PUSH ECX

00567009 . EB 0F JMP SHORT iepro.0056701A



下断:BP OpenMutexA



77E89CE9 > 55 PUSH EBP //断在这,看看堆栈

77E89CEA 8BEC MOV EBP,ESP

77E89CEC 51 PUSH ECX

77E89CED 51 PUSH ECX

77E89CEE 837D 10 00 CMP DWORD PTR SS:[EBP 10],0

77E89CF2 56 PUSH ESI

77E89CF3 74 50 JE SHORT KERNEL32.77E89D45



☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

BP OpenMutexA 时的堆栈:



0012F574 0053E141 /CALL 到 OpenMutexA

0012F578 001F0001 |Access = 1F0001

0012F57C 00000000 |Inheritable = FALSE

0012F580 0012FBB4 \MutexName = "20C::DA3A38CB6B"

0012F584 0012FF04

0012F588 00000000

0012F58C 0055C5D9 iepro.0055C5D9

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆



Ctrl G:401000 键入以下代码



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 B4B2A577 call kernel32.CreateMutexA

00401010 9D popfd

00401011 61 popad

00401012 E9 33F7A577 jmp kernel32.OpenMutexA



在401000处新建起源,F9运行,再次中断在OpenMutexA处。



—————————————————————————————————

二、Magic Jump,避开IAT加密



取消以前断点,下断:BP GetModuleHandleA(为什么不下BP GetModuleHandleA 5呢?因为我试了很多次,用这个断点断不下来,所以改用BP GetModuleHandleA)



77E80978 > 55 PUSH EBP //断在这里

77E80979 8BEC MOV EBP,ESP

77E8097B 837D 08 00 CMP DWORD PTR SS:[EBP 8],0

77E8097F 75 0E JNZ SHORT KERNEL32.77E8098F //重新设置断点在这里

77E80981 64:A1 18000000 MOV EAX,DWORD PTR FS:[18]

77E80987 8B40 30 MOV EAX,DWORD PTR DS:[EAX 30]

77E8098A 8B40 08 MOV EAX,DWORD PTR DS:[EAX 8]

77E8098D EB 14 JMP SHORT KERNEL32.77E809A3

77E8098F FF75 08 PUSH DWORD PTR SS:[EBP 8]

77E80992 E8 2E890000 CALL KERNEL32.77E892C5

77E80997 85C0 TEST EAX,EAX

77E80999 74 08 JE SHORT KERNEL32.77E809A3

77E8099B FF70 04 PUSH DWORD PTR DS:[EAX 4]

77E8099E E8 E2000000 CALL KERNEL32.GetModuleHandleW

77E809A3 5D POP EBP

77E809A4 C2 0400 RETN 4



取消断点,在77E8097F处重新下断点,在这里中断十几次,中间会出现无法处理异常的对话框,用SHIFT F9跳过就行了;Alt F9返回程序。判断返回程序的时机:

☆ ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

注意看BP GetModuleHandleA 时的堆栈变化:



0012BEF8 00BCE3B7 /CALL 到 GetModuleHandleA 来自 00BCE3B1

0012BEFC 00BDF700 \pModule = "kernel32.dll"

0012BF00 00BE0710 ASCII "VirtualAlloc"



0012BEF8 00BCE3D4 /CALL 到 GetModuleHandleA 来自 00BCE3CE

0012BEFC 00BDF700 \pModule = "kernel32.dll"

0012BF00 00BE0704 ASCII "VirtualFree"



//再F9下去就会出现无法处理异常的对话框



0012BC70 |00BB912E 返回到 00BB912E 来自 KERNEL32.GetModuleHandleA

0012BC74 |0012BDAC ASCII "kernel32.dll"



到这里时就用CTRL F9返回主程序:



00BB912E 8B0D 0838BE00 MOV ECX,DWORD PTR DS:[BE3808]

00BB9134 89040E MOV DWORD PTR DS:[ESI ECX],EAX

00BB9137 A1 0838BE00 MOV EAX,DWORD PTR DS:[BE3808]

00BB913C 393C06 CMP DWORD PTR DS:[ESI EAX],EDI

00BB913F 75 16 JNZ SHORT 00BB9157

00BB9141 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]

00BB9147 50 PUSH EAX

00BB9148 FF15 CCA0BD00 CALL DWORD PTR DS:[BDA0CC] KERNEL32.LoadLibraryA

00BB914E 8B0D 0838BE00 MOV ECX,DWORD PTR DS:[BE3808]

00BB9154 89040E MOV DWORD PTR DS:[ESI ECX],EAX

00BB9157 A1 0838BE00 MOV EAX,DWORD PTR DS:[BE3808]

00BB915C 393C06 CMP DWORD PTR DS:[ESI EAX],EDI

00BB915F 0F84 AD000000 JE 00BB9212 //这里就是我们常说的Magic Jump,把它改为JMP

00BB9165 33C9 XOR ECX,ECX

00BB9167 8B03 MOV EAX,DWORD PTR DS:[EBX]

00BB9169 3938 CMP DWORD PTR DS:[EAX],EDI

00BB916B 74 06 JE SHORT 00BB9173



这里所作的修改,可以不需要在IAT处理结束后再还原代码了。



—————————————————————————————————

三、查找入口点



清除上面所有的断点,然后下bp GetCurrentThreadId,继续按F9,中断后注意堆栈的变化:



0012B830 6A281E36 /CALL 到 GetCurrentThreadId 来自 6A281E30 //注意这一行

0012B834 00000001

0012B838 6A281C1A 返回到 6A281C1A 来自 6A281DE2

0012B83C 6A281B60 返回到 6A281B60 来自 6A281B8C



0012B810 6A28353F /CALL 到 GetCurrentThreadId 来自 6A283539

0012B814 00000000

0012B818 6A390470

0012B81C 6A3904D8

0012B820 /0012B838



0012F56C 00BD61D4 /CALL 到 GetCurrentThreadId 来自 00BD61CE //关键

0012F570 0012FF04

0012F574 00000000

0012F578 0055C5D9 iepro.0055C5D9

0012F57C 0053E8C4 iepro.0053E8C4

0012F580 0057D100 iepro.0057D100



当堆栈的地址出现的是主程序的地址时,这时要用CTRL F9返回主程序:



00BD61D4 A3 D47CBE00 MOV DWORD PTR DS:[BE7CD4],EAX

00BD61D9 E8 4032FEFF CALL 00BB941E

00BD61DE 6A 00 PUSH 0

00BD61E0 E8 8F8AFEFF CALL 00BBEC74

00BD61E5 6A 00 PUSH 0

00BD61E7 C705 0CFCBD00 7C>MOV DWORD PTR DS:[BDFC0C],0BE077C ; ASCII "RC"

00BD61F1 E8 9D2CFEFF CALL 00BB8E93

00BD61F6 59 POP ECX

00BD61F7 59 POP ECX

00BD61F8 E8 8F10FFFF CALL 00BC728C

00BD61FD 8BF8 MOV EDI,EAX

00BD61FF A1 BC7BBE00 MOV EAX,DWORD PTR DS:[BE7BBC]

00BD6204 8B48 3C MOV ECX,DWORD PTR DS:[EAX 3C]

00BD6207 3348 14 XOR ECX,DWORD PTR DS:[EAX 14]

00BD620A 3348 10 XOR ECX,DWORD PTR DS:[EAX 10]

00BD620D 03F9 ADD EDI,ECX

00BD620F 8B0E MOV ECX,DWORD PTR DS:[ESI]

00BD6211 85C9 TEST ECX,ECX

00BD6213 75 2F JNZ SHORT 00BD6244

00BD6215 8B78 3C MOV EDI,DWORD PTR DS:[EAX 3C]

00BD6218 E8 6F10FFFF CALL 00BC728C

00BD621D 8B0D BC7BBE00 MOV ECX,DWORD PTR DS:[BE7BBC] ; iepro.00577260

00BD6223 FF76 14 PUSH DWORD PTR DS:[ESI 14]

00BD6226 8B51 14 MOV EDX,DWORD PTR DS:[ECX 14]

00BD6229 FF76 10 PUSH DWORD PTR DS:[ESI 10]

00BD622C 3351 10 XOR EDX,DWORD PTR DS:[ECX 10]

00BD622F FF76 0C PUSH DWORD PTR DS:[ESI C]

00BD6232 33D7 XOR EDX,EDI

00BD6234 03C2 ADD EAX,EDX

00BD6236 8B51 24 MOV EDX,DWORD PTR DS:[ECX 24]

00BD6239 3351 1C XOR EDX,DWORD PTR DS:[ECX 1C]

00BD623C 33D7 XOR EDX,EDI

00BD623E 2BC2 SUB EAX,EDX

00BD6240 FFD0 CALL EAX

00BD6242 EB 25 JMP SHORT 00BD6269

00BD6244 83F9 01 CMP ECX,1

00BD6247 75 22 JNZ SHORT 00BD626B

00BD6249 FF76 04 PUSH DWORD PTR DS:[ESI 4]

00BD624C FF76 08 PUSH DWORD PTR DS:[ESI 8]

00BD624F 6A 00 PUSH 0

00BD6251 E8 3610FFFF CALL 00BC728C

00BD6256 50 PUSH EAX

00BD6257 A1 BC7BBE00 MOV EAX,DWORD PTR DS:[BE7BBC]

00BD625C 8B48 3C MOV ECX,DWORD PTR DS:[EAX 3C]

00BD625F 3348 24 XOR ECX,DWORD PTR DS:[EAX 24]

00BD6262 3348 1C XOR ECX,DWORD PTR DS:[EAX 1C]

00BD6265 2BF9 SUB EDI,ECX

00BD6267 FFD7 CALL EDI //这里F7,飞向光明之颠。

00BD6269 8BD8 MOV EBX,EAX

00BD626B 5F POP EDI

00BD626C 8BC3 MOV EAX,EBX

00BD626E 5E POP ESI

00BD626F 5B POP EBX

00BD6270 C3 RETN



在那个CALL EDI处F7我们就到入口了,这时可以用LORDPE 把主程序DUMP出来了。



—————————————————————————————————

四、修复IAT



好了,运行Import1.6 , OEP填145C ,所有的的函数都完好无缺,FixDump它。好,运行一下,没有问题,然后再拿Lordpe rebuild一下,减小体积。



【后语】自退出破界那么久,再次回来时已经是今非昔比了,如今是长江后浪推前浪,技术不断的发展,我们这些老CRACKER也该歇歇了。


最新评论

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

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

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部