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