- UID
- 26819
注册时间2007-2-14
阅读权限60
最后登录1970-1-1
亢龙有悔
TA的每日心情 | 开心 2018-7-21 10:19 |
---|
签到天数: 14 天 [LV.3]偶尔看看II
|
【文章标题】: XXX省2007**模拟考试系统 1.02破解分析+各省市通用补丁
【文章作者】: roking
【软件名称】: XXX省2007**模拟考试系统 1.02
【下载地址】: 自己搜索下载
【加壳方式】: ASProtect 2.1x SKE
【使用工具】: OD,PEiD,Import Rec,VBExplorer
【操作平台】: Windows XP SP2
【作者声明】: 仅供技术交流,请勿用于非法用途
--------------------------------------------------------------------------------
【详细过程】
软件安装完后,试用体验一下,注册码方式注册,为注册版有30题限制。由安装文件夹下的VB运行库得知由VB6编写。注册码试练一下,得知是重启验证。
PEid查壳,主程序DiverTest.exe有壳:ASProtect 2.1x SKE -> Alexey Solodovnikov
OD载入,使用脚本“Aspr2.XX_unpacker_v1.0SC.osc”脱壳,根据脱壳后OD“记录”窗口中的提示的OEP及IAT信息,使用ImportREC手工指定IAT位置并修复IAT后可以运行,但有偷窃代码。
先来恢复偷窃代码。使用OD载入脱壳后的主程,查一下装载的模块可知确为VB6编写,另一个OD打开任一正常VB编写的程序作参考,来复原偷窃代码,方法使用F7步进,同时注意堆栈顶内容是否出现VB程序的特征值:ASCII "VB5!6&*",我这里来到:- 00450094 56 PUSH ESI ; de_Drive.00401D60 记下此内存地址,用于恢复VB程序的第一条指令
- 00450095 8F4425 00 POP DWORD PTR SS:[EBP]
- 00450099 5E POP ESI
- 0045009A 5D POP EBP
- 0045009B 66:9D POPFW
- 0045009D E8 C81AFBFF CALL <JMP.&msvbvm60.ThunRTMain> ;偷走的第2条指令
- 004500A2 E9 00000000 JMP de_Drive.004500A7
复制代码 对于VB程序的入口点有这2条指令就够了,我这里修复如下:- 00401B70 > $ 68 601D4000 PUSH de_Drive.00401D60 ; ASCII "VB5!6&*"
- 00401B75 . E8 F0FFFFFF CALL <JMP.&msvbvm60.ThunRTMain>
- 00401B7A . 0000 ADD BYTE PTR DS:[EAX],AL
- 00401B7C . 0000 ADD BYTE PTR DS:[EAX],AL
- 00401B7E . 0000 ADD BYTE PTR DS:[EAX],AL
- 00401B80 . 3000 XOR BYTE PTR DS:[EAX],AL
- 00401B82 . 0000 ADD BYTE PTR DS:[EAX],AL
- 00401B84 . 50 PUSH EAX
复制代码 保存所有修改后就可以正常使用VBExplorer及SmartCheck等VB专用工具来进行分析了。
这个程序,在OD调试状态下无法进入程序界面,会提示出错无法继续(但非调试状态下不会有问题,是anti_debug?陷阱?!),得先处理掉这个错误。根据VB程序的特征,在各窗体事件入口处下断,均未执行到就出错推出了,由此推测此VB程序使用了VB模块中的类似Sub main()方式作为启动代码过程,由于本人对MSVBVM60机理没研究,不知如何快速定位启动代码。于是自写了个小的采用sub main()启动的小程序跟了下,在MSVBVM60.dll中发现如下特征码“FF 96 94 00 00 00”仅一处,搜到后在此下断,断下后再F7一次就来到了程序领空的启动代码sub main()处了,对于此程序来到0041B0E0入口处后F8跟一下(看注释):- 0041B0E0 . 55 PUSH EBP ; 启动代码sub main()入口
- 0041B0E1 . 8BEC MOV EBP,ESP
- 0041B0E3 . 83EC 08 SUB ESP,8
- 。。。。。。。。。。。。。。。。。。。。
- 。。。。。。。。。。。。。。。。。。。。
- 0041B11D . C745 D4 54654>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>; UNICODE "Dats.dll"
- 0041B124 . C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
- 0041B12B . FFD7 CALL EDI ; <&msvbvm60.__vbaVarDup>
- 0041B12D . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
- 0041B130 . 56 PUSH ESI
- 0041B131 . 50 PUSH EAX
- 0041B132 . FF15 64114000 CALL DWORD PTR DS:[<&msvbvm60.rtcDir>] ; msvbvm60.rtcDir
- 0041B138 . 8BD0 MOV EDX,EAX
- 0041B13A . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B13D . FF15 DC114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrMo>; msvbvm60.__vbaStrMove
- 0041B143 . 50 PUSH EAX
- 0041B144 . 68 08474000 PUSH de_Drive.00404708
- 0041B149 . FF15 DC104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCm>; msvbvm60.__vbaStrCmp
- 0041B14F . 8BF0 MOV ESI,EAX
- 0041B151 . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B154 . F7DE NEG ESI
- 0041B156 . 1BF6 SBB ESI,ESI
- 0041B158 . F7DE NEG ESI
- 0041B15A . F7DE NEG ESI
- 0041B15C . FF15 14124000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>; msvbvm60.__vbaFreeStr
- 0041B162 . 8B1D 20104000 MOV EBX,DWORD PTR DS:[<&msvbvm60.__vbaFr>; msvbvm60.__vbaFreeVar
- 0041B168 . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
- 0041B16B . FFD3 CALL EBX ; <&msvbvm60.__vbaFreeVar>
- 0041B16D . 66:85F6 TEST SI,SI
- 0041B170 . 74 29 JE SHORT de_Drive.0041B19B ;//这里暂时JMP过去,原因看下面
- 0041B172 . 8D55 CC LEA EDX,DWORD PTR SS:[EBP-34]
- 0041B175 . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
- 0041B178 . C745 D4 6C654>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>; UNICODE "REGSVR32 /s Dats.dll"
- 0041B17F . C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
- 0041B186 . FFD7 CALL EDI
- 0041B188 . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
- 0041B18B . 6A 02 PUSH 2
- 0041B18D . 51 PUSH ECX
- 0041B18E . FF15 14114000 CALL DWORD PTR DS:[<&msvbvm60.rtcShell>] ; msvbvm60.rtcShell //这里出错!!
- 0041B194 . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
- 0041B197 . DDD8 FSTP ST
- 0041B199 . FFD3 CALL EBX
- 0041B19B > 8D55 CC LEA EDX,DWORD PTR SS:[EBP-34]
- 0041B19E . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
- 0041B1A1 . C745 D4 7C644>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>; UNICODE "Images.dll"
- 0041B1A8 . C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
- 0041B1AF . FFD7 CALL EDI
- 0041B1B1 . 8D55 DC LEA EDX,DWORD PTR SS:[EBP-24]
- 0041B1B4 . 6A 00 PUSH 0
- 0041B1B6 . 52 PUSH EDX
- 0041B1B7 . FF15 64114000 CALL DWORD PTR DS:[<&msvbvm60.rtcDir>] ; msvbvm60.rtcDir
- 0041B1BD . 8BD0 MOV EDX,EAX
- 0041B1BF . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B1C2 . FF15 DC114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrMo>; msvbvm60.__vbaStrMove
- 0041B1C8 . 50 PUSH EAX
- 0041B1C9 . 68 08474000 PUSH de_Drive.00404708
- 0041B1CE . FF15 DC104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCm>; msvbvm60.__vbaStrCmp
- 0041B1D4 . 8BF0 MOV ESI,EAX
- 0041B1D6 . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B1D9 . F7DE NEG ESI
- 0041B1DB . 1BF6 SBB ESI,ESI
- 0041B1DD . F7DE NEG ESI
- 0041B1DF . F7DE NEG ESI
- 0041B1E1 . FF15 14124000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>; msvbvm60.__vbaFreeStr
- 0041B1E7 . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
- 0041B1EA . FFD3 CALL EBX
- 0041B1EC . 66:85F6 TEST SI,SI
- 0041B1EF . 74 29 JE SHORT de_Drive.0041B21A ;//这里暂时JMP过去,原因看下面
- 0041B1F1 . 8D55 CC LEA EDX,DWORD PTR SS:[EBP-34]
- 0041B1F4 . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
- 0041B1F7 . C745 D4 9C654>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>; UNICODE "REGSVR32 /s Images.dll"
- 0041B1FE . C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
- 0041B205 . FFD7 CALL EDI
- 0041B207 . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
- 0041B20A . 6A 02 PUSH 2
- 0041B20C . 50 PUSH EAX
- 0041B20D . FF15 14114000 CALL DWORD PTR DS:[<&msvbvm60.rtcShell>] ; msvbvm60.rtcShell //这里出错!!
- 0041B213 . 8D4D DC LEA ECX,DWORD PTR SS:[EBP-24]
复制代码 由上面代码可知出错原因应该是在OD环境下执行shell(REGSVR32 /s Images.dll)引起的,原因不明,我这里先暂时修改这2条指令,跳过错误:
0041B170 . 74 29 JE SHORT de_Drive.0041B19B ;//这里暂时JMP过去
0041B1EF . 74 29 JE SHORT de_Drive.0041B21A ;//这里暂时JMP过去
这样就可以正常调试了。
VBExplorer载入恢复了偷窃代码的主程序,查看注册窗口事件代码地址为:0041AC80,以此地址在OD中下断跟一下:- 0041AC80 > \55 PUSH EBP ; “软件注册”窗口中“确定”按钮的click事件处理入口
- 0041AC81 . 8BEC MOV EBP,ESP
- 0041AC83 . 83EC 0C SUB ESP,0C
- 0041AC86 . 68 46184000 PUSH <JMP.&msvbvm60.__vbaExceptHandler> ; SE 处理程序安装
- 。。。。。。。。。。。。。。。。。。
- 。。。。。。。。。。。。。。。。。。
- 0041AD3F . 66:3BFB CMP DI,BX
- 0041AD42 . 0F85 58010000 JNZ ok_Drive.0041AEA0 ; 序列号输入框里若是“关闭软件,重新打开!!”则跳走
- 。。。。。。。。。。。。。。。。。。
- 。。。。。。。。。。。。。。。。。。
- 0041AE35 . 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
- 0041AE38 . 8D55 D0 LEA EDX,DWORD PTR SS:[EBP-30]
- 0041AE3B . 51 PUSH ECX
- 0041AE3C . 52 PUSH EDX
- 0041AE3D . E8 DE060000 CALL ok_Drive.0041B520 ; 这里跟入进去是写注册表HKEY_LOCAL_MACHINE\SOFTWARE\DriverTest "SN"=??
- 0041AE42 . 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
复制代码 得知输入的注册码存入注册表HKEY_LOCAL_MACHINE\SOFTWARE\DriverTest的SN键里。并提示重启验证。
OD重新载入目标程序,再前面找到的程序sub main()启动代码0041B0E0处设断,进行重启过程分析:- 0041B0E0 . 55 PUSH EBP ; 启动模块入口
- 0041B0E1 . 8BEC MOV EBP,ESP
- 0041B0E3 . 83EC 08 SUB ESP,8
- 。。。。。。。。。。。。。。。
- 。。。。。。。。。。。。。。。
- 0041B21A > E8 31020000 CALL ok_Drive.0041B450 ; 从注册表里读取假码--EAX
- 0041B21F . 8BD0 MOV EDX,EAX
- 0041B221 . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B224 . FF15 DC114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrMo>; msvbvm60.__vbaStrMove
- 0041B22A . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B22D . 51 PUSH ECX
- 0041B22E . E8 DD000000 CALL ok_Drive.0041B310 ;[color=Red]关键Call----重起验证(搞算法的进去)[/color]
- 0041B233 . 33D2 XOR EDX,EDX
- 0041B235 . 66:3D FFFF CMP AX,0FFFF
- 0041B239 . 0F94C2 SETE DL
- 0041B23C . F7DA NEG EDX
- 0041B23E . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B241 . 66:8BF2 MOV SI,DX
- 0041B244 . FF15 14124000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>; msvbvm60.__vbaFreeStr
- 0041B24A . 66:85F6 TEST SI,SI
- [color=Red]0041B24D . 74 09 JE SHORT ok_Drive.0041B258 ; 爆破点01 -- NOP掉
- 0041B24F . 66:C705 6C004>MOV WORD PTR DS:[42006C],0FFFF ;注册标志01[/color]
- 0041B258 > A1 10004200 MOV EAX,DWORD PTR DS:[420010]
- 0041B25D . 85C0 TEST EAX,EAX
复制代码 保存修改后,试一下!哇塞!没有注册窗口了,窗口标题提示是注册版了。这么简单?
别高兴太早,再试一下,做题到30道以后,题就不会变了,而且随机的错题统计里会出现文字错乱难以阅读。,看来还得跟进上面的关键Call细细分析下:- 0041B310 $ 55 PUSH EBP
- 0041B311 . 8BEC MOV EBP,ESP
- 0041B313 . 83EC 08 SUB ESP,8
- 0041B316 . 68 46184000 PUSH <JMP.&msvbvm60.__vbaExceptHandler> ; SE 处理程序安装
- 0041B31B . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
- 0041B321 . 50 PUSH EAX
- 0041B322 . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
- 0041B329 . 83EC 64 SUB ESP,64
- 0041B32C . 53 PUSH EBX
- 0041B32D . 56 PUSH ESI
- 0041B32E . 57 PUSH EDI
- 0041B32F . 8965 F8 MOV DWORD PTR SS:[EBP-8],ESP
- 0041B332 . C745 FC 58154>MOV DWORD PTR SS:[EBP-4],ok_Drive.004015>
- 0041B339 . 33F6 XOR ESI,ESI
- 0041B33B . 8975 EC MOV DWORD PTR SS:[EBP-14],ESI
- 0041B33E . 8975 E8 MOV DWORD PTR SS:[EBP-18],ESI
- 0041B341 . 8975 E4 MOV DWORD PTR SS:[EBP-1C],ESI
- 0041B344 . 8975 D4 MOV DWORD PTR SS:[EBP-2C],ESI
- 0041B347 . 8975 C4 MOV DWORD PTR SS:[EBP-3C],ESI
- 0041B34A . 8975 B4 MOV DWORD PTR SS:[EBP-4C],ESI
- 0041B34D . 8975 A4 MOV DWORD PTR SS:[EBP-5C],ESI
- 0041B350 . 8975 94 MOV DWORD PTR SS:[EBP-6C],ESI
- 0041B353 . E8 880C0000 CALL ok_Drive.0041BFE0 ;读机器码
- 0041B358 . 8B3D DC114000 MOV EDI,DWORD PTR DS:[<&msvbvm60.__vbaSt>; msvbvm60.__vbaStrMove
- 0041B35E . 8BD0 MOV EDX,EAX
- 0041B360 . B9 38004200 MOV ECX,ok_Drive.00420038
- 0041B365 . FFD7 CALL EDI ;机器码放到00420038
- 0041B367 . 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
- 0041B36A . 8B1D 8C114000 MOV EBX,DWORD PTR DS:[<&msvbvm60.__vbaSt>; msvbvm60.__vbaStrCopy
- 0041B370 . B9 3C004200 MOV ECX,ok_Drive.0042003C
- 0041B375 . 8B10 MOV EDX,DWORD PTR DS:[EAX]
- 0041B377 . FFD3 CALL EBX ; 注册码试练码放在0042003C
- 0041B379 . 8B15 38004200 MOV EDX,DWORD PTR DS:[420038]
- 0041B37F . 8D4D EC LEA ECX,DWORD PTR SS:[EBP-14]
- 0041B382 . FFD3 CALL EBX
- 0041B384 . 8B0D 3C004200 MOV ECX,DWORD PTR DS:[42003C]
- 0041B38A . 68 D9840000 PUSH 84D9
- 0041B38F . 68 DD170000 PUSH 17DD
- 0041B394 . 51 PUSH ECX
- [color=Red]0041B395 . E8 96020000 CALL ok_Drive.0041B630 ;关键!!跟进去[/color]
复制代码 来到:- 0041B630 $ 55 PUSH EBP ; 算法CALL
- 0041B631 . 8BEC MOV EBP,ESP
- 0041B633 . 83EC 0C SUB ESP,0C
- 。。。。。。。。。。。。
- 。。。。。。。。。。。。
复制代码 由于我算法不行,主要找爆破的思路,前面分析时我没有留意下面这一点:
局部调用来自 004154F3, 004157E3, 00415B0D, 00419DBB, 0041B395
有5个地方调用了它,看来有程序中有多处检验,这次我逐个的看,着重看调用完返回后的下面的条件转向:
来自004154F3调用下面的条件转向:- 00415558 . 66:3BF3 CMP SI,BX
- 0041555B . 74 09 JE SHORT ok_Drive.00415566 ; 爆破点02 -- NOP掉
- 0041555D . 66:C705 74004>MOV WORD PTR DS:[420074],0FFFF ;注册标志02
复制代码 来自004157E3调用下面的条件转向:00415847 . 66:85F6 TEST SI,SI- 0041584A . 74 09 JE SHORT ok_Drive.00415855 ; 爆破点03 -- NOP掉
- 0041584C . 66:C705 70004>MOV WORD PTR DS:[420070],0FFFF ;注册标志03
复制代码 来自00415B0D调用下面的条件转向:- 00415B71 . 66:3BF7 CMP SI,DI
- 00415B74 . 74 09 JE SHORT ok_Drive.00415B7F ; 爆破点04 -- NOP掉
- 00415B76 . 66:C705 72004>MOV WORD PTR DS:[420072],0FFFF ;注册标志04
复制代码 来自00419DBB调用下面的条件转向:- 00419E22 . /74 09 JE SHORT ok_Drive.00419E2D ; 爆破点05 -- NOP掉
- 00419E24 . |66:C705 6E004>MOV WORD PTR DS:[42006E],0FFFF ;注册标志05
- 00419E2D > \C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
复制代码 来自0041B395调用下面的条件转向(就是前面修改过的那一处):- 0041B24A . 66:85F6 TEST SI,SI
- 0041B24D . 74 09 JE SHORT ok_Drive.0041B258 ; 爆破点01 -- NOP掉
- 0041B24F . 66:C705 6C004>MOV WORD PTR DS:[42006C],0FFFF ;注册标志01
复制代码 以上爆破点都给它NOP掉,保存修改,再试一下,错题统计的文字混乱问题已经没有了,可30道题的限制仍然没有解除。
那我们应该如何入手解决它呢?我每次点击“转下一题”就会变更题目序号,那就从“转下一题”按钮事件追起,
打开VBExplorer来看看事件处理入口,????没有找到,不是标准的按钮,估计是自定义控件包装了的按钮(许多软件开发者这样做,有时候不是为了统一界面风格用的,就是为了防破解!),我猜应该是应用程序文件夹下那个command.ocx干的事。换种方法找按钮事件入口:使用OllyHTML的“设置VB程序事件处理断点”脚本对所有事件下断,跑起程序来,逐个排除断点,最终单击“转下一题”按钮断下后F7一步来到这里:- 004159A0 /> \55 PUSH EBP ; "转下一题"按钮事件处理
- 004159A1 |. 8BEC MOV EBP,ESP
- 004159A3 |. 83EC 0C SUB ESP,0C
- 004159A6 |. 68 46184000 PUSH <JMP.&msvbvm60.__vbaExceptHandler> ; SE 处理程序安装
- 004159AB |. 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
- 004159B1 |. 50 PUSH EAX
- 004159B2 |. 64:8925 00000>MOV DWORD PTR FS:[0],ESP
- 004159B9 |. 83EC 08 SUB ESP,8
- 004159BC |. 53 PUSH EBX
- 004159BD |. 56 PUSH ESI
- 004159BE |. 57 PUSH EDI
- 004159BF |. 8965 F4 MOV [LOCAL.3],ESP
- 004159C2 |. C745 F8 00144>MOV [LOCAL.2],ok_Drive.00401400
- 004159C9 |. 8B75 08 MOV ESI,[ARG.1]
- 004159CC |. 8BC6 MOV EAX,ESI
- 004159CE |. 83E0 01 AND EAX,1
- 004159D1 |. 8945 FC MOV [LOCAL.1],EAX
- 004159D4 |. 83E6 FE AND ESI,FFFFFFFE
- 004159D7 |. 56 PUSH ESI
- 004159D8 |. 8975 08 MOV [ARG.1],ESI
- 004159DB |. 8B0E MOV ECX,DWORD PTR DS:[ESI]
- 004159DD |. FF51 04 CALL DWORD PTR DS:[ECX+4]
- 004159E0 |. 8B16 MOV EDX,DWORD PTR DS:[ESI]
- 004159E2 |. 56 PUSH ESI
- 004159E3 |. FF92 1C070000 CALL DWORD PTR DS:[EDX+71C] [color=Red];这里跟进去[/color]
复制代码 来到:- 004153E0 > \55 PUSH EBP
- 004153E1 . 8BEC MOV EBP,ESP
- 004153E3 . 83EC 08 SUB ESP,8
- 。。。。。。。。。。。。。。
- 00415411 . 66:391D 6C004>CMP WORD PTR DS:[42006C],BX ;检测前面我们爆破点01处的注册标志01
- 00415418 . 895D EC MOV DWORD PTR SS:[EBP-14],EBX
- 0041541B . 895D E8 MOV DWORD PTR SS:[EBP-18],EBX
- 0041541E . 895D E4 MOV DWORD PTR SS:[EBP-1C],EBX
- 00415421 . 895D D4 MOV DWORD PTR SS:[EBP-2C],EBX
- 00415424 . 895D C4 MOV DWORD PTR SS:[EBP-3C],EBX
- 00415427 . 895D B4 MOV DWORD PTR SS:[EBP-4C],EBX
- 0041542A . 895D A4 MOV DWORD PTR SS:[EBP-5C],EBX
- 0041542D . 895D 94 MOV DWORD PTR SS:[EBP-6C],EBX
- 00415430 . 0F85 94000000 JNZ ok_Drive.004154CA ;因为爆破点修改了,所以这里会直接跳走
- 00415436 . 66:3D 1E00 CMP AX,1E ; 30题
- 0041543A . /0F8C 8A000000 JL ok_Drive.004154CA
- 。。。。。。。。。。。。
- 。。。。。。。。。。。。
- 004154CA > 66:3D 5000 CMP AX,50 ;80题
- 004154CE . /0F85 98000000 JNZ ok_Drive.0041556C
- 。。。。。。。。。。。。
- 。。。。。。。。。。。。
- 0041556C > 66:3D 6400 CMP AX,64 ;100题
- 00415570 . 74 33 JE SHORT ok_Drive.004155A5
复制代码 跟一下流程,发现通过前面提到的几个爆破点都应该处理掉了,为了保险起见,对第30题、31题分别启动运行根踪,得到2份指令运行列表,并进行了对比,流程一致,但为啥30题后题目的内容不变了呢?看来问题不在主程序,应该在调用的外部模块上(有些黑呦!),因为运行根踪得到仅是程序领空的指令列表,并没有追进外部调用里去(不知OD能否通过设置实现?),那就手工跟一下上面00415570之后的代码,看看调用了啥外部模块(F7一直来到):- 00411C5D . BA 584E4000 MOV EDX,ok_Drive.00404E58 ; UNICODE "Check"
- 00411C62 . 8D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
- 00411C65 . FF15 8C114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCopy>] ; msvbvm60.__vbaStrCopy
- 00411C6B . 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
- 00411C6E . 8B17 MOV EDX,DWORD PTR DS:[EDI]
- 00411C70 . 8D85 44FFFFFF LEA EAX,DWORD PTR SS:[EBP-BC]
- 00411C76 . 50 PUSH EAX
- 00411C77 . 51 PUSH ECX
- 00411C78 . 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
- 00411C7B . 68 38004200 PUSH ok_Drive.00420038
- 00411C80 . 50 PUSH EAX
- 00411C81 . 57 PUSH EDI
- 00411C82 . FF52 28 CALL DWORD PTR DS:[EDX+28] ; Dats.023C19EF 这里调用了Dats.dll
复制代码 F7追进Dats.dll里:- 。。。。。。。。。。。。。
- 023C3F5F 68 B8233C02 PUSH Dats.023C23B8 ; UNICODE "Check"
- 023C3F64 66:8B39 MOV DI,WORD PTR DS:[ECX]
- 023C3F67 895D C8 MOV DWORD PTR SS:[EBP-38],EBX
- 023C3F6A 895D C4 MOV DWORD PTR SS:[EBP-3C],EBX
- 023C3F6D 895D B4 MOV DWORD PTR SS:[EBP-4C],EBX
- 023C3F70 895D A4 MOV DWORD PTR SS:[EBP-5C],EBX
- 023C3F73 895D 94 MOV DWORD PTR SS:[EBP-6C],EBX
- 023C3F76 895D 84 MOV DWORD PTR SS:[EBP-7C],EBX
- 023C3F79 899D 74FFFFFF MOV DWORD PTR SS:[EBP-8C],EBX
- 023C3F7F FF15 C8103C02 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCmp>] ; msvbvm60.__vbaStrCmp
- 023C3F85 F7D8 NEG EAX
- 023C3F87 1BC0 SBB EAX,EAX
- 023C3F89 33C9 XOR ECX,ECX
- 023C3F8B F7D8 NEG EAX
- 023C3F8D 66:83FF 1E CMP DI,1E ;[color=Red]关键!!题目序号与十进制30比较[/color]
- 023C3F91 0F9CC1 SETL CL
- 023C3F94 0BC1 OR EAX,ECX
- 023C3F96 0F85 B6000000 JNZ Dats.023C4052 ;[color=Red]大于30则去进行注册验证[/color],
复制代码 从功能上分析,Dats.dll是取题库数据,大于30且没注册则不返回新题。
我这里选爆破点为:
023C3F8D 66:83FF 1E CMP DI,1E ;0x1E修改为比总题100(0x64)数大的一个数,如0x66
保存修改,再试一下,全部OK了!
综上:主程序中我找了5个爆破点,Dats.dll中1个爆破点,修改完就OK。
通用补丁的制作:
由于此程序对应于不同省区发布了不同的定制版本,主程序及Dats.dll不通用,但注册算法是一样的,爆破点的偏移位置在不同版本中不一样,于是找了下爆破点的代码特征,针对加壳的原始主程序采用loader方式来在内存中进行补丁(不改变原始程序),Dats.dll则采用Patch修补文件方式。
V1.02_patch.zip
(14.76 KB, 下载次数: 37)
--------------------------------------------------------------------------------
【版权声明】: 本文原创于ChinaPYG技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年01月30日 3:13:23
[ 本帖最后由 roking 于 2008-3-17 18:12 编辑 ] |
评分
-
查看全部评分
|