浅谈SVKP 1.3X SDK stolen code 的找回
【目 标】:Download Accelerator Plus v7.1
【工 具】:Olydbg1.1(diy版)
【任 务】:找回壳所抽的代码
【操作平台】:WINDOWS 2000 ADV SP2
【作 者】:loveboom[DFCG][FCG]
【相关链接】: www.skycn.com(自己去那里搜搜吧)
【简要说明】:本来不是很想写,只因这个软件是我看到svkp1.3x抽代码最多的(足足抽了6A字节),所以"厚着脸皮",灌上一贴,只写了一下壳所抽代码的找回,不足或失误之处,还请各位大虾指点一二。建议如果你是新手,就先不要去试这样的壳,因为有点难度,当然这并不是说我很厉害,其实我也很菜的。
【详细过程】:
设置:忽略全部异常。隐藏你OD。
OD载入目标停在这里:
00598000 > 60 PUSHAD ;停在这里
00598001 E8 00000000 CALL DAP.00598006
00598006 5D POP EBP
00598007 81ED 06000000 SUB EBP,6
按f9一次,发生异常,异常位置:
0012E3B6 6285 20220000 BOUND EAX,QWORD PTR SS:[EBP+2220] ;这里异常
0012E3BC EB 02 JMP SHORT 0012E3C0
0012E3BE 0FE88B D1EB02CD PSUBSB MM1,QWORD PTR DS:[EBX+CD02EBD1]
0012E3C5 208B C2EB02CD AND BYTE PTR DS:[EBX+CD02EBC2],CL
异常后在code段下f2断点.
Memory map, item 13
Address=00401000
Size=000F0000 (983040.)
Owner=DAP 00400000
Section=
Contains=code
Type=Imag 01001002
Access=R
Initial access=RWE
下断后,SHIFT+F9这样来到了这里.
0394F14F 8A06 MOV AL,BYTE PTR DS:[ESI]
0394F151 46 INC ESI
0394F152 47 INC EDI
0394F153 8843 0F MOV BYTE PTR DS:[EBX+F],AL
0394F156 8A46 FF MOV AL,BYTE PTR DS:[ESI-1]
0394F159 55 PUSH EBP
0394F15A E8 00000000 CALL 0394F15F
0394F15F 5D POP EBP
0394F160 81ED 0D470000 SUB EBP,470D
0394F166 8A8D 50030000 MOV CL,BYTE PTR SS:[EBP+350]
0394F16C 5D POP EBP
0394F16D 32C1 XOR AL,CL
0394F16F 8847 FF MOV BYTE PTR DS:[EDI-1],AL
0394F172 8BC5 MOV EAX,EBP
0394F174 4D DEC EBP
0394F175 85C0 TEST EAX,EAX
0394F177 ^ 75 A4 JNZ SHORT 0394F11D ;这里跳回去循环解压代码
0394F179 33C0 XOR EAX,EAX
0394F17B 5D POP EBP
0394F17C 5F POP EDI
0394F17D 5E POP ESI
0394F17E 5B POP EBX
0394F17F C2 1400 RETN 14 ;直接在这里下F4
在0394f17f处下F4,因解压要一定的时间,所以如果你的机子配置较低的话可能等的时间比较长。f4停下后,我们再次在code段下f2断点,这里来到了这里:
039499AE 66:813E 4A43 CMP WORD PTR DS:[ESI],434A
039499B3 0F85 23010000 JNZ 03949ADC
039499B9 83C6 0A ADD ESI,0A
现在在12FFB0处下硬件访问断点(也就是hr 12ffb0),为什么在这里下呢,这个看官你自己想想吧,如果要在这里下断的原因也不知道的话,建议你先看一下基础知识。
第一次断这里:
0012FC40 60 PUSHAD
0012FC41 E8 03000000 CALL 0012FC49
……
0012FC54 E8 01000000 CALL 0012FC5A ;第二次
0012FC59 E8 E8020000 CALL 0012FF46
0012FC5E 00CD ADD CH,CL
0012FC60 2083 04240B83 AND BYTE PTR DS:[EBX+830B2404],AL
……
0012FCFB E8 00000000 CALL 0012FD00 ;第三次
0012FD00 5D POP EBP
0012FD01 E8 02000000 CALL 0012FD08
第三次中断后hd 12ffb0取消断点。再下tc ebp==12ffc0(start esp value-4,谢谢tDasm),这样在这里断下:
03AD0647 0AAF BB010424 OR CH,BYTE PTR DS:[EDI+240401BB]
03AD064D 5D POP EBP
03AD064E E9 A10A0000 JMP 03AD10F4 ;断在这里
现在先清掉run trace window里的内容,并选择log file,记录到文件。做完准备工作后,下tc eip<03000000,这样到了fake oep处.
004D6214 90 NOP
004D6215 90 NOP
004D6216 E8 6183F5FF CALL DAP.0042E57C ;停在这里
004D621B 391D 380E5400 CMP DWORD PTR DS:[540E38],EBX
004D6221 75 0C JNZ SHORT DAP.004D622F
004D6223 68 5E634D00 PUSH DAP.004D635E
向上看一下,晕倒,壳抽了这么多的代码。要命呀,有点苦了。现在我们要开始分析代码了,
看看程序的"模样",就知道它应该是用C写的程序。所以现在要"联想"一下C的oep的大概样子,当然,其实是要分析代码得出壳所抽的代码。先静态分析出轮廓。也因为这篇文章就是讲怎么找代码,所以个人认为应该详细一点(所以把大部分的代码都copy过来),
03AD10F4 Main POP EAX ◆这里典型的SVKP的代码,所以这里应该是push ebp
03AD10F5 Main NOP◆因为一般C的开始处都不变,也就是说,第二句应该是mov ebp,esp
03AD10F6 Main PUSH ADEDF13D
03AD10FB Main PUSH EAX
03AD10FC Main MOV EAX,52120FAB ; EAX=52120FAB
03AD1101 Main ADD DWORD PTR SS:[ESP+4],EAX
03AD1105 Main POP EAX ; EAX=03AD05B3
03AD1106 Main ADD EAX,52120FAB ; EAX=55BF155E
03AD110B Main ADD EAX,52120FAB ; EAX=A7D12509
03AD1110 Main JMP 03AD195B
03AD195B Main PUSH EAX
03AD195C Main JMP 03AD0B7A
03AD0B7A Main MOV EAX,52120FAB ; EAX=52120FAB
03AD0B7F Main SUB DWORD PTR SS:[ESP],EAX
03AD0B82 Main JMP 03AD124F
03AD124F Main MOV EAX,DWORD PTR SS:[ESP] ; EAX=55BF155E
03AD1252 Main JMP 03AD1FAE
03AD1FAE Main MOV EAX,52120FAB ; EAX=52120FAB
03AD1FB3 Main SUB DWORD PTR SS:[ESP],EAX
03AD1FB6 Main JMP 03AD10A6
03AD10A6 Main MOV EAX,DWORD PTR SS:[ESP] ; EAX=03AD05B3
03AD10A9 Main PUSH ADEDF06C
03AD10AE Main PUSH EAX
03AD10AF Main MOV EAX,52120FAB ; EAX=52120FAB
03AD10B4 Main ADD DWORD PTR SS:[ESP+4],EAX
03AD10B8 Main JMP 03AD1CA5
03AD1CA5 Main POP EAX ; EAX=03AD05B3
03AD1CA6 Main JMP 03AD2175
03AD2175 Main POP EAX ; EAX=00000017
03AD2176 Main ADD DWORD PTR SS:[ESP+4],EAX
03AD217A Main POP EAX ; EAX=03AD05B3
03AD217B Main PUSH AF7D04C0
03AD2180 Main ADD EAX,52120FAB ; EAX=55BF155E