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

爱的中体验之Armadillo3.x仿Fly大侠的壹次脱壳法之Mr.Captor(图),Armadillo,加壳技术

2010-1-30 18:26| 发布者: admin| 查看: 69| 评论: 0|原作者: 小寳寳


爱的中体验之Armadillo3.x仿Fly大侠的壹次脱壳法之Mr.Captor(图),Armadillo,加壳技术
2008年06月23日 星期一 下午 08:02
【脱文标题】 爱的中体验之Armadillo3.x仿Fly大侠的壹次脱壳法之Mr.Captor



【脱文作者】 weiyi75[Dfcg]



【作者邮箱】 weiyi75@sohu.com



【作者主页】 Dfcg官方大本营 --- http://www.chinadfcg.com/



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



【脱壳平台】 Win2K



【软件名称】 Mr.Captor



【软件简介】 Mr.Captor 是一个非常好用的屏幕截图程序!他可以帮助你把看到的任何图片忠实的保留下来!并可以保存为BMP, PCX, GIF, JPEG, PNG, TIFF, TGA, CUR, ICO, AVI等格式!支持自定义热键!非常容易使用呀!



【软件大小】 1686 KB



【下载页面 http://www.skycn.com/soft/11437.html



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



【保护方式】 标准方式加壳



【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:



前言,在看雪论坛看了Fly大侠写的脱文,就这篇看懂了,为了使大家学习Fly大侠的技术,我仿真了这篇脱文。可能因为Mr.Captor V2.7 版被Fly脱壳加破解,作者一怒之下没有加Arm双进程了,有点可惜啊。



MrCaptor.exe用PEiD查壳 Armadillo 3.00a-3.61,运行看是单进程的标准壳。



以前脱Armadillo标准壳一般有两种流程的操作方法:



1、先走到OEP,脱壳。第2次调试,找到并直接修改Magic Jump处为JMP,得到输入表,这时程序无法运行,但IAT可以修复。



2、在Magic Jump 处下硬件断点,每次改变标志位使其跳转,继续内存断点到达OEP,这样也是一次就脱壳、修复输入表,但是很慢。



这个程序判断软件过期代码在壳里面,脱壳后日期限制也不存在,过分依耐壳也是共享软件被破解的原因。



现在科技这么发达,下载一个自动隐藏OD插件,我已经在论坛里给出下载地址,以后根本无需隐藏OD调试,用抗AntiDbg 的OD--Ukillod 调试猛壳也很省心,和原版Od无任何区别,只是增加了反Anti功能。OD载入程序,忽略所有异常。



脱Arm标准壳一般分两个步骤。



1.找magic jmp 调试过几个arm壳发现,magic jmp 位置和GetModuleHandleA 非常近。



2.找oep,在入口脱壳程序。注意Arm修改了Pe头,让OD插件无法脱壳,但对Loadpe一点效果都没有。



我用Fly大侠的 BP GetModuleHandleA 5 软硬断点都无法断下来,可能我运气不好,于是用GetModuleHandleA

硬断点,注意Arm壳严格校验普通断点,至少我机器上面是这样的,普通断点经常导致各种异常导致程序直接退出。



因为这个程序没有Nag提示,所以命令行直接下断点



BP GetModuleHandleA



修改普通断点为硬件断点,取消普通断点



004BD000 > 60 PUSHAD //外壳入口代码

004BD001 E8 00000000 CALL MrCaptor.004BD006

004BD006 5D POP EBP

004BD007 50 PUSH EAX

004BD008 51 PUSH ECX

004BD009 EB 0F JMP SHORT MrCaptor.004BD01A

004BD00B B9 EB0FB8EB MOV ECX,EBB80FEB

004BD010 07 POP ES ; 修正的段位寄存器

004BD011 B9 EB0F90EB MOV ECX,EB900FEB

004BD016 08FD OR CH,BH

004BD018 EB 0B JMP SHORT MrCaptor.004BD025

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



F9运行Arm典型的两个异常,Shift F9 忽略。



异常1



004BF4A3 F0: PREFIX LOCK: ; 多余的前缀

004BF4A4 F0:C7 ??? ; 未知命令

004BF4A6 C8 6033C9 ENTER 3360,0C9

004BF4AA 75 02 JNZ SHORT MrCaptor.004BF4AE

004BF4AC EB 15 JMP SHORT MrCaptor.004BF4C3

004BF4AE EB 33 JMP SHORT MrCaptor.004BF4E3

004BF4B0 C9 LEAVE

004BF4B1 75 18 JNZ SHORT MrCaptor.004BF4CB

004BF4B3 7A 0C JPE SHORT MrCaptor.004BF4C1

004BF4B5 70 0E JO SHORT MrCaptor.004BF4C5

004BF4B7 EB 0D JMP SHORT MrCaptor.004BF4C6

004BF4B9 E8 720E79F1 CALL F1C50330

004BF4BE FF15 00790974 CALL DWORD PTR DS:[74097900]

004BF4C4 F0:EB 87 LOCK JMP SHORT MrCaptor.004BF44E ; 锁定前缀是不允许的

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



异常2



004BF5BC F0: PREFIX LOCK: ; 多余的前缀

004BF5BD F0:C7 ??? ; 未知命令

004BF5BF C8 64678F ENTER 6764,8F

004BF5C3 06 PUSH ES

004BF5C4 0000 ADD BYTE PTR DS:[EAX],AL

004BF5C6 83C4 04 ADD ESP,4

004BF5C9 8B85 5E3E0000 MOV EAX,DWORD PTR SS:[EBP 3E5E]

004BF5CF 60 PUSHAD

004BF5D0 33C9 XOR ECX,ECX

004BF5D2 75 02 JNZ SHORT MrCaptor.004BF5D6

004BF5D4 EB 15 JMP SHORT MrCaptor.004BF5EB

004BF5D6 EB 33 JMP SHORT MrCaptor.004BF60B

004BF5D8 C9 LEAVE

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



GetModuleHandleA 硬件中断1



77E756DB > 55 PUSH EBP

77E756DC 8BEC MOV EBP,ESP

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

77E756E2 0F84 BC670000 JE KERNEL32.77E7BEA4

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

77E756EB E8 B1F6FFFF CALL KERNEL32.77E74DA1

77E756F0 85C0 TEST EAX,EAX

77E756F2 74 08 JE SHORT KERNEL32.77E756FC

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

77E756F7 E8 C384FFFF CALL KERNEL32.GetModuleHandleW

77E756FC 5D POP EBP

77E756FD C2 0400 RETN 4



堆栈提示



0012D8F8 77CAADB7 /CALL 到 GetModuleHandleA 来自 77CAADB1

0012D8FC 77CAC4B0 \pModule = "KERNEL32.DLL" //注意不断改变的参数。

0012D900 77D0FA08

0012D904 00000094

0012D908 00000005

0012D90C 00000000

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



继续F9八次直到



77E756DB > 55 PUSH EBP

77E756DC 8BEC MOV EBP,ESP

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

77E756E2 0F84 BC670000 JE KERNEL32.77E7BEA4

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

77E756EB E8 B1F6FFFF CALL KERNEL32.77E74DA1

77E756F0 85C0 TEST EAX,EAX

77E756F2 74 08 JE SHORT KERNEL32.77E756FC

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

77E756F7 E8 C384FFFF CALL KERNEL32.GetModuleHandleW

77E756FC 5D POP EBP

77E756FD C2 0400 RETN 4



堆栈提示



0012BE5C 00C16A5C /CALL 到 GetModuleHandleA 来自 00C16A56

0012BE60 0012BF98 \pModule = "advapi32.dll" //看到这个动态库就要慢些了,有些软件在这里返回就可以到Magic jmp,有些软件在下一次中断返回,总之在附近。

0012BE64 0012EF60

0012BE68 01081BA0

0012BE6C 00000000

0012BE70 00000004

0012BE74 0000CC27

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



在F9一次。



堆栈提示



0012C0E8 00C2E9AC /CALL 到 GetModuleHandleA 来自 00C2E9A6

0012C0EC 00000000 \pModule = NULL

0012C0F0 0012EF60

0012C0F4 01081BA0

0012C0F8 00000000

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



删除硬件断点,Ctrl F9返回.



00C2E9A6 FF15 C4D0C300 CALL DWORD PTR DS:[C3D0C4] ; KERNEL32.GetModuleHandleA

00C2E9AC 3985 B0E9FFFF CMP DWORD PTR SS:[EBP-1650],EAX //返回到这里。

00C2E9B2 75 0F JNZ SHORT 00C2E9C3

00C2E9B4 C785 ACE9FFFF 4>MOV DWORD PTR SS:[EBP-1654],0C41240

00C2E9BE E9 C4000000 JMP 00C2EA87

00C2E9C3 83A5 84E7FFFF 0>AND DWORD PTR SS:[EBP-187C],0

00C2E9CA C785 80E7FFFF 3>MOV DWORD PTR SS:[EBP-1880],0C41838

00C2E9D4 EB 1C JMP SHORT 00C2E9F2

00C2E9D6 8B85 80E7FFFF MOV EAX,DWORD PTR SS:[EBP-1880]

00C2E9DC 83C0 0C ADD EAX,0C

00C2E9DF 8985 80E7FFFF MOV DWORD PTR SS:[EBP-1880],EAX

00C2E9E5 8B85 84E7FFFF MOV EAX,DWORD PTR SS:[EBP-187C]

00C2E9EB 40 INC EAX

00C2E9EC 8985 84E7FFFF MOV DWORD PTR SS:[EBP-187C],EAX

00C2E9F2 8B85 80E7FFFF MOV EAX,DWORD PTR SS:[EBP-1880]

00C2E9F8 8338 00 CMP DWORD PTR DS:[EAX],0

00C2E9FB 0F84 86000000 JE 00C2EA87 //很大一个magic jmp 跳转,注意,修改它为jmp 00a3142a 程序将异常无法继续运行,但IAT已经没有加密了。这里用Fly的另类方法。



先Od直接修改上句为



00C2E9FB /E9 87000000 JMP 00C2EA87

00C2EA00 |90 NOP



00C2EA01 8B85 80E7FFFF MOV EAX,DWORD PTR SS:[EBP-1880]

00C2EA07 8B40 08 MOV EAX,DWORD PTR DS:[EAX 8]

00C2EA0A 83E0 01 AND EAX,1

00C2EA0D 85C0 TEST EAX,EAX

00C2EA0F 74 25 JE SHORT 00C2EA36

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



观察它的流程。



00C2EA87 80A5 A4E9FFFF 0>AND BYTE PTR SS:[EBP-165C],0 //Jmp跳转到这里。

00C2EA8E A1 3CCAC400 MOV EAX,DWORD PTR DS:[C4CA3C]

00C2EA93 8A80 66350000 MOV AL,BYTE PTR DS:[EAX 3566]

00C2EA99 8885 F4D3FFFF MOV BYTE PTR SS:[EBP-2C0C],AL

00C2EA9F 0FB685 F4D3FFFF MOVZX EAX,BYTE PTR SS:[EBP-2C0C]

00C2EAA6 85C0 TEST EAX,EAX

00C2EAA8 74 23 JE SHORT 00C2EACD



00C2EACD 8B85 A8E9FFFF MOV EAX,DWORD PTR SS:[EBP-1658]

00C2EAD3 40 INC EAX

00C2EAD4 8985 A8E9FFFF MOV DWORD PTR SS:[EBP-1658],EAX

00C2EADA 8B85 3CEBFFFF MOV EAX,DWORD PTR SS:[EBP-14C4]

00C2EAE0 0385 A0E9FFFF ADD EAX,DWORD PTR SS:[EBP-1660]

00C2EAE6 8985 B4E9FFFF MOV DWORD PTR SS:[EBP-164C],EAX

00C2EAEC 8B85 B4E9FFFF MOV EAX,DWORD PTR SS:[EBP-164C]

00C2EAF2 8985 98E9FFFF MOV DWORD PTR SS:[EBP-1668],EAX

00C2EAF8 0FB685 A4E9FFFF MOVZX EAX,BYTE PTR SS:[EBP-165C]

00C2EAFF 85C0 TEST EAX,EAX

00C2EB01 74 2E JE SHORT 00C2EB31



00C2EB31 8D85 9CE9FFFF LEA EAX,DWORD PTR SS:[EBP-1664]

00C2EB37 50 PUSH EAX

00C2EB38 6A 04 PUSH 4

00C2EB3A 8B85 A8E9FFFF MOV EAX,DWORD PTR SS:[EBP-1658]

00C2EB40 C1E0 02 SHL EAX,2

00C2EB43 50 PUSH EAX

00C2EB44 8B85 3CEBFFFF MOV EAX,DWORD PTR SS:[EBP-14C4]

00C2EB4A 0385 A0E9FFFF ADD EAX,DWORD PTR SS:[EBP-1660]

00C2EB50 50 PUSH EAX

00C2EB51 FF15 34D1C300 CALL DWORD PTR DS:[C3D134] ; KERNEL32.VirtualProtect

00C2EB57 6A 01 PUSH 1 //这里是个小循环

00C2EB59 58 POP EAX

00C2EB5A 85C0 TEST EAX,EAX

00C2EB5C 0F84 79030000 JE 00C2EEDB

00C2EB62 66:83A5 7CE7FFF>AND WORD PTR SS:[EBP-1884],0

00C2EB6A 83A5 74E7FFFF 0>AND DWORD PTR SS:[EBP-188C],0

00C2EB71 83A5 78E7FFFF 0>AND DWORD PTR SS:[EBP-1888],0

00C2EB78 8B85 88ECFFFF MOV EAX,DWORD PTR SS:[EBP-1378]

00C2EB7E 0FBE00 MOVSX EAX,BYTE PTR DS:[EAX]

00C2EB81 85C0 TEST EAX,EAX

00C2EB83 0F85 0C010000 JNZ 00C2EC95



00C2EC95 8B85 88ECFFFF MOV EAX,DWORD PTR SS:[EBP-1378]

00C2EC9B 0FB600 MOVZX EAX,BYTE PTR DS:[EAX]

00C2EC9E 3D FF000000 CMP EAX,0FF

00C2ECA3 0F85 8A000000 JNZ 00C2ED33



00C2ED33 8B85 88ECFFFF MOV EAX,DWORD PTR SS:[EBP-1378]

00C2ED39 8985 74E7FFFF MOV DWORD PTR SS:[EBP-188C],EAX

00C2ED3F 6A 00 PUSH 0

00C2ED41 FFB5 88ECFFFF PUSH DWORD PTR SS:[EBP-1378]

00C2ED47 E8 D45F0000 CALL 00C34D20

00C2ED4C 59 POP ECX

00C2ED4D 59 POP ECX

00C2ED4E 40 INC EAX

00C2ED4F 8985 88ECFFFF MOV DWORD PTR SS:[EBP-1378],EAX

00C2ED55 83BD ACE9FFFF 0>CMP DWORD PTR SS:[EBP-1654],0

00C2ED5C 74 70 JE SHORT 00C2EDCE



00C2EDCE 83BD 78E7FFFF 0>CMP DWORD PTR SS:[EBP-1888],0

00C2EDD5 75 3F JNZ SHORT 00C2EE16

00C2EDD7 0FB785 7CE7FFFF MOVZX EAX,WORD PTR SS:[EBP-1884]

00C2EDDE 85C0 TEST EAX,EAX

00C2EDE0 74 0F JE SHORT 00C2EDF1



00C2EDF1 8B85 74E7FFFF MOV EAX,DWORD PTR SS:[EBP-188C]

00C2EDF7 8985 B0D3FFFF MOV DWORD PTR SS:[EBP-2C50],EAX

00C2EDFD FFB5 B0D3FFFF PUSH DWORD PTR SS:[EBP-2C50]

00C2EE03 FFB5 B0E9FFFF PUSH DWORD PTR SS:[EBP-1650]

00C2EE09 E8 E780FEFF CALL 00C16EF5

00C2EE0E 59 POP ECX

00C2EE0F 59 POP ECX

00C2EE10 8985 78E7FFFF MOV DWORD PTR SS:[EBP-1888],EAX

00C2EE16 83BD 78E7FFFF 0>CMP DWORD PTR SS:[EBP-1888],0

00C2EE1D 0F85 96000000 JNZ 00C2EEB9



00C2EEB9 8B85 98E9FFFF MOV EAX,DWORD PTR SS:[EBP-1668] ; MrCaptor.00470948

00C2EEBF 8B8D 78E7FFFF MOV ECX,DWORD PTR SS:[EBP-1888]

00C2EEC5 8908 MOV DWORD PTR DS:[EAX],ECX

00C2EEC7 8B85 98E9FFFF MOV EAX,DWORD PTR SS:[EBP-1668]

00C2EECD 83C0 04 ADD EAX,4

00C2EED0 8985 98E9FFFF MOV DWORD PTR SS:[EBP-1668],EAX

00C2EED6 ^ E9 7CFCFFFF JMP 00C2EB57 //这里配合00C2EB57成为一个小循环。



00C2EEDB 0FB685 A4E9FFFF MOVZX EAX,BYTE PTR SS:[EBP-165C] //于是F4直接下来。

00C2EEE2 85C0 TEST EAX,EAX

00C2EEE4 74 7F JE SHORT 00C2EF65



00C2EF65 8D85 9CE9FFFF LEA EAX,DWORD PTR SS:[EBP-1664]

00C2EF6B 50 PUSH EAX

00C2EF6C FFB5 9CE9FFFF PUSH DWORD PTR SS:[EBP-1664]

00C2EF72 8B85 A8E9FFFF MOV EAX,DWORD PTR SS:[EBP-1658]

00C2EF78 C1E0 02 SHL EAX,2

00C2EF7B 50 PUSH EAX

00C2EF7C 8B85 3CEBFFFF MOV EAX,DWORD PTR SS:[EBP-14C4]

00C2EF82 0385 A0E9FFFF ADD EAX,DWORD PTR SS:[EBP-1660]

00C2EF88 50 PUSH EAX

00C2EF89 FF15 34D1C300 CALL DWORD PTR DS:[C3D134] ; KERNEL32.VirtualProtect

00C2EF8F ^ E9 4DF8FFFF JMP 00C2E7E1 //这里和00C2E7E1组成一个大循环,直到Magic jmp 运行完毕,可以跟踪它看看流程。

00C2EF94 8B85 24EBFFFF MOV EAX,DWORD PTR SS:[EBP-14DC] //于是我们F4直接下来,这时Arm认为加密IAT已经执行完毕,我们现在必须回到



*************************************



00C2E9FB 0F84 86000000 JE 00C2EA87 //很大一个magic jmp 跳转,注意,修改它为jmp 00a3142a 程序将异常无法继续运行,但IAT已经没有加密了。这里用Fly的另类方法。



先Od直接修改上句为



00C2E9FB /E9 87000000 JMP 00C2EA87 //点右键->“撤销选择”即可。

00C2EA00 |90 NOP



**************************************



00C2EF9A 8985 E4D4FFFF MOV DWORD PTR SS:[EBP-2B1C],EAX

00C2EFA0 FFB5 E4D4FFFF PUSH DWORD PTR SS:[EBP-2B1C]

00C2EFA6 E8 87540000 CALL 00C34432

00C2EFAB 59 POP ECX

00C2EFAC FFB5 68ECFFFF PUSH DWORD PTR SS:[EBP-1398]

00C2EFB2 E8 2B23FEFF CALL 00C112E2

00C2EFB7 59 POP ECX

00C2EFB8 EB 03 JMP SHORT 00C2EFBD

00C2EFBA D6 SALC

00C2EFBB D6 SALC

00C2EFBC 8BA1 DCC0C400 MOV ESP,DWORD PTR DS:[ECX C4C0DC]

00C2EFC2 8985 18E6FFFF MOV DWORD PTR SS:[EBP-19E8],EAX

00C2EFC8 83BD 18E6FFFF 0>CMP DWORD PTR SS:[EBP-19E8],0

00C2EFCF 74 36 JE SHORT 00C2F007

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



为何要这样做?因为Fly发现程序在下面会依据原先的代码进行解码,以前下硬件断点 操作没有修改原代码,所以解码正确。而直接修改Magic Jump后改变了原先的代码,导致解码不正确而异常出错!现在我们在解码以前恢复原先的代码,因此就不会再出错了!



取消以前的所有断点。现在就可以在401000段下内存断点了



0043B0FF 55 PUSH EBP //顺利到达Oep,Loadpe脱壳

0043B100 8BEC MOV EBP,ESP

0043B102 6A FF PUSH -1

0043B104 68 E0BC4700 PUSH MrCaptor.0047BCE0

0043B109 68 A4A34300 PUSH MrCaptor.0043A3A4

0043B10E 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]

0043B114 50 PUSH EAX

0043B115 64:8925 0000000>MOV DWORD PTR FS:[0],ESP

0043B11C 83EC 58 SUB ESP,58

0043B11F 53 PUSH EBX

0043B120 56 PUSH ESI

0043B121 57 PUSH EDI

0043B122 8965 E8 MOV DWORD PTR SS:[EBP-18],ESP

0043B125 FF15 EC034700 CALL DWORD PTR DS:[4703EC] ; KERNEL32.GetVersion

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



我们可以修复IAT了,还剩下86个Arm添加的标准垃圾指针,没有垃圾指针心里还有点不舒服也不习惯,我就没有用jwh51的nop垃圾指针的方法了,拿剪刀把86个垃圾指针剪掉,正常运行。



查脱壳后的文件,Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks ,昏,Fly大侠你的也是这样吗。



w32dasm反汇编程序死机,用抗Antiwasm才完成反汇编。



关于对话框



“You have X days left for evaluation”可以修改以下地方:



0042796E 3D E7030000 CMP EAX,3E7

00427973 74 3D JE SHORT dumped_.004279B2 //改为 JMP SHORT dumped_.004279B2

00427975 83F8 02 CMP EAX,2

00427978 74 38 JE SHORT dumped_.004279B2





最后用Winhex改到你高兴为止。



看胜利截图






最新评论

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

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

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

返回顶部