qqc 发表于 2011-3-6 22:51

手动脱Acprotect,幻影,Svkp,Aspack,XJ五层bt壳

本帖最后由 qqc 于 2011-3-6 22:53 编辑

手动脱Acprotect,幻影,Svkp,Aspack,XJ五层bt壳
发信人:David
时 间:2004-05-07,20:20
【脱文作者】 weiyi75

【作者邮箱】 weiyi75@sohu.com

【作者主页】 Dfcg官方大本营

【使用工具】 Unkillollydbg,Imprec1.42,LoadPe

【破解平台】 Win2000/XP

【软件名称】 KMV2-Yock

【软件简介】 查看区段,初步估计加了至少X层壳,区段被修改,看不出什么。

【软件大小】 593k

【加壳方式】 Acprotect,幻影,Svkp,Aspack,XJ (加壳顺序由左往右)

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

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

【破解内容】

前言,关于这个壳,高手不愿多说。我这个小菜鸟水平有限,不能完全剖析。用自己的方法脱了这个壳,写出简单过程。 此次脱壳由于加壳太厚,将Od设置忽略全部异常,中间的Bt壳由OD异常就可以忽略过去,关键点突破第一层仙剑,第四层幻影,第五层Acprotect。加太多壳,中间的Svkp,幻影形同虚设,尾部的Acprotect也没发挥威力,反而不如单层壳效果好。

载入程序,插件隐藏Od。

0049F060 >55            PUSH EBP   第一关,仙剑,最后加壳的先脱。
0049F061    8BEC            MOV EBP,ESP
0049F063    6A FF         PUSH -1
0049F065    68 F71E4000   PUSH KMV2-Yoc.00401EF7
0049F06A    68 F6304000   PUSH KMV2-Yoc.004030F6
0049F06F    64:A1 00000000MOV EAX,DWORD PTR FS:
0049F075    50            PUSH EAX
0049F076    64:8925 0000000>MOV DWORD PTR FS:,ESP
0049F07D    83EC 44         SUB ESP,44
0049F080    53            PUSH EBX
0049F081    56            PUSH ESI

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

命令行下断点

bp ZwQueryInformationProcess

Alt+b 打开断点窗口。

77F76035 ntdll 永远双击它。将普通断点改为硬件执行断点,然后取消普通断点。在

ZwQueryInformationProcess

检测时Od会告诉你,F9运行。

果然

77F76035 >B8 9A000000   MOV EAX,9A硬件中断,删除硬件断点。

看堆栈提示。

0012FF84   0049F49C/CALL 到 ZwQueryInformationProcess 来自 KMV2-Yoc.0049F49A 从这里返回程序领空,点右键转存中跟随。

0012FF88   FFFFFFFF|hProcess = FFFFFFFF
0012FF8C   00000007|InfoClass = 7
0012FF90   0012FF9C|Buffer = 0012FF9C
0012FF94   00000004|Bufsize = 4
0012FF98   00000000\pReqsize = NULL

0049F49C0B C0 75 0F 58 0B C0 74 0D 6A 00 FF 95 F9 2E 40   纔 X 纓.j.

qqc 发表于 2011-3-6 22:54

[ 本帖最后由 qqc 于 2011-3-6 23:08 编辑 ]

0049F49C0B C0 75 0F 58 0B C0 74 0D 6A 00 FF 95 F9 2E 40                                                                                     0049F4AC00 EB 03 83 C4 04 5E F7 85 3B 2D 40 00 01 00 00                                                                            0049F4BC00 74 35 56 8D B5 06 30 40
0049549C0B下内存访问断点,F9回家

0049F49C    0BC0            OR EAX,EAX到这里,清除内存断点。
0049F49E    75 0F         JNZ SHORT KMV2-Yoc.0049F4AF这里不跳转,往下直接退出。方法很多,修改Z标志最快
0049F4A0    58            POP EAX
0049F4A1    0BC0            OR EAX,EAX
0049F4A3    74 0D         JE SHORT KMV2-Yoc.0049F4B2
0049F4A5    6A 00         PUSH 0
0049F4A7    FF95 F92E4000   CALL DWORD PTR SS:退出代码。
0049F4AD    EB 03         JMP SHORT KMV2-Yoc.0049F4B2
0049F4AF    83C4 04         ADD ESP,4   必须跳到这里。
0049F4B2    5E            POP ESI
0049F4B3    F785 3B2D4000 0>TEST DWORD PTR SS:,1
0049F4BD    74 35         JE SHORT KMV2-Yoc.0049F4F4
0049F4BF    56            PUSH ESI
0049F4C0    8DB5 06304000   LEA ESI,DWORD PTR SS:
0049F4C6    EB 26         JMP SHORT KMV2-Yoc.0049F4EE
...............................................................................

Btw: 到这里第一个仙剑壳还没有完,后面不管它有多少壳,搞什么飞机,你在转存401000处下内存访问断点监视吧。

在转存401000下内存访问断点。

0EF8137F    6285 0E0B0000   BOUND EAX,QWORD PTR SS:这里估计到了skvp
0EF81385    EB 02         JMP SHORT 0EF81389
0EF81387    0FE88B D1EB02CD PSUBSB MM1,QWORD PTR DS:
0EF8138E    208B C2EB02CD   AND BYTE PTR DS:,CL
0EF81394    208B 8A4F0800   AND BYTE PTR DS:,CL
0EF8139A    007C03 EB       ADD BYTE PTR DS:,BH
0EF8139E    0369 74         ADD EBP,DWORD PTR DS:
0EF813A1    FB            STI
0EF813A2    8B89 74010000   MOV ECX,DWORD PTR DS:
0EF813A8    E8 01000000   CALL 0EF813AE
0EF813AD    8B83 C404BA61   MOV EAX,DWORD PTR DS:
0EF813B3    1100            ADC DWORD PTR DS:,EAX
0EF813B5    00E8            ADD AL,CH
0EF813B7    0200            ADD AL,BYTE PTR DS:
0EF813B9    0000            ADD BYTE PTR DS:,AL

0EFAB6B1    8A06            MOV AL,BYTE PTR DS:
0EFAB6B3    46            INC ESI
0EFAB6B4    47            INC EDI
0EFAB6B5    8843 0F         MOV BYTE PTR DS:,AL
0EFAB6B8    8A46 FF         MOV AL,BYTE PTR DS:
0EFAB6BB    55            PUSH EBP
0EFAB6BC    E8 00000000   CALL 0EFAB6C1
0EFAB6C1    5D            POP EBP
0EFAB6C2    81ED 0D470000   SUB EBP,470D
0EFAB6C8    8A8D 50030000   MOV CL,BYTE PTR SS:
0EFAB6CE    5D            POP EBP
0EFAB6CF    32C1            XOR AL,CL
0EFAB6D1    8847 FF         MOV BYTE PTR DS:,AL
0EFAB6D4    8BC5            MOV EAX,EBP

7FF7F25E    66:3103         XOR WORD PTR DS:,AX   这里到幻影壳,注意不可久留。取消内存断点,向下找jmp eax略过它。
7FF7F261    9C            PUSHFD
7FF7F262    6A 10         PUSH 10
7FF7F264    73 0B         JNB SHORT 7FF7F271
7FF7F266    EB 02         JMP SHORT 7FF7F26A
7FF7F268    C151 E8 06      RCL DWORD PTR DS:,6
7FF7F26C    0000            ADD BYTE PTR DS:,AL
7FF7F26E    00C4            ADD AH,AL
7FF7F270    1173 F7         ADC DWORD PTR DS:,ESI
7FF7F273    5B            POP EBX
7FF7F274    CD 83         INT 83
7FF7F276    C404EB          LES EAX,FWORD PTR DS:         ; 修正的段位寄存器
7FF7F279    0299 EBFF0C24   ADD BL,BYTE PTR DS:

向下找JMP EAX

7FF8ABC6- FFE0            JMP EAX      F4直接到这里,跳出幻影壳到Acprotect
7FF8ABC8    72 03         JB SHORT 7FF8ABCD
7FF8ABCA    73 01         JNB SHORT 7FF8ABCD
7FF8ABCC    75 74         JNZ SHORT 7FF8AC42
7FF8ABCE    0375 01         ADD ESI,DWORD PTR SS:
7FF8ABD1    75 74         JNZ SHORT 7FF8AC47
7FF8ABD3    0375 01         ADD ESI,DWORD PTR SS:
7FF8ABD6^ 75 8F         JNZ SHORT 7FF8AB67
7FF8ABD8    8505 CE420074   TEST DWORD PTR DS:,EAX
7FF8ABDE    0375 01         ADD ESI,DWORD PTR SS:
7FF8ABE1    75 FF         JNZ SHORT 7FF8ABE2
7FF8ABE3    B5 01         MOV CH,1

00444000    60            PUSHAD最后一个壳Acprotect
00444001    4B            DEC EBX
00444002    85DD            TEST EBP,EBX
00444004    EB 01         JMP SHORT 00444007
00444006^ 73 85         JNB SHORT 00443F8D
00444008    F3:             PREFIX REP:                              ; 多余的前缀
00444009    EB 01         JMP SHORT 0044400C
0044400B^ 78 87         JS SHORT 00443F94
0044400D    DEE8            FSUBP ST,ST
0044400F    0100            ADD DWORD PTR DS:,EAX
00444011    0000            ADD BYTE PTR DS:,AL
00444013    7A 83         JPE SHORT 00443F98
00444015    04 24         ADD AL,24
00444017    06            PUSH ES

下当前段模拟跟踪tc eip<444000

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

几分钟到达临时oep

00401F00    68 68214000   PUSH 402168    平时这里就应该是Oep,这个程序是VB编程,Oep被做了手脚.这里是Oep的第一句代码,记住补上替换的代码.
00401F05    68 95124000   PUSH 401295放入Oep下一句地址
00401F0A    E8 00000000   CALL 00401F0F
00401F0F    C3            RETN这里将返回Oep的下一句.
00401F10    0000            ADD BYTE PTR DS:,AL
00401F12    0000            ADD BYTE PTR DS:,AL
00401F14    0000            ADD BYTE PTR DS:,AL
00401F16    0000            ADD BYTE PTR DS:,AL
00401F18    0000            ADD BYTE PTR DS:,AL
00401F1A    0000            ADD BYTE PTR DS:,AL
00401F1C    0000            ADD BYTE PTR DS:,AL
00401F1E    0000            ADD BYTE PTR DS:,AL

00401295    E8 EEFFFFFF   CALL 00401288返回到Oep的第二句.; JMP to MSVBVM60.ThunRTMain
0040129A    0000            ADD BYTE PTR DS:,AL
0040129C    0000            ADD BYTE PTR DS:,AL
0040129E    0000            ADD BYTE PTR DS:,AL
004012A0    3000            XOR BYTE PTR DS:,AL
004012A2    0000            ADD BYTE PTR DS:,AL
004012A4    3800            CMP BYTE PTR DS:,AL
004012A6    0000            ADD BYTE PTR DS:,AL
004012A8    0000            ADD BYTE PTR DS:,AL
004012AA    0000            ADD BYTE PTR DS:,AL
004012AC    E6 49         OUT 49,AL                              ; I/O 命令,A
004012AE    70 77         JO SHORT 00401327

00401276- FF25 60104000   JMP DWORD PTR DS:                ; MSVBVM60.EVENT_SINK_QueryInterface
0040127C- FF25 48104000   JMP DWORD PTR DS:                ; MSVBVM60.EVENT_SINK_AddRef
00401282- FF25 58104000   JMP DWORD PTR DS:                ; MSVBVM60.EVENT_SINK_Release
00401288- FF25 8C104000   JMP DWORD PTR DS:                ; MSVBVM60.ThunRTMain
0040128E    0000            ADD BYTE PTR DS:,AL
00401290    0000            ADD BYTE PTR DS:,AL    这里是真正的oep
00401292    0000            ADD BYTE PTR DS:,AL
00401294    00E8            ADD AL,CH
00401296    EE            OUT DX,AL                              ; I/O 命令,A
00401297    FFFF            ???                                    ; 未知命令
00401299    FF00            INC DWORD PTR DS:
0040129B    0000            ADD BYTE PTR DS:,AL
0040129D    0000            ADD BYTE PTR DS:,AL
0040129F    0030            ADD BYTE PTR DS:,DH
004012A1    0000            ADD BYTE PTR DS:,AL
004012A3    0038            ADD BYTE PTR DS:,BH

还原代码吧。

00401290 >68 68214000   PUSH VB60.00402168          修复好的,这里看出程序是VB编的,用插件脱壳吧.
00401295    E8 EEFFFFFF   CALL <JMP.&MSVBVM60.#100>
0040129A    0000            ADD BYTE PTR DS:,AL
0040129C    0000            ADD BYTE PTR DS:,AL
0040129E    0000            ADD BYTE PTR DS:,AL
004012A0    3000            XOR BYTE PTR DS:,AL
004012A2    0000            ADD BYTE PTR DS:,AL
004012A4    3800            CMP BYTE PTR DS:,AL
004012A6    0000            ADD BYTE PTR DS:,AL

关闭OD,打开脱壳程序,Imprec1.42填入1290,直接修复。

文件减肥

因为区段名被删除了,不是很好减肥。留下Imprec新建的区段mackt,Virtual offset是0001000和00043000的三个有用区段,其余的全部是垃圾区段,全部删除,Loadpe重建Pe

597k to 253k

正常运行。

破解很容易,下断点

bp rtcMsgBox

中断,Ctrl+F9返回程序点确定.

返回程序领空,向上看哪里可以跳过这个提示,就不多说了。

525426926 发表于 2011-3-6 22:55

贴子很不错
收藏备用了!

六人行 发表于 2011-3-6 23:30

好厉害,只第一层就搞不定了,后面还有这么多,学习了

tzzcq 发表于 2011-3-7 07:02

强......................................

ok518 发表于 2011-3-7 08:14

貌似很麻烦,慢慢学习

376408384 发表于 2012-10-22 08:31

{:1_900:}这么多壳...还是被干掉
页: [1]
查看完整版本: 手动脱Acprotect,幻影,Svkp,Aspack,XJ五层bt壳