• 标 题:手动脱Acprotect,幻影,Svkp,Aspack,XJ五层bt壳
  • 作 者:David
  • 时 间:004-05-07,20:20
  • 链 接:http://bbs.pediy.com

【脱文作者】 weiyi75[Dfcg]
 
【作者邮箱】 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 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返回程序点确定. 
 
返回程序领空,向上看哪里可以跳过这个提示,就不多说了。
 
【破解总结】
 
 我很忙,没时间总结了,感谢你耐心看完。