roking 发表于 2008-1-30 03:14:56

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 编辑 ]

puti67 发表于 2008-1-30 09:45:48

太厉害了,顶一下!学习中!!!

yanggh1963 发表于 2008-1-30 10:12:58

学习中!!!/:good /:good /:good

婵儿 发表于 2008-1-30 22:35:34

学习中!!!/:014 /:014

天骄 发表于 2008-2-5 11:30:35

谢谢,分析得很详细!!!学到了不少。

chsmr 发表于 2008-2-27 16:49:57

学习中,谢谢分享!学到了不少。

tony2008 发表于 2008-2-27 16:53:14

谢谢分享!

Nisy 发表于 2008-3-23 20:51:10

高 实在是高 里里外外都给分析透了 ~ 用工具把这个程序的各个时间都给剖析了~~

yayaw 发表于 2008-3-25 22:32:34

不容易看呀。。有点难了。。。

恶魔天尊 发表于 2008-3-26 19:28:19

我看了都不容易,你写就更不容易了,辛苦了!谢谢分享!学到了不少
页: [1] 2 3
查看完整版本: XXX省2007**模拟考试系统 1.02破解分析+各省市通用补丁