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

菜鸟手动脱壳全过程,脱壳,脱壳技术

2010-1-30 18:25| 发布者: admin| 查看: 113| 评论: 0|原作者: 夙玉


菜鸟手动脱壳全过程,脱壳,脱壳技术
2008年06月23日 星期一 下午 07:53
菜鸟手动脱Armadillo CopyMem-ll Debug-Blocker壳全过程,超详细。。。

【使用工具】 Ollydbg,Loadpe,Imprec1.6F



【脱壳平台】 Win2K



【软件名称】 按键精灵3 V3.11



【加壳方式】 Armadillo 3.00a - 3.60 -> Silicon Realms Toolworks



【保护方式】 Armadillo CopyMem-ll Debug-Blocker



【脱壳人】飞舞的T恤

--------------------------------------------------------------------------------



【脱壳内容】



小弟第一次手动脱壳就碰上了Armadillo CopyMem-ll Debug-Blocker难缠的东东,所以整理了一下两个星期来脱Armadillo CopyMem-ll Debug-Blocker的全过程,希望能给第一次脱Armadillo CopyMem-ll Debug-Blocker新手们一点帮助,始大家少走点弯路(我的弯路走了不少)。



小弟第一次脱壳,本来想从简单的壳开始学习的,可像什么upx、aspack等壳都有工具脱,弄的一点兴趣都没有了(本来脱壳就是想在朋友面前炫一下,有工具脱的壳当然没有挑战性了)。这时忽然发现N久(多久记不到了,反正刚出我就下了,一直没用)前放在咱电脑里的按键精灵3 v3.11,哈哈,小样就从你入手当我脱壳的入门学习吧。



用PEiD.exe一看是Armadillo的壳,运行程序发现进程里有两个按键精灵3.exe,哈哈Armadillo 双进程标准壳。在这之前我先看了weiyi75、fly、csjwaman等大大们的双进程标准壳的脱文。最过选择了照着weiyi75大大的脱文《爱的中体验之Armadillo3.x双进程之Mr.Captor》按步就搬的开脱了。主要是weiyi75[Dfcg]的脱文里的脱法简单易学,对我这个新手来说比较直观简便。



OD载入程序,插件自动隐藏OD,忽略所有异常。



00485000 按> $Content$nbsp; 60 pushad //外壳入口

00485001 . E8 00000000 call 按键精灵.00485006

00485006 $Content$nbsp; 5D pop ebp

00485007 . 50 push eax

00485008 . 51 push ecx

00485009 . EB 0F jmp short 按键精灵.0048501A

.....................................................................



命令行下断点 BP OpenMutexA,F9运行。



中断



77E6C503 K> 55 push ebp

77E6C504 8BEC mov ebp,esp

77E6C506 51 push ecx

77E6C507 51 push ecx

77E6C508 837D 10 00 cmp dword ptr ss:[ebp 10],0

77E6C50C 56 push esi

77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D

.....................................................................



堆栈内容



0012F574 0045C5F1 /CALL 到 OpenMutexA

0012F578 001F0001 |Access = 1F0001

0012F57C 00000000 |Inheritable = FALSE

0012F580 0012FBB4 \MutexName = "2A8:AC7B8F140" //注意MutexName 这个地址 每个机器不同,以看到的为主。



找一块程序领空空地址,写入一些欺骗Arm的代码。



Ctrl G 401000



00401000 0000 ADD BYTE PTR DS:[EAX],AL //都是空地址。

00401002 0000 ADD BYTE PTR DS:[EAX],AL

00401004 0000 ADD BYTE PTR DS:[EAX],AL

00401006 0000 ADD BYTE PTR DS:[EAX],AL

00401008 0000 ADD BYTE PTR DS:[EAX],AL

0040100A 0000 ADD BYTE PTR DS:[EAX],AL

0040100C 0000 ADD BYTE PTR DS:[EAX],AL

0040100E 0000 ADD BYTE PTR DS:[EAX],AL



OD直接双击修改,填入以下代码。



00401000 60 pushad

00401001 9C pushfd

00401002 68 B4FB1200 push 12FBB4 ; ASCII "2A8:AC7B8F140"

00401007 33C0 xor eax,eax

00401009 50 push eax

0040100A 50 push eax

0040100B E8 6D97A677 call KERNEL32.CreateMutexA

00401010 9D popfd

00401011 61 popad

00401012 - E9 ECB4A677 jmp KERNEL32.OpenMutexA

............................................................



将当前的 Eip 77E6C503 切换到 401000 来。



点右键 选在此处新建 Eip ,看到Eip 变为 401000



F9运行。



中断



77E6C503 K> 55 push ebp //双击它或F2清除断点。

77E6C504 8BEC mov ebp,esp

77E6C506 51 push ecx

77E6C507 51 push ecx

77E6C508 837D 10 00 cmp dword ptr ss:[ebp 10],0

77E6C50C 56 push esi

77E6C50D 0F84 4AB90200 je KERNEL32.77E97E5D

............................................................



找 magic jmp 命令行下断点,bp GetModuleHandleA



77E63DFC K> 55 push ebp //F2去掉断点,右键改为硬件执行。

77E63DFD 8BEC mov ebp,esp

77E63DFF 837D 08 00 cmp dword ptr ss:[ebp 8],0

77E63E03 74 18 je short KERNEL32.77E63E1D

77E63E05 FF75 08 push dword ptr ss:[ebp 8]

77E63E08 E8 87FFFFFF call KERNEL32.77E63D94

77E63E0D 85C0 test eax,eax

77E63E0F 74 08 je short KERNEL32.77E63E19

77E63E11 FF70 04 push dword ptr ds:[eax 4]

77E63E14 E8 3F240000 call KERNEL32.GetModuleHandleW

77E63E19 5D pop ebp

77E63E1A C2 0400 retn 4

........................................................................



F9运行,多次硬件中断,注意堆栈值。



7次F9提示一个非法指令错误,Shift F9忽略。

0012BEF8 00B1C807 /CALL 到 GetModuleHandleA 来自 00B1C801

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

0012BF00 00B2E67C ASCII "VirtualAlloc"



0012BEF8 00B1C824 /CALL 到 GetModuleHandleA 来自 00B1C81E

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

0012BF00 00B2E670 ASCII "VirtualFree"



9次F9提示一个非法指令错误,Shift F9忽略。



堆栈内容



0012BC70 00B0799B /CALL 到 GetModuleHandleA 来自 00B07995

0012BC74 0012BDAC \pModule = "kernel32.dll"



点调试菜单,里面清除硬件断点。



Ctrl F9 返回。



00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA

00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]

00B079A1 89040E mov dword ptr ds:[esi ecx],eax

00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]

00B079A9 393C06 cmp dword ptr ds:[esi eax],edi

00B079AC 75 16 jnz short 00B079C4

00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]

00B079B4 50 push eax

00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA

00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]

00B079C1 89040E mov dword ptr ds:[esi ecx],eax

00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]

00B079C9 393C06 cmp dword ptr ds:[esi eax],edi

00B079CC 0F84 AD000000 je 00B07A7F //这是文章中提到的magic jmp,我改。



改为



00B07995 FF15 C480B200 call dword ptr ds:[B280C4] ; KERNEL32.GetModuleHandleA

00B0799B 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]

00B079A1 89040E mov dword ptr ds:[esi ecx],eax

00B079A4 A1 E011B300 mov eax,dword ptr ds:[B311E0]

00B079A9 393C06 cmp dword ptr ds:[esi eax],edi

00B079AC 75 16 jnz short 00B079C4

00B079AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]

00B079B4 50 push eax

00B079B5 FF15 CC80B200 call dword ptr ds:[B280CC] ; KERNEL32.LoadLibraryA

00B079BB 8B0D E011B300 mov ecx,dword ptr ds:[B311E0]

00B079C1 89040E mov dword ptr ds:[esi ecx],eax

00B079C4 A1 E011B300 mov eax,dword ptr ds:[B311E0]

00B079C9 393C06 cmp dword ptr ds:[esi eax],edi

00B079CC E9 AE000000 jmp 00B07A7F //修改 (我试过改标志位Z)



.........................................................



清除所有断点。在401000段下内存断点,按F9



00B206B2 8B04B0 mov eax,dword ptr ds:[eax esi*4] //来到这里

00B206B5 3341 54 xor eax,dword ptr ds:[ecx 54]

00B206B8 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260

00B206BE 3341 04 xor eax,dword ptr ds:[ecx 4]

00B206C1 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260

00B206C7 3341 74 xor eax,dword ptr ds:[ecx 74]

00B206CA 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260

00B206D0 3341 30 xor eax,dword ptr ds:[ecx 30]

00B206D3 8B0D 9455B300 mov ecx,dword ptr ds:[B35594] ; 按键精灵.00495260

00B206D9 3341 20 xor eax,dword ptr ds:[ecx 20]



提示被调试程序无法处理异常,Shift F9忽略,game over程序退出。



天哪,我错在那里啦!我怎么就到不了“push ebp //到达地球人都知道的位置”



想想第一次脱壳,没这么顺利也是正常的,那么我们在试试其他大大的方法,在后来三、四天里偶用了能找到的脱标准壳的方法来脱它,TMD没一个成功的,这期间每天晚上19点到1点,我都在学习研究各各armadillo标准壳的脱法,搞的每天上班没精神。还是没有一点收获,总不能半途而废吧?去论谈上问问各位大虾吧。。。



期间loveboom大大成给于提示说“可能不是标准双进程壳或是高版本的,所以你按双进程的来脱是不行的”可对于新手的我来说,说了等于白说,希望下次小弟提问时,各们大大能提供详细一点的资料。。。^_^



后来还多亏wangli_com大大的指点。。。



先找oep,在OD中重开程序,下bp WaitForDebugEvent,F9运行



77E7A6CF K> 55 push ebp //来到这里,F2清除断点

77E7A6D0 8BEC mov ebp,esp

77E7A6D2 81EC 9C000000 sub esp,9C

77E7A6D8 53 push ebx

77E7A6D9 56 push esi

77E7A6DA 57 push edi



看堆栈窗口



0012DA98 0046AD67 /CALL 到 WaitForDebugEvent 来自 按键精灵.0046AD61

0012DA9C 0012EB5C |pDebugEvent = 0012EB5C

0012DAA0 000003E8 \Timeout = 1000. ms



在0012EB5C上下转存中跟随



在下bp WriteProcessMemory,F9运行



77E7ADB9 K> 55 push ebp //来到这里

77E7ADBA 8BEC mov ebp,esp

77E7ADBC 51 push ecx

77E7ADBD 51 push ecx

77E7ADBE 8B45 0C mov eax,dword ptr ss:[ebp C]

77E7ADC1 53 push ebx

77E7ADC2 8945 F8 mov dword ptr ss:[ebp-8],eax



看数据转存窗口



0012EB5C 01 00 00 00 68 03 00 00 ...h ..

0012EB64 C4 00 00 00 01 00 00 80 ?.. ..

0012EB6C 00 00 00 00 00 00 00 00 ........

0012EB74 00 CC 43 00 02 00 00 00 .藽. ... //大家看到没有43CC00就是OEP



再在OD中重开程序,下硬件断点:he WaitForDebugEvent,运行停住。回到壳空间,查找常数FFFFFFF8,得到结果:



0046B3D6 OR EAX, FFFFFFF8

0046B3F1 OR EDX, FFFFFFF8

0046B41A OR ECX, FFFFFFF8

0046B8F0 OR EDX, FFFFFFF8

0046B90B OR ECX, FFFFFFF8

0046B933 OR EAX, FFFFFFF8



在0046B3D6上双击,来到这代码处,朝上几行看:



0046B38A 83BD D0F5FFFF 00 cmp dword ptr ss:[ebp-A30],0 //这就是tDasm大侠文中提到的关键代码。



0046B391 0F8C A9020000 jl 按键精灵.0046B640

0046B397 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]

0046B39D 3B0D E4B54900 cmp ecx,dword ptr ds:[49B5E4]

0046B3A3 0F8D 97020000 jge 按键精灵.0046B640

0046B3A9 8B95 44F6FFFF mov edx,dword ptr ss:[ebp-9BC]

0046B3AF 81E2 FF000000 and edx,0FF

0046B3B5 85D2 test edx,edx

0046B3B7 0F84 AD000000 je 按键精灵.0046B46A

0046B3BD 6A 00 push 0

0046B3BF 8BB5 D0F5FFFF mov esi,dword ptr ss:[ebp-A30]

0046B3C5 C1E6 04 shl esi,4

0046B3C8 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]

0046B3CE 25 07000080 and eax,80000007

0046B3D3 79 05 jns short 按键精灵.0046B3DA

0046B3D5 48 dec eax

0046B3D6 83C8 F8 or eax,FFFFFFF8 //断在这里向上看

0046B3D9 40 inc eax

0046B3DA 33C9 xor ecx,ecx

0046B3DC 8A88 809A4900 mov cl,byte ptr ds:[eax 499A80]

0046B3E2 8B95 D0F5FFFF mov edx,dword ptr ss:[ebp-A30]

0046B3E8 81E2 07000080 and edx,80000007

0046B3EE 79 05 jns short 按键精灵.0046B3F5

0046B3F0 4A dec edx

0046B3F1 83CA F8 or edx,FFFFFFF8

0046B3F4 42 inc edx

0046B3F5 33C0 xor eax,eax

0046B3F7 8A82 819A4900 mov al,byte ptr ds:[edx 499A81]

0046B3FD 8B3C8D 60524900 mov edi,dword ptr ds:[ecx*4 495260]

0046B404 333C85 60524900 xor edi,dword ptr ds:[eax*4 495260]

0046B40B 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]

0046B411 81E1 07000080 and ecx,80000007

0046B417 79 05 jns short 按键精灵.0046B41E

0046B419 49 dec ecx

0046B41A 83C9 F8 or ecx,FFFFFFF8

0046B41D 41 inc ecx

0046B41E 33D2 xor edx,edx

0046B420 8A91 829A4900 mov dl,byte ptr ds:[ecx 499A82]

0046B426 333C95 60524900 xor edi,dword ptr ds:[edx*4 495260]

0046B42D 8B85 D0F5FFFF mov eax,dword ptr ss:[ebp-A30]

0046B433 99 cdq

0046B434 B9 1C000000 mov ecx,1C

0046B439 F7F9 idiv ecx

0046B43B 8BCA mov ecx,edx

0046B43D D3EF shr edi,cl

0046B43F 83E7 0F and edi,0F

0046B442 03F7 add esi,edi

0046B444 8B15 D4B54900 mov edx,dword ptr ds:[49B5D4]

0046B44A 8D04B2 lea eax,dword ptr ds:[edx esi*4]

0046B44D 50 push eax

0046B44E 8B8D D0F5FFFF mov ecx,dword ptr ss:[ebp-A30]

0046B454 51 push ecx

0046B455 E8 FF1F0000 call 按键精灵.0046D459

0046B45A 83C4 0C add esp,0C

0046B45D 25 FF000000 and eax,0FF 《--- 修改此处

0046B462 85C0 test eax,eax



在0046B38A处下一硬件执行断点,运行停住。 按照tDasm的方法,修改代码为:



0046B45D FF05 48EB1200 inc dword ptr ds:[12EB48]

0046B463 C705 E8B54900 010000>mov dword ptr ds:[49B5E8],1

0046B46D ^ E9 18FFFFFF jmp 按键精灵.0046B38A



把12EB48处置0,去掉所有硬件断点,并在0046b640处下断,运行,停住。好,所有代码都强制解压完成。



运行LordPE,选择第2个进程(有2个同名进程),即可完全dump出来了。



dump出来了还不能用啦,怎么办,修复IAT表,怎么修复wangli_com大大没说,查看其它大大的脱文大都是跳过magic jmp后用Imprec1.6f选择进程,填入Oep,自动搜索。我试我试,怎么不行找不到IAT数据。经过N次失败后,我都要对armadillo妥协了。。。



怎么办了,自己搞不定就去查资料啦,后来我在密界脱壳文集中找到了tDasm大大的原文〈Armadillo 3.6主程序脱壳〉〈Armadillo 3.6主程序IAT处理〉,照着方法又从脱了一遍非常顺利,当到了IAT处理的时候,tDasm大大文中提到的方法一时无法理解,照着做都会跟飞。

没办法继续找方法哎,当看到jwh51大大的《Armadillo COPYMEMEII之DUMP的一个LOADPE小插件》,我又照着脱了一遍,哈哈原来有这么方便的方法啦,跟tDasm大大的方法原理差不多,当步聚简单的多,新手脱不容易出错,强烈推荐。



在当我看到骨灰C姐姐的《实战Armadillo3.60 Original CopyMem-ll Debug-Blocker -----UltraEdit》文章后,解开了困惑了我三、四天的IAT表修复问题(建议新手可以学习但最好不用骨灰C姐姐的脱壳方法,她的原理和tDasm、jwh51等大大的方法一样,但过程复杂,容易出错)



好言归正传,我们来修复IAT表。。。



我们用OD载入dump出来的文件,F8单步执行。



0043CC00 1> 55 push ebp //程序入口OEP

0043CC01 8BEC mov ebp,esp

0043CC03 6A FF push -1

0043CC05 68 189C4400 push 111.00449C18

0043CC0A 68 5ECD4300 push 111.0043CD5E

0043CC0F 64:A1 00000000 mov eax,dword ptr fs:[0]

0043CC15 50 push eax

0043CC16 64:8925 00000000 mov dword ptr fs:[0],esp

0043CC1D 83EC 68 sub esp,68

0043CC20 53 push ebx

0043CC21 56 push esi

0043CC22 57 push edi

0043CC23 8965 E8 mov dword ptr ss:[ebp-18],esp

0043CC26 33DB xor ebx,ebx

0043CC28 895D FC mov dword ptr ss:[ebp-4],ebx

0043CC2B 6A 02 push 2

0043CC2D FF15 5C4B4400 call dword ptr ds:[444B5C] //执行到这里我们的程序就飞了



OD重头来一遍,当执行到43CC2D,我们在数据窗口ctrl_G 444b5c是不是看到很多77之类的东西,哈哈,这就是IAT表的存放地,我们顺着向上看,来到数据窗口顶部地址444000就是IAT表的起始地址,我们拿笔记下。



在OD重新载入按键精灵3.exe,忽略所有异常,bp DebugActiveProcess,F9断下。看堆栈窗口:



0012DA9C 0046ABDB /CALL 到 DebugActiveProcess 来自 按键精灵.0046ABD5

0012DAA0 000003CC \ProcessId = 3CC ―――>子进程句柄



打开另一个OD附加3CC这个子进程。然后ALT+F9返回程序



00485000 按>- EB FE jmp short 按键精灵. //断在这里

00485002 0000 add byte ptr ds:[eax],al

00485004 0000 add byte ptr ds:[eax],al

00485006 5D pop ebp

00485007 50 push eax

00485008 51 push ecx



还原代码,不然是死循环,还原开头两行二进制: 60 E8 为 60 E8



00485000 按> 60 pushad

00485001 E8 00000000 call 按键精灵.00485006

00485006 5D pop ebp

00485007 50 push eax

00485008 51 push ecx



OK,BP OpenMutexA,F9后中断,不要清除断点,按照前面说的脱标准壳的方法来一遍,修改完magic jmp后,在直接按F9中断。

用Imprec1.6f选择进程3CC,填入OEP地址3CC00,填入RAV(出就是IAT地址)44000,不要按自动搜索IAT,直接按获取输入表,再按显示无效地址,剪掉修复抓取文件就OK了。



到现在脱壳完毕,脱壳后文件大小1.5M,感觉不爽的可以参加yesky1大大的《脱壳后软件减肥大法》非常简单,减肥后文件大小728KB。。。



如果对armadillo壳还有不懂的,可以加我QQ:120471426,共同学习。。。其它壳就算了,我没还试过了。。。。


最新评论

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

GMT+8, 2024-9-29 17:26 , Processed in 0.107466 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部