首页
社区
课程
招聘
手动脱Acprotect,幻影,Svkp,Aspack,XJ五层bt壳
发表于: 2004-5-7 20:20 9969

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

David 活跃值
20
2004-5-7 20:20
9969

【脱文作者】 weiyi75[Dfcg]

【作者邮箱】 [email]weiyi75@sohu.com[/email]

【作者主页】 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 00000000  MOV EAX,DWORD PTR FS:[0]
0049F075    50              PUSH EAX
0049F076    64:8925 0000000>MOV DWORD PTR FS:[0],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

0049F49C  0B C0 75 0F 58 0B C0 74 0D 6A 00 FF 95 F9 2E 40   栗 X 吏.j.??@
0049F4AC  00 EB 03 83 C4 04 5E F7 85 3B 2D 40 00 01 00 00  .?? ^?;-@. ..
0049F4BC  00 74 35 56 8D B5 06 30 40                       .t5V? 0@.

0049549C  0B下内存访问断点,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:[EBP+402EF9]  退出代码。
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:[EBP+402D3B],1
0049F4BD    74 35           JE SHORT KMV2-Yoc.0049F4F4
0049F4BF    56              PUSH ESI
0049F4C0    8DB5 06304000   LEA ESI,DWORD PTR SS:[EBP+403006]
0049F4C6    EB 26           JMP SHORT KMV2-Yoc.0049F4EE
...............................................................................

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

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

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

0EFAB6B1    8A06            MOV AL,BYTE PTR DS:[ESI]
0EFAB6B3    46              INC ESI
0EFAB6B4    47              INC EDI
0EFAB6B5    8843 0F         MOV BYTE PTR DS:[EBX+F],AL
0EFAB6B8    8A46 FF         MOV AL,BYTE PTR DS:[ESI-1]
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:[EBP+350]
0EFAB6CE    5D              POP EBP
0EFAB6CF    32C1            XOR AL,CL
0EFAB6D1    8847 FF         MOV BYTE PTR DS:[EDI-1],AL
0EFAB6D4    8BC5            MOV EAX,EBP

7FF7F25E    66:3103         XOR WORD PTR DS:[EBX],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:[ECX-18],6
7FF7F26C    0000            ADD BYTE PTR DS:[EAX],AL
7FF7F26E    00C4            ADD AH,AL
7FF7F270    1173 F7         ADC DWORD PTR DS:[EBX-9],ESI
7FF7F273    5B              POP EBX
7FF7F274    CD 83           INT 83
7FF7F276    C404EB          LES EAX,FWORD PTR DS:[EBX+EBP*8]         ; 修正的段位寄存器
7FF7F279    0299 EBFF0C24   ADD BL,BYTE PTR DS:[ECX+240CFFEB]
  
向下找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:[EBP+1]
7FF8ABD1    75 74           JNZ SHORT 7FF8AC47
7FF8ABD3    0375 01         ADD ESI,DWORD PTR SS:[EBP+1]
7FF8ABD6  ^ 75 8F           JNZ SHORT 7FF8AB67
7FF8ABD8    8505 CE420074   TEST DWORD PTR DS:[740042CE],EAX
7FF8ABDE    0375 01         ADD ESI,DWORD PTR SS:[EBP+1]
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],EAX
00444011    0000            ADD BYTE PTR DS:[EAX],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:[EAX],AL
00401F12    0000            ADD BYTE PTR DS:[EAX],AL
00401F14    0000            ADD BYTE PTR DS:[EAX],AL
00401F16    0000            ADD BYTE PTR DS:[EAX],AL
00401F18    0000            ADD BYTE PTR DS:[EAX],AL
00401F1A    0000            ADD BYTE PTR DS:[EAX],AL
00401F1C    0000            ADD BYTE PTR DS:[EAX],AL
00401F1E    0000            ADD BYTE PTR DS:[EAX],AL

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

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

还原代码吧。

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

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

文件减肥

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

597k to 253k

正常运行。

破解很容易,下断点

bp rtcMsgBox

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

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

附脱壳完全过关程序

本地下载

参考截图。



【破解总结】

我很忙,没时间总结了,感谢你耐心看完。

--------------------------------------------------------------------------------
  
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 11
支持
分享
最新回复 (1)
雪    币: 227
活跃值: (130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好,2G功夫又高了
2004-5-29 02:05
0
游客
登录 | 注册 方可回帖
返回
//