FTBirthday的Armadillo全程教程--第一章.标准加壳方式
第一章.标准加壳方式
Armadillo标准加壳方式如果用了key和试用期保护。过期了可以删掉
[HKEY_CLASSES_ROOT\CLSID\{EC9E9EEB-7275-13D1-B2E4-0060975B8649}]项
及 HKLM software下License项就不过期了。
[实例解析一] Armadillo V3_01标准加壳方式的脱壳--SoundEdit Pro
程序名:SoundEdit Pro V1.3.634
※软件简介※:SoundEdit Pro可以打开WAV、MPC、MP+、MP2、MP3、VOX、RAW、OGG、WMA、CDA 等扩展名的音乐文件,进行声波编辑、剪裁、混音等工作;还有完整的录音功能,可以从 CD、麦克风、立体混音装置、讯号线来源、影片等来源录音。
软件语言: 英文
软件类别: 国外软件/共享版/音频处理
运行环境: Win9x/Me/NT/2000/XP
界面预览: 无
软件大小: 10273KB
软件更新: 2003-7-8
下载页面: http://www.pcdog.com/soft/942.htm
※参考文章※:Armadillo标准加壳的程序的脱壳和引入表修复方案 作者:jwh51
脱Armadillo 3.01 壳 作者:yesky1
Armadillo V3.40标准加壳方式的脱壳——Win98的Notepad 作者:fly
※软件限制※:SoundEdit是一个声音编辑软件,采用了ARMADILLO的KEY加密,启动要你输入KEY,否则要等几秒才能让你启动,还有30天试用期,所以,如果脱了壳,上述现象都将没有了.现在开始脱壳历程.!!
※破解工具※:DriverSuite2.7中的softice4.2.7、FI 3.01
※调试平台※:Windows XP
Armadillo是当今猛壳之一,加壳方式有两种,一种是标准方式(Standard Protections Only)加壳,
另一种是CopyMem-II+Debug-Blocker的加壳,其标准加壳方式相对来说则容易的多.用COPYMEMII的一般可用DILLODUMP脱,而用标准加壳用DILLODUMP是脱不了的。
※开始吧※
FI 3.01侦测知其用Armadilolo v3.01加壳,并且运行是没有两个进程,所以应该是标准加壳.
[一],DUMP出程序并修复:
首先一点是Armadillo是通过类似于调试的方法来运行程序的。
新版本Armadillo脱壳的一个难点是它的代码段是分页解密的,我估计它的做法是将代码段
锁定,即将其属性设为不可读、写、执行,当被执行到时会产生一个页面保护错误,而调
试程序就会捕获这个错误,将对应的页面解锁并解密,然后返回执行.
第一步,打开softice4.2.7
第二步,开启SoundEdit Pro直到出现注册框,那个注册框上的OK键会延迟生效。
第三步,ctrl+D调出softice
附:如果系统时间在安装SoundEdit Pro后修改过,程序会检测到,并警告修改系统时间而退出程序.
如下方法可挫败它的这个保护。
bpx getlocaltime
g回来点击ok按键,中断两次后,先别忙g退出.
经过测试内存地址00CB4677处的test al,al是关键,所以bpx 00CB4677再g.
((((
00CB4672 E8 08060000 CALL 00CB4C7F
00CB4677 84C0 TEST AL,AL ====>走到这里将AL改为00000000即可
00CB4679 74 1C JE SHORT 00CB4697
00CB467B E8 56050000 CALL 00CB4BD6 ====>这个call警告修改系统时间
))))
中断后,R EAX 00000000修改寄存器EAX的值为0,然后BC *清除所有断点.
先别忙退出,继续BPX VirtualProtect.
至此击败它了.
如果没有改过时间,则跳过上面一步,直接在按OK前BPX VirtualProtect.
然后再次中断,这时你要注意开始记下中断的次数了.我在第21次时按F10单步返回时得知
程序CALL to VirtualProtect from MSVBVM60.7342F400
说明程序,已经运行了.(VB是先运行MSVBVM60.DLL的,在其中也用调用VirtualProtect)
重新来一遍当在20次出现中断在VirtualProtect时停下,BC *清除所有断点,然后按F10单步
返回到主程序.
004DA1E0 83C404 ADD ESP, BYTE+04
004DA1E3 8945FC MOV [EBP-4], EAX
004DA1E6 837DB800 CMP DWORD [EBP-4C], BYTE+00
004DA1EA 740A JZ 004DA1F6
004DA1EC 8B45B8 MOV EAX, [EBP-4C]
004DA1EF 50 PUSH EDX
004DA1F0 FF15E8615000 CALL USER32.DestroyWindow
004DA1F6 8B45FC MOV EAX,[EBP-4]
004DA1F9 8BE5 MOV ESP, EBP
004DA1FB 5D POP EBP
004DA1FC C3 RETN
再耐心地用F10单步走,因为有一堆的JMP,JNZ,JO等,用不了多久的就可来到这:
004DB6B0 7511 JNZ 004DB6C3
004DB6B2 6878BC65000 PUSH 0050BC78
004DB6B7 FF150C975000 CALL NEAR [0050BC9C] ,这个CALL用F8跟进
004DB6B9 83C404 ADD ESP, BYTE+04
在004DB6B7这个CALL用F8跟进,然后继续F10,几次后就来到这:
00CBCEA9 334830 XOR ECX,[EAX+30]
00CBCEAC 334820 XOR ECX,[EAX+20]
00CBCEAF 2BF9 SUB EDI,ECX
00CBCEB1 FFD7 CALL EDI =====>EDI=004059B4
看到最后这个CALL EDI吗,004059B4就是程序的OEP了,我们F8跟进:
004059AE FF25EC114000 JMP NEAR[4011EC]
004059B4 68787D4000 PUSH 00407D7C =====>这是OEP了
004059B9 E8F0FFFFFF CALL MSVBVM60!ThunRTMain
004059BE 0000 ADD [EAX], AL
典型的VB代码.
dump取内存中己脱壳的文件
00CBCEB1 FFD7 CALL EDI
现在这一行,键入以下命令:
a eip (然后按回车)
jmp eip (然后按回车)
按下F5 最好在OEP处挂起进程再dump,因为这时程序的初始化变量还没有被修改。大家可对比一下,当程序运行后dump出的文件和在OEP处dump出的有何不同。
这样将改变0137:00CBCEB1行的代码. 你会注意到在键入"jmp eip"并按下回车后,00CBCEB1的指令现在是一个jmp.这将有效地使程序"暂停"(有点类似TRW2000的suspend命令). 按下F5使你回到window XP。 运行LordPE,在进程列表中选择"SoundEdit.exe"然后点击鼠标右键选中"Dump (Full)",给脱壳的程序起名dump存盘.
[二],修复引入表
一般步骤如下:
(1)找被脱壳的入口点(OEP);
(2)完全Dump目标文件;
(3)运行Import REConstructor和需要脱壳的应用程序;
(4)在Import REConstructor下拉列表框中选择应用程序进程;
(5)在左下角填上应用程序的真正入口点偏移(OEP);
(6)按"IAT AutoSearch"按钮,让其自动检测IAT位置, 出现"Found address which may be in the Original IAT.Try 'Get Import'"对话框,这表示输入的OEP发挥作用了。
(7)按"Get Import"按钮,让其分析IAT结构得到基本信息;
(8)如发现某个DLL显示"valid :NO" ,按"Show Invalids"按钮将分析所有的无效信息,在Imported Function Found栏中点击鼠标右键,选择"Trace Level1 (Disasm)",再按"Show Invalids"按钮。如果成功,可以看到所有的DLL都为"valid:YES"字样;
(9)再次刷新"Show Invalids"按钮查看结果,如仍有无效的地址,继续手动用右键的Level 2或3修复;
(10)如还是出错,可以利用"Invalidate function(s)"、"Delete thunk(s)"、编辑Import表(双击函数)等功能手动修复。
(11)开始修复已脱壳的程序。选择Add new section (缺省是选上的) 来为Dump出来的文件加一个Section(虽然文件比较大,但避免了许多不必要的麻烦) 。
(12)按"Fix Dump"按钮,并选择刚在(2)步Dump出来的文件,在此不必要备份。如修复的文件名是"Dump.exe",它将创建一个"Dump_.exe",此外OEP也被修正。
(13)生成的文件可以跨平台运行。
1.先用importREC试试,输入我们找到的正确的OEP:004059B4,注意输入004059B4-00400000=000059B4
有很多指针无效,如果CUT程序退出时会出错,所以要修复它.通过它我们可看到IAT的
rva为1000
运行SoundEdit,先等提示注册框出来,再下断bpx GetModuleHandleA,再按OK,
断下9次左右,每次断下都F12看看回到哪儿了,直到到了如下:
001B:00CA59F2 FF15A850CC00 CALL [KERNEL32!GetModuleHandleA]
001B:00CA59F8 394508 CMP [EBP+08],EAX
001B:00CA59FB 7507 JNZ 00CA5A04
001B:00CA59FD B9E083CC00 MOV ECX,00CC83E0
001B:00CA5A02 EB52 JMP 00CA5A56
001B:00CA5A04 393DD889CC00 CMP [00CC89D8],EDI
001B:00CA5A0A B9D889CC00 MOV ECX,00CC89D8
001B:00CA5A0F 0F8491000000 JZ 00CA5AA6 ======>magic jump!
001B:00CA5A15 8B3558E8CC00 MOV ESI,[00CCE858]
001B:00CA5A1B A1D028CD00 MOV EAX,[00CD28D0]
001B:00CA5A20 F6410801 TEST BYTE PTR [ECX+08],01
001B:00CA5A24 740E JZ 00CA5A34
001B:00CA5A26 8B507C MOV EDX,[EAX+7C]
001B:00CA5A29 335030 XOR EDX,[EAX+30]
001B:00CA5A2C 335028 XOR EDX,[EAX+28]
001B:00CA5A2F F6C280 TEST DL,80
001B:00CA5A32 7513 JNZ 00CA5A47
001B:00CA5A34 8B5074 MOV EDX,[EAX+74]
001B:00CA5A37 335064 XOR EDX,[EAX+64]
001B:00CA5A3A 335060 XOR EDX,[EAX+60]
001B:00CA5A3D 335030 XOR EDX,[EAX+30]
001B:00CA5A40 3316 XOR EDX,[ESI]
001B:00CA5A42 395508 CMP [EBP+08],EDX
001B:00CA5A45 740C JZ 00CA5A53
001B:00CA5A47 83C10C ADD ECX,0C
001B:00CA5A4A 83C604 ADD ESI,04
001B:00CA5A4D 3939 CMP [ECX],EDI
001B:00CA5A4F 75CF JNZ 00CA5A20
这里面有几个跳转,其中最后一个00CBA3EB是往上跳的.我们看一个就可发现:
00CBA364 JZ 00CBA3F0,这个跳正好可跳出这个循环.只要改这个跳,就不会破坏引入表了.
再来,出现注册框后OK,程序再断下来,把00CA5A0F的JZ 00CA5AA6改成JMP 00CA5AA6,
清除所有断点,按F5运行,程序运行后打开importREC,选中程序,入口填
入59b4,-->IAT自动搜索-->获得输入信息",如果还有无效的大可放心的cut,因为它们本来就不是有用指针了.然后修复脱壳后的文件.OK,大功告成.
脱壳后的程序,运行正常,烦人的注册框和时间限制都没了,圆满成功.
总结:曾经我用olly也试过,但好像我的olly有问题,老是断不下来,
今次换上老将softice,终于成功了,好激动啊!
感谢jwh51 yesky1 fly