18次计算机等级考生上机盘(上海捷成)
希望对考试的同志们有用,以前的东西,比较乱,见谅。
by zzhzihui@tom.com
★目的:解除过期
程序可能检测当前日期,是否过了考试日期:
0047C558 > \8B95 4CFFFFFF MOV EDX,DWORD PTR SS:[EBP-B4]
0047C55E . 2395 48FFFFFF AND EDX,DWORD PTR SS:[EBP-B8]
0047C564 . 85D2 TEST EDX,EDX
0047C566 . 0F85 87000000 JNZ KSXT.0047C5F3 ;日期检查jmp ok
0047C56C . C745 FC 05000>MOV DWORD PTR SS:[EBP-4],5
0047C573 . C745 AC 04000>MOV DWORD PTR SS:[EBP-54],80020004
到了2005年,发现还有个地方检测:
0047CF74 . FF15 0C134000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStrList
0047CF7A . 83C4 3C ADD ESP,3C
0047CF7D . 0FBF85 88FEFF>MOVSX EAX,WORD PTR SS:[EBP-178]
0047CF84 . 85C0 TEST EAX,EAX
0047CF86 . 0F84 BF000000 JE KSXT.0047D04B ;日期检查jmp ok
0047CF8C . C745 FC 1B000>MOV DWORD PTR SS:[EBP-4],1B
0047CF93 . C785 38FFFFFF>MOV DWORD PTR SS:[EBP-C8],80020004
0047CF9D . C785 30FFFFFF>MOV DWORD PTR SS:[EBP-D0],0A
0047CFA7 . C785 48FFFFFF>MOV DWORD PTR SS:[EBP-B8],80020004
0047CFB1 . C785 40FFFFFF>MOV DWORD PTR SS:[EBP-C0],0A
0047CFBB . C785 B8FEFFFF>MOV DWORD PTR SS:[EBP-148],KSXT.005A5108
----
0047D1B0 . DFE0 FSTSW AX
0047D1B2 . F6C4 01 TEST AH,1
0047D1B5 . 74 0C JE SHORT KSXT.0047D1C3 ;nop
0047D1B7 . C785 5CFEFFFF>MOV DWORD PTR SS:[EBP-1A4],1
0047D1C1 . EB 0A JMP SHORT KSXT.0047D1CD
0047D1C3 > C785 5CFEFFFF>MOV DWORD PTR SS:[EBP-1A4],0
★目的:得到考生考试成绩
考生交卷后会在考生目录下的HLPWIN目录里的DjksSTD.MDB数据库中写入成绩:
例如:考生考号为130199990001,则数据库为C:\WEAXM\26010001\HLPWIN\DJKSSTD.MDB
这个数据库中DJKS31和DJKS32表中存有考生信息,其中CJ列是考生的加密成绩.
该数据库密码为123
例如:这是1分加密后的数据
1BD9B7D85F4E5F5788692BEBC129262E05093B5E679940FE38C41DCADE021008895B64AB93DD44245B9428CCEF05F765D1E0B855F28C446ECF010C050EF1CF8C360A2C97C3B100DE660E5EF321C5FA10E295589B2305E8C25553C2FB5D27488CBE53C9BE3679A05D65DCA~@~$~&~^
KXST.EXE 考生系统主文件,VB编写
OD跟踪:
由于该程序把交卷窗体frmclose设为无最大化按钮,无最小化按钮,无控制菜单,对话框样式,
不可缩放,而且程序运行时会设定为最大化窗口,所以在用OD跟踪时,虽然断下,但是无法
看到OD窗口,因为断下后程序暂停,但frmclose窗口还是处于topmost状态,所以看不到od了.
看不到OD怎么跟踪,怎么办??
用VBEXPLORER来查看该文件,可以找到以下信息.
frmclose,评分窗体,把该窗体一些属性改为相应数据,例如:普通样式,可缩放
load(载入)代码入口: 473cc0
unload(卸载): 475d80
lostfocus(丢失焦点): 475c50
timer(时间控件): 475e00 待会儿就知道这个该死的东东了.
既然是最顶部窗口,它肯定调用了SetWindowPos这个API:
SetWindowPos
VB声明
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
说明
这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最顶部状态
其中hWndInsertAfter这个参数就是来设置topmost的,当它为-1时,设置TOPMOST,
如果为1,则设为buttom(最底部窗口)
好,我们在od里下:
BP 473cc0 (frmclose载入的入口)
然后F9运行.断下,在下:
BP SetWindowPos
F9运行,断下.按CTRL+F9运行到返回,返回到主程序会发现在这里:
load段settopmost:
004740DB FF15 B4104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
004740E1 8B95 94FEFFFF MOV EDX,DWORD PTR SS:[EBP-16C]
004740E7 6A 03 PUSH 3 ; frmload_set topmost这里设置窗口为顶部窗口
004740E9 57 PUSH EDI
004740EA 57 PUSH EDI
004740EB 57 PUSH EDI
004740EC 57 PUSH EDI
004740ED 6A FF PUSH -1 ;这个参数,改为1设最底部窗体,机器码6A01
004740EF 52 PUSH EDX
004740F0 E8 3F66FAFF CALL KSXT.0041A734 ;这里调用setwindowpos API
004740F5 FF15 B0104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaSetSy>; MSVBVM60.__vbaSetSystemError
004740FB 8B03 MOV EAX,DWORD PTR DS:[EBX]
但是这样还不行,因为该死的TIMER段还有代码会设置该窗体,让窗体取得焦点.
timer 段:
00476F17 8BF8 MOV EDI,EAX
00476F19 57 PUSH EDI ;jmp 476f3a
00476F1A 8B0F MOV ECX,DWORD PTR DS:[EDI]
00476F1C FF91 04020000 CALL DWORD PTR DS:[ECX+204];got focus获得焦点
00476F22 3BC6 CMP EAX,ESI
00476F24 DBE2 FCLEX
00476F26 7D 12 JGE SHORT KSXT.00476F3A
跟踪发现执行完476F1C处CALL后,堆栈段减2,那么就要尝试跳过离它最近的一个PUSH,
就是00476F19 PUSH EDI ;改为jmp 476f3a
将上面两处004740ED,00476F19用HIEW修改.
好了,这样程序评分窗口可以调整大小,也可以看OD,timer也不打扰了.
但统计成绩的代码在那里呢?如果从load开始单步跟太麻烦了,既然访问CJ这个字段,
那么搜索CJ,还好,我有OD的插件Ultra String Reference plugin(罗聪 所写)
搜索一下,注意是UNICODE,找到了三四个,都下断点.
再点"交卷"然后程序会执行到这个CJ,在5944b4断下:
005944AB 8B45 A8 MOV EAX,DWORD PTR SS:[EBP-58]
005944AE 8985 5CFDFFFF MOV DWORD PTR SS:[EBP-2A4],EAX
005944B4 C785 38FEFFFF 0>MOV DWORD PTR SS:[EBP-1C8],KSXT.0041BD08 ; UNICODE "CJ"
005944BE C785 30FEFFFF 0>MOV DWORD PTR SS:[EBP-1D0],8
005944C8 8D4D A4 LEA ECX,DWORD PTR SS:[EBP-5C]
005944CB 51 PUSH ECX
可是很不幸,这里已经是加密的代码了(好像是MD加密,鬼才知道)
那好,向前,找到评分程序段入口:
00592E80 $ 55 PUSH EBP ;这里被call
00592E81 . 8BEC MOV EBP,ESP
00592E83 . 83EC 18 SUB ESP,18
00592E86 . 68 46D94000 PUSH <JMP.&MSVBVM60.__vbaExceptHandler> ; SE handler installation
00592E8B . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
00592E91 . 50 PUSH EAX
00592E92 . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
00592E99 . B8 F4030000 MOV EAX,3F4
00592E9E . E8 9DAAE7FF CALL <JMP.&MSVBVM60.__vbaChkstk>
............
重新考试,取消所有断点,下断点bp 592e80,运行,断下,F8单步跟:
...可以发现程序把,各个模块的成绩连接起来.
....
0059454B > \8B4D A4 MOV ECX,DWORD PTR SS:[EBP-5C]
0059454E . 898D 54FDFFFF MOV DWORD PTR SS:[EBP-2AC],ECX
00594554 8B55 C4 MOV EDX,DWORD PTR SS:[EBP-2C] ;ebp-2c是加密数据,ebp-3c是未加密数据
00594557 . 8995 28FEFFFF MOV DWORD PTR SS:[EBP-1D8],EDX
0059455D . C785 20FEFFFF>MOV DWORD PTR SS:[EBP-1E0],8
00594567 . B8 10000000 MOV EAX,10
堆栈数据:
0012ED00 001825B4 UNICODE "012.004.002.000.000.006.000.000.000.000.0" ;原始成绩
0012ED04 00000000
0012ED08 00000000
0012ED0C 001770AC UNICODE "14B5BFB387C389CCF6BFCC1B34698C05619BF4DF29092AE2476D9E9DC0F844FE54908422387C61C30D75A158F69857F43ED6"
0012ED10 001AD2BC UNICODE "1975EB3FA088E7024A367C95D879CAECE5C7DC85FE8482AC51792ABD5AAA45F66D114B15BECEDDA409942D6D9E02051B942C" ;存入的成绩加密数据
好了,把00594554处的EBP-2C改为EBP-3C就可以把未加密的成绩存入数据库.
成绩数据"012.004.002.000.000.006.000.000.000.000.0"格式:
最左侧为总成绩,后面是各项考试试题的成绩
-------------
看看到底是怎么加密的,又跟:
004A48C0 $ 55 PUSH EBP
004A48C1 . 8BEC MOV EBP,ESP
004A48C3 . 83EC 0C SUB ESP,0C
004A48C6 . 68 46D94000 PUSH <JMP.&MSVBVM60.__vbaExceptHandler> ; SE handler installation
004A48CB . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
004A48D1 . 50 PUSH EAX
004A48D2 . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
004A48D9 . 83EC 7C SUB ESP,7C
004A48DC . 53 PUSH EBX
004A48DD . 56 PUSH ESI
004A48DE . 57 PUSH EDI
004A48DF . 8965 F4 MOV DWORD PTR SS:[EBP-C],ESP
004A48E2 . C745 F8 48374>MOV DWORD PTR SS:[EBP-8],KSXT.00403748
004A48E9 . 68 5C0F4200 PUSH KSXT.00420F5C ; UNICODE "EnCode" ,看到了,编码程序段
004A48EE . 33FF XOR EDI,EDI
004A48F0 . 68 18505A00 PUSH KSXT.005A5018 ; UNICODE "BreakFile "
004A48F5 . 6A 14 PUSH 14
004A48F7 . 897D E8 MOV DWORD PTR SS:[EBP-18],EDI
004A48FA . 897D E0 MOV DWORD PTR SS:[EBP-20],EDI
004A48FD . 897D DC MOV DWORD PTR SS:[EBP-24],EDI
004A4900 . 897D CC MOV DWORD PTR SS:[EBP-34],EDI
004A4903 . 897D BC MOV DWORD PTR SS:[EBP-44],EDI
004A4906 . 897D AC MOV DWORD PTR SS:[EBP-54],EDI
004A4909 . 897D 9C MOV DWORD PTR SS:[EBP-64],EDI
.....
经过查看,发现它还有个DECODE代码,也许是用来解密的,但是实在是太麻烦了.
以后有时间再看吧.
==================
安装过程:
在虚拟PC(win98)安装,用REGSNAP检测:
New files
cmctlchs.dll **
cmdlgchs.dll **
comctl32.ocx
comdlg32.ocx
excel8.olb **
expsrv.dll
flxgdchs.dll
msexcl35.dll **
msflxgrd.ocx
msjint35.dll
msjter35.dll
msppt8.olb
msvbvm60.dll
msword8.olb **
msxbse35.dll
threed32.ocx
vb5db.dll
vb6chs.dll
vb6stkit.dll
vbajet32.dll
在NT下,这些文件要复制到SYSTEM32目录内
==========
0047C6D7 6A 27 PUSH 27
0047C6D9 8D85 50FFFFFF LEA EAX,DWORD PTR SS:[EBP-B0]
0047C6DF 50 PUSH EAX ;其实这里检查c:\Setup181.wi_
0047C6E0 FF15 B4124000 CALL DWORD PTR DS:[<&MSVBVM60.#645>] ; MSVBVM60.rtcDir
0047C6E6 8BD0 MOV EDX,EAX
0047C6E8 8D4D 94 LEA ECX,DWORD PTR SS:[EBP-6C]
0047C6EB FF15 B0134000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrMo>; MSVBVM60.__vbaStrMove
0047C6F1 50 PUSH EAX
0047C6F2 6A 00 PUSH 0
0047C6F4 FF15 9C114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCm>; MSVBVM60.__vbaStrCmp
0047C6FA F7D8 NEG EAX
0047C6FC 1BC0 SBB EAX,EAX
0047C6FE 40 INC EAX
0047C6FF F7D8 NEG EAX
0047C701 66:8985 88FEFFF>MOV WORD PTR SS:[EBP-178],AX
0047C708 8D4D 94 LEA ECX,DWORD PTR SS:[EBP-6C]
0047C70B FF15 18144000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
0047C711 8D8D 50FFFFFF LEA ECX,DWORD PTR SS:[EBP-B0]
0047C717 FF15 28104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeV>; MSVBVM60.__vbaFreeVar
0047C71D 0FBF8D 88FEFFFF MOVSX ECX,WORD PTR SS:[EBP-178]
0047C724 85C9 TEST ECX,ECX
0047C726 /0F84 BF000000 JE KSXT.0047C7EB //这里跳走,不会提示
0047C72C |C745 FC 0600000>MOV DWORD PTR SS:[EBP-4],6
0047C733 |C785 38FFFFFF 0>MOV DWORD PTR SS:[EBP-C8],80020004
0047C73D |C785 30FFFFFF 0>MOV DWORD PTR SS:[EBP-D0],0A
0047C747 |C785 48FFFFFF 0>MOV DWORD PTR SS:[EBP-B8],80020004
----
0047C846 50 PUSH EAX
0047C847 66:8B45 D4 MOV AX,WORD PTR SS:[EBP-2C]
0047C84B 50 PUSH EAX
0047C84C 6A FF PUSH -1
0047C84E 6A 01 PUSH 1 ;即使强制跳到这里,打开文件会异常,还是会提示日期被调回
0047C850 FF15 C4124000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFileO>; MSVBVM60.__vbaFileOpen
0047C856 8D4D 94 LEA ECX,DWORD PTR SS:[EBP-6C]
0047C859 FF15 18144000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStr
==========
综上所述,满足其必须的DLL和导入REG文件后,复制c:\Setup181.wi_就可以绕过运行
如果手动建立一个然后跟踪,会发现程序会用lineinput读入一行,再判断等等.这个文件估计是存放安装日期的.
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!