Armadillo 5.02脱壳+ PE区段优化减肥
本帖最后由 xu5902 于 2009-5-1 07:36 编辑【破解作者】 xu5902
【作者邮箱】 372752246@qq.com
【使用工具】 FLYOD+PEID+ImportREC+LORDPE
【破解平台】 Win9x/NT/2000/XP
【软件名称】 EbookMaker2.2
【下载地址】 http://www.antssoft.com
【软件简介】 做电子书的软件,界面很不错
【加壳方式】 Armadillo V5.00 -> Silicon Realms Toolworks * Sign.By.fly *
【破解声明】 本文原创,还请指点!
--------------------------------------------------------------------------------
查壳PEID:Armadillo V5.00 -> Silicon Realms Toolworks * Sign.By.fly *
Armadillo专用工具查壳:
<------- 15-04-2009 07:53:38 ------->
C:\Program Files\EbookMaker\EbookMaker.exe
!- 目标为Armadillo保护
!- 保护系统级别为 (专业版)
!- <所用到的保护模式有>
标准保护 或 最小保护模式
!- <备份密钥设置>
固定的备份密钥
!- <目标程序压缩设置>
较好 / 较慢 的压缩方式
!- <其它保护设置>
!- 版本号: 5.02 11-07-2007
!- 共使用的时间 00h 00m 02s 219ms
切入正题,先运行软件,看出软件用次数限制+功能限制+注册码保护。
我这里已是注册版了。打开任务管理器,发现是单进程,这下可以省了不少功夫了。
第一步 脱壳
1.使用OllyDBG修改版TheODBG,使用IsDebug插件Hide,忽略所有的异常选项。
00748D82 > $E8 E3400000 CALL EbookMak.0074CE6A //载入OllyDBG后暂停在EP
00748D87 .^ E9 16FEFFFF JMP EbookMak.00748BA2
00748D8C $6A 0C PUSH 0C
00748D8E .68 70707700 PUSH EbookMak.00777070
00748D93 .E8 44150000 CALL EbookMak.0074A2DC
00748D98 .8B4D 08 MOV ECX,DWORD PTR SS:
00748D9B .33FF XOR EDI,EDI
00748D9D .3BCF CMP ECX,EDI
00748D9F .76 2E JBE SHORT EbookMak.00748DCF
00748DA1 .6A E0 PUSH -20
00748DA3 .58 POP EAX
00748DA4 .33D2 XOR EDX,EDX
00748DA6 .F7F1 DIV ECX
00748DA8 .3B45 0C CMP EAX,DWORD PTR SS:
00748DAB .1BC0 SBB EAX,EAX
00748DAD .40 INC EAX
00748DAE .75 1F JNZ SHORT EbookMak.00748DCF
00748DB0 .E8 36130000 CALL EbookMak.0074A0EB
00748DB5 .C700 0C000000 MOV DWORD PTR DS:,0C
00748DBB .57 PUSH EDI
00748DBC .57 PUSH EDI
00748DBD .57 PUSH EDI
00748DBE .57 PUSH EDI
00748DBF .57 PUSH EDI
00748DC0 .E8 C7120000 CALL EbookMak.0074A08C
00748DC5 .83C4 14 ADD ESP,14
00748DC8 >33C0 XOR EAX,EAX
00748DCA .E9 D5000000 JMP EbookMak.00748EA4
00748DCF >0FAF4D 0C IMUL ECX,DWORD PTR SS:
2.MagicJmp避开输入表加密
下断:BP VirtualProtect
Shift+F9,中断后取消断点
7C801AD0 >8BFF MOV EDI,EDI//中断后取消断点
7C801AD2 55 PUSH EBP
7C801AD3 8BEC MOV EBP,ESP
7C801AD5 FF75 14 PUSH DWORD PTR SS:
7C801AD8 FF75 10 PUSH DWORD PTR SS:
7C801ADB FF75 0C PUSH DWORD PTR SS:
7C801ADE FF75 08 PUSH DWORD PTR SS:
7C801AE1 6A FF PUSH -1
7C801AE3 E8 75FFFFFF CALL kernel32.VirtualProtectEx
7C801AE8 5D POP EBP
7C801AE9 C2 1000 RETN 10
7C801AEC 90 NOP
7C801AED 90 NOP
7C801AEE 90 NOP
7C801AEF 90 NOP
7C801AF0 90 NOP
下断:BP CreateFileMappingA
Shift+F9,中断后取消断点
7C809478 >8BFF MOV EDI,EDI //中断后取消断点
7C80947A 55 PUSH EBP
7C80947B 8BEC MOV EBP,ESP
7C80947D 51 PUSH ECX
7C80947E 51 PUSH ECX
7C80947F 56 PUSH ESI
7C809480 33F6 XOR ESI,ESI
7C809482 3975 1C CMP DWORD PTR SS:,ESI
7C809485 74 31 JE SHORT kernel32.7C8094B8
7C809487 64:A1 18000000MOV EAX,DWORD PTR FS:
7C80948D FF75 1C PUSH DWORD PTR SS:
7C809490 8DB0 F80B0000 LEA ESI,DWORD PTR DS:
7C809496 8D45 F8 LEA EAX,DWORD PTR SS:
7C809499 50 PUSH EAX
Ctrl+G:GetModuleHandleA
在GetModuleHandleA函数末尾处设断,防止壳检测函数首部的CC断点
7C80B6B1 >8BFF MOV EDI,EDI
7C80B6B3 55 PUSH EBP
7C80B6B4 8BEC MOV EBP,ESP
7C80B6B6 837D 08 00 CMP DWORD PTR SS:,0
7C80B6BA 74 18 JE SHORT kernel32.7C80B6D4
7C80B6BC FF75 08 PUSH DWORD PTR SS:
7C80B6BF E8 C0290000 CALL kernel32.7C80E084
7C80B6C4 85C0 TEST EAX,EAX
7C80B6C6 74 08 JE SHORT kernel32.7C80B6D0
7C80B6C8 FF70 04 PUSH DWORD PTR DS:
7C80B6CB E8 7D2D0000 CALL kernel32.GetModuleHandleW
7C80B6D0 5D POP EBP
7C80B6D1 C2 0400 RETN 4 //这里设断
7C80B6D4 64:A1 18000000MOV EAX,DWORD PTR FS:
7C80B6DA 8B40 30 MOV EAX,DWORD PTR DS:
7C80B6DD 8B40 08 MOV EAX,DWORD PTR DS:
7C80B6E0^ EB EE JMP SHORT kernel32.7C80B6D0
7C80B6E2 90 NOP
7C80B6E3 90 NOP
注意看堆栈:
0012E264 011633EF/CALL 到 CreateFileMappingA 来自 011633E9
0012E268 FFFFFFFF|hFile = FFFFFFFF
0012E26C 011BDC60|pSecurity = 011BDC60
0012E270 00000004|Protection = PAGE_READWRITE
0012E274 00000000|MaximumSizeHigh = 0
0012E278 0000010C|MaximumSizeLow = 10C
0012E27C 0012E498\MapName = "LSI-EA42E512"
0012E280 00FBE0F0
Shift+F9:
00129478 011850A5返回到 011850A5 来自 kernel32.GetModuleHandleA
0012947C 011B0B98ASCII "kernel32.dll"
00129480 011B1A54ASCII "VirtualAlloc"
00129484 BDA82323
00129488 00771368EbookMak.00771368
Shift+F9:
00129478 011850C3返回到 011850C3 来自 kernel32.GetModuleHandleA
0012947C 011B0B98ASCII "kernel32.dll"
00129480 011B1A48ASCII "VirtualFree"
00129484 BDA82323
00129488 00771368EbookMak.00771368
0012948C 00000000
Shift+F9:
001291C4 01167AF7返回到 01167AF7 来自 kernel32.GetModuleHandleA
001291C8 00129340ASCII "kernel32.dll"
001291CC 00000000
001291D0 00771368EbookMak.00771368
001291D4 00000001
001291D8 00003FFF
依次显示:VirtualAlloc、VirtualFree,之后显示:kernel32.dll
则可以取消GetModuleHandleA函数末尾的断点了,F7返回01167AF7调用处:
01167AF7 8B55 F4 MOV EDX,DWORD PTR SS://返回这里
01167AFA 8B0D 4CDF1B01 MOV ECX,DWORD PTR DS:
01167B00 890491 MOV DWORD PTR DS:,EAX
01167B03 8B55 F4 MOV EDX,DWORD PTR SS:
01167B06 A1 4CDF1B01 MOV EAX,DWORD PTR DS:
01167B0B 833C90 00 CMP DWORD PTR DS:,0
01167B0F 75 5F JNZ SHORT 01167B70
01167B11 8B4D F8 MOV ECX,DWORD PTR SS:
01167B14 8B51 08 MOV EDX,DWORD PTR DS:
01167B17 83E2 02 AND EDX,2
01167B1A 74 3B JE SHORT 01167B57
01167B1C B8 1C000000 MOV EAX,1C
01167B21 C1E0 02 SHL EAX,2
01167B24 8B0D 04BB1B01 MOV ECX,DWORD PTR DS: ; EbookMak.00771368
01167B2A 8B15 04BB1B01 MOV EDX,DWORD PTR DS: ; EbookMak.00771368
01167B30 8B35 04BB1B01 MOV ESI,DWORD PTR DS: ; EbookMak.00771368
01167B36 8B9E 90000000 MOV EBX,DWORD PTR DS:
01167B3C 335A 54 XOR EBX,DWORD PTR DS:
01167B3F 331C01 XOR EBX,DWORD PTR DS:
01167B42 83E3 10 AND EBX,10
01167B45 F7DB NEG EBX
01167B47 1BDB SBB EBX,EBX
01167B49 F7DB NEG EBX
01167B4B 0FB6C3 MOVZX EAX,BL
01167B4E 85C0 TEST EAX,EAX
01167B50 75 05 JNZ SHORT 01167B57
01167B52^ E9 15FFFFFF JMP 01167A6C
01167B57 8D8D C8FEFFFF LEA ECX,DWORD PTR SS:
01167B5D 51 PUSH ECX
01167B5E FF15 D4E11A01 CALL DWORD PTR DS: ; kernel32.LoadLibraryA
01167B64 8B55 F4 MOV EDX,DWORD PTR SS:
01167B67 8B0D 4CDF1B01 MOV ECX,DWORD PTR DS:
01167B6D 890491 MOV DWORD PTR DS:,EAX
01167B70 8B55 F4 MOV EDX,DWORD PTR SS:
01167B73 A1 4CDF1B01 MOV EAX,DWORD PTR DS:
01167B78 833C90 00 CMP DWORD PTR DS:,0
01167B7C 75 05 JNZ SHORT 01167B83//MagicJmp ★修改为NOP
01167B7E^ E9 E9FEFFFF JMP 01167A6C
这里处理完毕后需要恢复原来的代码,防止检验
Ctrl+B在下面搜索:EB 03 D6 D6
找到在01167EOF处,设断,Shift+F9
01167DA9 8B95 BCFEFFFF MOV EDX,DWORD PTR SS:
01167DAF 333C91 XOR EDI,DWORD PTR DS:
01167DB2 8B45 F4 MOV EAX,DWORD PTR SS:
01167DB5 8B0D 48DF1B01 MOV ECX,DWORD PTR DS:
01167DBB 8B1481 MOV EDX,DWORD PTR DS:
01167DBE 8B85 BCFEFFFF MOV EAX,DWORD PTR SS:
01167DC4 893C82 MOV DWORD PTR DS:,EDI
01167DC7^ E9 80FEFFFF JMP 01167C4C
01167DCC 8B0D 04BB1B01 MOV ECX,DWORD PTR DS: ; EbookMak.00771368
01167DD2 8B15 04BB1B01 MOV EDX,DWORD PTR DS: ; EbookMak.00771368
01167DD8 A1 04BB1B01 MOV EAX,DWORD PTR DS:
01167DDD 8B35 04BB1B01 MOV ESI,DWORD PTR DS: ; EbookMak.00771368
01167DE3 8B76 78 MOV ESI,DWORD PTR DS:
01167DE6 3370 54 XOR ESI,DWORD PTR DS:
01167DE9 33B2 88000000 XOR ESI,DWORD PTR DS:
01167DEF 3371 5C XOR ESI,DWORD PTR DS:
01167DF2 8B4D F4 MOV ECX,DWORD PTR SS:
01167DF5 8B15 4CDF1B01 MOV EDX,DWORD PTR DS:
01167DFB 33348A XOR ESI,DWORD PTR DS:
01167DFE 8B45 F4 MOV EAX,DWORD PTR SS:
01167E01 8B0D 4CDF1B01 MOV ECX,DWORD PTR DS:
01167E07 893481 MOV DWORD PTR DS:,ESI
01167E0A^ E9 5DFCFFFF JMP 01167A6C
01167E0F EB 03 JMP SHORT 01167E14 ; //设硬件执行断点,F2断点断不下来。中断后取消断点
01167E11 D6 SALC
01167E12 D6 SALC
01167E13 8F ??? ; 未知命令
MagicJmp处理完了.
3、到达OEP
下断:BP CreateThread
Shift+F9中断
7C810647 >8BFF MOV EDI,EDI//中断后取消断点,Alt+F9返回
7C810649 55 PUSH EBP
7C81064A 8BEC MOV EBP,ESP
7C81064C FF75 1C PUSH DWORD PTR SS:
7C81064F FF75 18 PUSH DWORD PTR SS:
7C810652 FF75 14 PUSH DWORD PTR SS:
7C810655 FF75 10 PUSH DWORD PTR SS:
7C810658 FF75 0C PUSH DWORD PTR SS:
7C81065B FF75 08 PUSH DWORD PTR SS:
7C81065E 6A FF PUSH -1
7C810660 E8 D7FDFFFF CALL kernel32.CreateRemoteThread
7C810665 5D POP EBP
7C810666 C2 1800 RETN 18
01173235 50 PUSH EAX //返回这里
01173236 FF15 5CE21A01 CALL DWORD PTR DS: ; kernel32.CloseHandle
0117323C 5E POP ESI
0117323D 5B POP EBX
0117323E 8BE5 MOV ESP,EBP
01173240 5D POP EBP
01173241 C3 RETN
Ctrl+B在下面搜索:FF D1 89 45 FC 8B 45 FC
找到在0118F0FD处,设断,Shift+F9
0118F0D5 A1 04BB1B01 MOV EAX,DWORD PTR DS:
0118F0DA 3350 34 XOR EDX,DWORD PTR DS:
0118F0DD 8955 DC MOV DWORD PTR SS:,EDX
0118F0E0 8B4D 08 MOV ECX,DWORD PTR SS:
0118F0E3 8B51 04 MOV EDX,DWORD PTR DS:
0118F0E6 52 PUSH EDX
0118F0E7 8B45 08 MOV EAX,DWORD PTR SS:
0118F0EA 8B48 08 MOV ECX,DWORD PTR DS:
0118F0ED 51 PUSH ECX
0118F0EE 6A 00 PUSH 0
0118F0F0 8B55 08 MOV EDX,DWORD PTR SS:
0118F0F3 8B42 0C MOV EAX,DWORD PTR DS:
0118F0F6 50 PUSH EAX
0118F0F7 8B4D F4 MOV ECX,DWORD PTR SS:
0118F0FA 2B4D DC SUB ECX,DWORD PTR SS:
0118F0FD FFD1 CALL ECX //设断,中断后取消断点,F7进入//飞向光明之巅
0118F0FF 8945 FC MOV DWORD PTR SS:,EAX
0118F102 8B45 FC MOV EAX,DWORD PTR SS:
0118F105 5E POP ESI
0118F106 8BE5 MOV ESP,EBP
0118F108 5D POP EBP
006C067C 55 PUSH EBP //到这里了,OEP!LordPE-纠正映像-Dump!
006C067D 8BEC MOV EBP,ESP
006C067F 83C4 F0 ADD ESP,-10
006C0682 B8 ECB86B00 MOV EAX,EbookMak.006BB8EC
006C0687 E8 DC71D4FF CALL EbookMak.00407868
006C068C A1 548F6C00 MOV EAX,DWORD PTR DS:
006C0691 8B00 MOV EAX,DWORD PTR DS:
006C0693 E8 A03BDCFF CALL EbookMak.00484238
006C0698 8B0D 548F6C00 MOV ECX,DWORD PTR DS: ; EbookMak.006CECDC
006C069E 8B09 MOV ECX,DWORD PTR DS:
006C06A0 B2 01 MOV DL,1
006C06A2 A1 A8A74F00 MOV EAX,DWORD PTR DS:
006C06A7 E8 B8A2DBFF CALL EbookMak.0047A964
006C06AC 8B15 80906C00 MOV EDX,DWORD PTR DS: ; EbookMak.006D0B5C
006C06B2 8902 MOV DWORD PTR DS:,EAX
006C06B4 A1 80906C00 MOV EAX,DWORD PTR DS:
006C06B9 8B00 MOV EAX,DWORD PTR DS:
006C06BB E8 A4FDDBFF CALL EbookMak.00480464
006C06C0 A1 80906C00 MOV EAX,DWORD PTR DS:
006C06C5 8B00 MOV EAX,DWORD PTR DS:
006C06C7 8B10 MOV EDX,DWORD PTR DS:
006C06C9 FF92 8C000000 CALL DWORD PTR DS:
006C06CF 8B0D B48C6C00 MOV ECX,DWORD PTR DS: ; EbookMak.006D286C
006C06D5 A1 548F6C00 MOV EAX,DWORD PTR DS:
006C06DA 8B00 MOV EAX,DWORD PTR DS:
006C06DC 8B15 A0686B00 MOV EDX,DWORD PTR DS: ; EbookMak.006B68EC
006C06E2 E8 693BDCFF CALL EbookMak.00484250
006C06E7 A1 80906C00 MOV EAX,DWORD PTR DS:
006C06EC 8B00 MOV EAX,DWORD PTR DS:
006C06EE E8 C9FBDBFF CALL EbookMak.004802BC
运行ImportREC,选择这个进程
把OEP改为002C067C,自动搜索IAT--获取输入表--显示无效函数,Cut掉填充在DLL间的无效指针FixDump,正
常运行
第二步:PE区段优化减肥
这是Borland Delphi 6.0 - 7.0编写的程序,标准的Borland Delphi 6.0 - 7.0程序包含以下区段:
CODE
DATA
BSS
.idata
.tls
.rdata
.reloc
.rsrc
用PE编辑器打开脱壳后的文件,发现多出不少区段:
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 002BB32400001000002BB3240000100060000020
.itext 00003710002BD00000003710002BD00060000020
.data 0000845C002C10000000845C002C1000C0000040
.bss 00008874002CA00000008874002CA000C0000000
.idata 000037DC002D3000000037DC002D3000C0000040
.tls 00000058002D700000000058002D7000C0000000
.rdata 00000018002D800000000018002D800040000040
.reloc 000378E4002D9000000378E4002D900042000040
.text1 00050000003110000005000000311000E0000020 *********
.adata 00010000003610000001000000361000E0000020 *********
.data1 00010000003710000001000000371000C0000040 *********
.reloc1 0001000000381000000100000038100042000040 *********
.pdata 001D000000391000001D000000391000C0000040 *********
.rsrc 000A600000561000000A60000056100040000040
.mackt 00004000006070000000400000607000E0000060
与Borland Delphi 6.0 - 7.0标准程序比较发现,有用的区段只有:
.text 002BB32400001000002BB3240000100060000020
.data 0000845C002C10000000845C002C1000C0000040
.bss 00008874002CA00000008874002CA000C0000000
.idata 000037DC002D3000000037DC002D3000C0000040
.tls 00000058002D700000000058002D7000C0000000
.rdata 00000018002D800000000018002D800040000040
.reloc 000378E4002D9000000378E4002D900042000040
.rsrc 000A600000561000000A60000056100040000040
.mackt 00004000006070000000400000607000E0000060
其他节都是脱壳后留下的无用的垃圾,所以只要将它们删掉就可以了达到我们减肥的效果了。
1.从节表中删除
先纪录这几个节的起始位置,几个节的Raw是从00311000到00561000-1
LordPE中PE编辑器中在这几个节点右键选“清除区段”。
2.:调整节表属性
只是删除了节表项目和文件中内容还不行,还要设置好节属性。 可以通过编程实现资源节的RVA调整,使RVA
偏移等于文件偏移,较麻烦,且.mackt存有输入表信息很多RVA值不好改动。 我们用简单的办法,不动它的
RVA地址,只改变它的文件偏移。
用PE编辑器中,打开区段,选择.rsrc节,编辑,因为删除的.text1节首的ROffset为00311000,所以现
在.rsrc节的节首ROffset为00311000,更改!
.rsrc下面的节.mackt的Raw_偏移 = .rsrc节的Raw_偏移 + .rsrc节的Raw_尺寸 = 00311000 + 000A6000
=003B7000,故更改.mackt 节的Raw_偏移为 003B7000
还要调整一下.rsrc节上面的节.reloc的节区大小,保证相邻节的VA地址是连续的 (.rsrc节的虚拟地址
00561000) - (.reloc节的虚拟地址002D9000) = 288000 所以设置.reloc的节区大小为00288000
修改后的文件节表:
----------------------------------------------------------
节区名称 节区大小 虚拟地址 Raw_尺寸 Raw_偏移 节区属性
----------------------------------------------------------
.text 002BB32400001000002BB3240000100060000020
.itext 00003710002BD00000003710002BD00060000020
.data 0000845C002C10000000845C002C1000C0000040
.bss 00008874002CA00000008874002CA000C0000000
.idata 000037DC002D3000000037DC002D3000C0000040
.tls 00000058002D700000000058002D7000C0000000
.rdata 00000018002D800000000018002D800040000040
.reloc 00288000002D9000000378E4002D900042000040
.rsrc 000A600000561000000A60000031100040000040
.mackt 000040000060700000004000003B7000E0000060
3.从文件中删除
Win Hex打开该文件,选择偏移00311000到00561000-1,全部删除!
保存,6.04mb --> 3.73mb可以运行。 如果是视频就好了 如果是视频就好了
swl 发表于 2009-4-20 17:43 http://www.52pojie.cn/images/common/back.gif
同感啊~我这人笨~╮(╯▽╰)╭ 建议楼主做个视频! 谢谢,学习了,很不错啊....... 真详细 受教了!!! 大牛们怎么都不喜欢录视频呀...
可苦了我们这些小鱼了...
页:
[1]