XXX省2007**模拟考试系统 1.02破解分析+各省市通用补丁
【文章标题】: 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:
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:,AL
00401B7C .0000 ADD BYTE PTR DS:,AL
00401B7E .0000 ADD BYTE PTR DS:,AL
00401B80 .3000 XOR BYTE PTR DS:,AL
00401B82 .0000 ADD BYTE PTR DS:,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:,de_Drive.00406>;UNICODE "Dats.dll"
0041B124 .C745 CC 08000>MOV DWORD PTR SS:,8
0041B12B .FFD7 CALL EDI ;<&msvbvm60.__vbaVarDup>
0041B12D .8D45 DC LEA EAX,DWORD PTR SS:
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:
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:
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:
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:
0041B175 .8D4D DC LEA ECX,DWORD PTR SS:
0041B178 .C745 D4 6C654>MOV DWORD PTR SS:,de_Drive.00406>;UNICODE "REGSVR32 /s Dats.dll"
0041B17F .C745 CC 08000>MOV DWORD PTR SS:,8
0041B186 .FFD7 CALL EDI
0041B188 .8D4D DC LEA ECX,DWORD PTR SS:
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:
0041B197 .DDD8 FSTP ST
0041B199 .FFD3 CALL EBX
0041B19B >8D55 CC LEA EDX,DWORD PTR SS:
0041B19E .8D4D DC LEA ECX,DWORD PTR SS:
0041B1A1 .C745 D4 7C644>MOV DWORD PTR SS:,de_Drive.00406>;UNICODE "Images.dll"
0041B1A8 .C745 CC 08000>MOV DWORD PTR SS:,8
0041B1AF .FFD7 CALL EDI
0041B1B1 .8D55 DC LEA EDX,DWORD PTR SS:
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:
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:
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:
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:
0041B1F4 .8D4D DC LEA ECX,DWORD PTR SS:
0041B1F7 .C745 D4 9C654>MOV DWORD PTR SS:,de_Drive.00406>;UNICODE "REGSVR32 /s Images.dll"
0041B1FE .C745 CC 08000>MOV DWORD PTR SS:,8
0041B205 .FFD7 CALL EDI
0041B207 .8D45 DC LEA EAX,DWORD PTR SS:
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:由上面代码可知出错原因应该是在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:
0041AE38 .8D55 D0 LEA EDX,DWORD PTR SS:
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:得知输入的注册码存入注册表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:
0041B224 .FF15 DC114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrMo>;msvbvm60.__vbaStrMove
0041B22A .8D4D EC LEA ECX,DWORD PTR SS:
0041B22D .51 PUSH ECX
0041B22E .E8 DD000000 CALL ok_Drive.0041B310 ;关键Call----重起验证(搞算法的进去)
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:
0041B241 .66:8BF2 MOV SI,DX
0041B244 .FF15 14124000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>;msvbvm60.__vbaFreeStr
0041B24A .66:85F6 TEST SI,SI
0041B24D .74 09 JE SHORT ok_Drive.0041B258 ;爆破点01 -- NOP掉
0041B24F .66:C705 6C004>MOV WORD PTR DS:,0FFFF ;注册标志01
0041B258 >A1 10004200 MOV EAX,DWORD PTR DS:
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:
0041B321 .50 PUSH EAX
0041B322 .64:8925 00000>MOV DWORD PTR FS:,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:,ESP
0041B332 .C745 FC 58154>MOV DWORD PTR SS:,ok_Drive.004015>
0041B339 .33F6 XOR ESI,ESI
0041B33B .8975 EC MOV DWORD PTR SS:,ESI
0041B33E .8975 E8 MOV DWORD PTR SS:,ESI
0041B341 .8975 E4 MOV DWORD PTR SS:,ESI
0041B344 .8975 D4 MOV DWORD PTR SS:,ESI
0041B347 .8975 C4 MOV DWORD PTR SS:,ESI
0041B34A .8975 B4 MOV DWORD PTR SS:,ESI
0041B34D .8975 A4 MOV DWORD PTR SS:,ESI
0041B350 .8975 94 MOV DWORD PTR SS:,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:
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:
0041B377 .FFD3 CALL EBX ; 注册码试练码放在0042003C
0041B379 .8B15 38004200 MOV EDX,DWORD PTR DS:
0041B37F .8D4D EC LEA ECX,DWORD PTR SS:
0041B382 .FFD3 CALL EBX
0041B384 .8B0D 3C004200 MOV ECX,DWORD PTR DS:
0041B38A .68 D9840000 PUSH 84D9
0041B38F .68 DD170000 PUSH 17DD
0041B394 .51 PUSH ECX
0041B395 .E8 96020000 CALL ok_Drive.0041B630 ;关键!!跟进去来到: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:,0FFFF;注册标志02来自004157E3调用下面的条件转向:00415847 .66:85F6 TEST SI,SI0041584A .74 09 JE SHORT ok_Drive.00415855; 爆破点03 -- NOP掉
0041584C .66:C705 70004>MOV WORD PTR DS:,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:,0FFFF ;注册标志04来自00419DBB调用下面的条件转向:00419E22 . /74 09 JE SHORT ok_Drive.00419E2D ; 爆破点05 -- NOP掉
00419E24 . |66:C705 6E004>MOV WORD PTR DS:,0FFFF;注册标志05
00419E2D > \C745 FC 00000>MOV DWORD PTR SS:,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:,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:
004159B1|.50 PUSH EAX
004159B2|.64:8925 00000>MOV DWORD PTR FS:,ESP
004159B9|.83EC 08 SUB ESP,8
004159BC|.53 PUSH EBX
004159BD|.56 PUSH ESI
004159BE|.57 PUSH EDI
004159BF|.8965 F4 MOV ,ESP
004159C2|.C745 F8 00144>MOV ,ok_Drive.00401400
004159C9|.8B75 08 MOV ESI,
004159CC|.8BC6 MOV EAX,ESI
004159CE|.83E0 01 AND EAX,1
004159D1|.8945 FC MOV ,EAX
004159D4|.83E6 FE AND ESI,FFFFFFFE
004159D7|.56 PUSH ESI
004159D8|.8975 08 MOV ,ESI
004159DB|.8B0E MOV ECX,DWORD PTR DS:
004159DD|.FF51 04 CALL DWORD PTR DS:
004159E0|.8B16 MOV EDX,DWORD PTR DS:
004159E2|.56 PUSH ESI
004159E3|.FF92 1C070000 CALL DWORD PTR DS: ;这里跟进去来到:004153E0 > \55 PUSH EBP
004153E1 .8BEC MOV EBP,ESP
004153E3 .83EC 08 SUB ESP,8
。。。。。。。。。。。。。。
00415411 .66:391D 6C004>CMP WORD PTR DS:,BX ;检测前面我们爆破点01处的注册标志01
00415418 .895D EC MOV DWORD PTR SS:,EBX
0041541B .895D E8 MOV DWORD PTR SS:,EBX
0041541E .895D E4 MOV DWORD PTR SS:,EBX
00415421 .895D D4 MOV DWORD PTR SS:,EBX
00415424 .895D C4 MOV DWORD PTR SS:,EBX
00415427 .895D B4 MOV DWORD PTR SS:,EBX
0041542A .895D A4 MOV DWORD PTR SS:,EBX
0041542D .895D 94 MOV DWORD PTR SS:,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:
00411C65 .FF15 8C114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCopy>] ;msvbvm60.__vbaStrCopy
00411C6B .8B4D 0C MOV ECX,DWORD PTR SS:
00411C6E .8B17 MOV EDX,DWORD PTR DS:
00411C70 .8D85 44FFFFFF LEA EAX,DWORD PTR SS:
00411C76 .50 PUSH EAX
00411C77 .51 PUSH ECX
00411C78 .8D45 E8 LEA EAX,DWORD PTR SS:
00411C7B .68 38004200 PUSH ok_Drive.00420038
00411C80 .50 PUSH EAX
00411C81 .57 PUSH EDI
00411C82 .FF52 28 CALL DWORD PTR DS: ;Dats.023C19EF 这里调用了Dats.dllF7追进Dats.dll里: 。。。。。。。。。。。。。
023C3F5F 68 B8233C02 PUSH Dats.023C23B8 ; UNICODE "Check"
023C3F64 66:8B39 MOV DI,WORD PTR DS:
023C3F67 895D C8 MOV DWORD PTR SS:,EBX
023C3F6A 895D C4 MOV DWORD PTR SS:,EBX
023C3F6D 895D B4 MOV DWORD PTR SS:,EBX
023C3F70 895D A4 MOV DWORD PTR SS:,EBX
023C3F73 895D 94 MOV DWORD PTR SS:,EBX
023C3F76 895D 84 MOV DWORD PTR SS:,EBX
023C3F79 899D 74FFFFFF MOV DWORD PTR SS:,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 ;关键!!题目序号与十进制30比较
023C3F91 0F9CC1 SETL CL
023C3F94 0BC1 OR EAX,ECX
023C3F96 0F85 B6000000 JNZ Dats.023C4052 ;大于30则去进行注册验证,从功能上分析,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修补文件方式。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于ChinaPYG技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年01月30日 3:13:23
[ 本帖最后由 roking 于 2008-3-17 18:12 编辑 ] 太厉害了,顶一下!学习中!!! 学习中!!!/:good /:good /:good 学习中!!!/:014 /:014 谢谢,分析得很详细!!!学到了不少。 学习中,谢谢分享!学到了不少。 谢谢分享! 高 实在是高 里里外外都给分析透了 ~ 用工具把这个程序的各个时间都给剖析了~~ 不容易看呀。。有点难了。。。 我看了都不容易,你写就更不容易了,辛苦了!谢谢分享!学到了不少