xu5902 发表于 2009-4-20 10:05

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

如果是视频就好了

gorden 发表于 2009-5-2 20:15

如果是视频就好了
swl 发表于 2009-4-20 17:43 http://www.52pojie.cn/images/common/back.gif
同感啊~我这人笨~╮(╯▽╰)╭

洞庭风 发表于 2009-5-2 21:49

建议楼主做个视频!

迷惘依然 发表于 2009-5-3 09:13

谢谢,学习了,很不错啊.......

11411489 发表于 2009-5-3 12:02

真详细 受教了!!!

xie83544109 发表于 2009-9-8 11:39

大牛们怎么都不喜欢录视频呀...
可苦了我们这些小鱼了...
页: [1]
查看完整版本: Armadillo 5.02脱壳+ PE区段优化减肥