手动脱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 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返回程序点确定.
返回程序领空,向上看哪里可以跳过这个提示,就不多说了。 贴子很不错
收藏备用了! 好厉害,只第一层就搞不定了,后面还有这么多,学习了 强...................................... 貌似很麻烦,慢慢学习 {:1_900:}这么多壳...还是被干掉
页:
[1]