飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 9894|回复: 20

[原创] XXX省2007**模拟考试系统 1.02破解分析+各省市通用补丁

[复制链接]
  • TA的每日心情
    开心
    2018-7-21 10:19
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2008-1-30 03:14:56 | 显示全部楼层 |阅读模式
    【文章标题】: 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&*",我这里来到:
    1. 00450094    56              PUSH ESI     ; de_Drive.00401D60 记下此内存地址,用于恢复VB程序的第一条指令
    2. 00450095    8F4425 00       POP DWORD PTR SS:[EBP]
    3. 00450099    5E              POP ESI
    4. 0045009A    5D              POP EBP
    5. 0045009B    66:9D           POPFW
    6. 0045009D    E8 C81AFBFF     CALL <JMP.&msvbvm60.ThunRTMain>   ;偷走的第2条指令
    7. 004500A2    E9 00000000     JMP de_Drive.004500A7
    复制代码
    对于VB程序的入口点有这2条指令就够了,我这里修复如下:
    1. 00401B70 > $  68 601D4000   PUSH de_Drive.00401D60      ;  ASCII "VB5!6&*"
    2. 00401B75   .  E8 F0FFFFFF   CALL <JMP.&msvbvm60.ThunRTMain>
    3. 00401B7A   .  0000          ADD BYTE PTR DS:[EAX],AL
    4. 00401B7C   .  0000          ADD BYTE PTR DS:[EAX],AL
    5. 00401B7E   .  0000          ADD BYTE PTR DS:[EAX],AL
    6. 00401B80   .  3000          XOR BYTE PTR DS:[EAX],AL
    7. 00401B82   .  0000          ADD BYTE PTR DS:[EAX],AL
    8. 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跟一下(看注释):
    1. 0041B0E0   .  55            PUSH EBP             ;  启动代码sub main()入口
    2. 0041B0E1   .  8BEC          MOV EBP,ESP
    3. 0041B0E3   .  83EC 08       SUB ESP,8
    4.        。。。。。。。。。。。。。。。。。。。。
    5.        。。。。。。。。。。。。。。。。。。。。
    6. 0041B11D   .  C745 D4 54654>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>;  UNICODE "Dats.dll"
    7. 0041B124   .  C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
    8. 0041B12B   .  FFD7          CALL EDI                                 ;  <&msvbvm60.__vbaVarDup>
    9. 0041B12D   .  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
    10. 0041B130   .  56            PUSH ESI
    11. 0041B131   .  50            PUSH EAX
    12. 0041B132   .  FF15 64114000 CALL DWORD PTR DS:[<&msvbvm60.rtcDir>]   ;  msvbvm60.rtcDir
    13. 0041B138   .  8BD0          MOV EDX,EAX
    14. 0041B13A   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    15. 0041B13D   .  FF15 DC114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrMo>;  msvbvm60.__vbaStrMove
    16. 0041B143   .  50            PUSH EAX
    17. 0041B144   .  68 08474000   PUSH de_Drive.00404708
    18. 0041B149   .  FF15 DC104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCm>;  msvbvm60.__vbaStrCmp
    19. 0041B14F   .  8BF0          MOV ESI,EAX
    20. 0041B151   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    21. 0041B154   .  F7DE          NEG ESI
    22. 0041B156   .  1BF6          SBB ESI,ESI
    23. 0041B158   .  F7DE          NEG ESI
    24. 0041B15A   .  F7DE          NEG ESI
    25. 0041B15C   .  FF15 14124000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStr
    26. 0041B162   .  8B1D 20104000 MOV EBX,DWORD PTR DS:[<&msvbvm60.__vbaFr>;  msvbvm60.__vbaFreeVar
    27. 0041B168   .  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
    28. 0041B16B   .  FFD3          CALL EBX                                 ;  <&msvbvm60.__vbaFreeVar>
    29. 0041B16D   .  66:85F6       TEST SI,SI
    30. 0041B170   .  74 29         JE SHORT de_Drive.0041B19B                                        ;//这里暂时JMP过去,原因看下面
    31. 0041B172   .  8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
    32. 0041B175   .  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
    33. 0041B178   .  C745 D4 6C654>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>;  UNICODE "REGSVR32 /s Dats.dll"
    34. 0041B17F   .  C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
    35. 0041B186   .  FFD7          CALL EDI
    36. 0041B188   .  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
    37. 0041B18B   .  6A 02         PUSH 2
    38. 0041B18D   .  51            PUSH ECX
    39. 0041B18E   .  FF15 14114000 CALL DWORD PTR DS:[<&msvbvm60.rtcShell>] ;  msvbvm60.rtcShell //这里出错!!
    40. 0041B194   .  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
    41. 0041B197   .  DDD8          FSTP ST
    42. 0041B199   .  FFD3          CALL EBX
    43. 0041B19B   >  8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
    44. 0041B19E   .  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
    45. 0041B1A1   .  C745 D4 7C644>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>;  UNICODE "Images.dll"
    46. 0041B1A8   .  C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
    47. 0041B1AF   .  FFD7          CALL EDI
    48. 0041B1B1   .  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
    49. 0041B1B4   .  6A 00         PUSH 0
    50. 0041B1B6   .  52            PUSH EDX
    51. 0041B1B7   .  FF15 64114000 CALL DWORD PTR DS:[<&msvbvm60.rtcDir>]   ;  msvbvm60.rtcDir
    52. 0041B1BD   .  8BD0          MOV EDX,EAX
    53. 0041B1BF   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    54. 0041B1C2   .  FF15 DC114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrMo>;  msvbvm60.__vbaStrMove
    55. 0041B1C8   .  50            PUSH EAX
    56. 0041B1C9   .  68 08474000   PUSH de_Drive.00404708
    57. 0041B1CE   .  FF15 DC104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCm>;  msvbvm60.__vbaStrCmp
    58. 0041B1D4   .  8BF0          MOV ESI,EAX
    59. 0041B1D6   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    60. 0041B1D9   .  F7DE          NEG ESI
    61. 0041B1DB   .  1BF6          SBB ESI,ESI
    62. 0041B1DD   .  F7DE          NEG ESI
    63. 0041B1DF   .  F7DE          NEG ESI
    64. 0041B1E1   .  FF15 14124000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStr
    65. 0041B1E7   .  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
    66. 0041B1EA   .  FFD3          CALL EBX
    67. 0041B1EC   .  66:85F6       TEST SI,SI
    68. 0041B1EF   .  74 29         JE SHORT de_Drive.0041B21A                                        ;//这里暂时JMP过去,原因看下面
    69. 0041B1F1   .  8D55 CC       LEA EDX,DWORD PTR SS:[EBP-34]
    70. 0041B1F4   .  8D4D DC       LEA ECX,DWORD PTR SS:[EBP-24]
    71. 0041B1F7   .  C745 D4 9C654>MOV DWORD PTR SS:[EBP-2C],de_Drive.00406>;  UNICODE "REGSVR32 /s Images.dll"
    72. 0041B1FE   .  C745 CC 08000>MOV DWORD PTR SS:[EBP-34],8
    73. 0041B205   .  FFD7          CALL EDI
    74. 0041B207   .  8D45 DC       LEA EAX,DWORD PTR SS:[EBP-24]
    75. 0041B20A   .  6A 02         PUSH 2
    76. 0041B20C   .  50            PUSH EAX
    77. 0041B20D   .  FF15 14114000 CALL DWORD PTR DS:[<&msvbvm60.rtcShell>] ;  msvbvm60.rtcShell  //这里出错!!
    78. 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中下断跟一下:
    1. 0041AC80   > \55            PUSH EBP       ;  “软件注册”窗口中“确定”按钮的click事件处理入口
    2. 0041AC81   .  8BEC          MOV EBP,ESP
    3. 0041AC83   .  83EC 0C       SUB ESP,0C
    4. 0041AC86   .  68 46184000   PUSH <JMP.&msvbvm60.__vbaExceptHandler>  ;  SE 处理程序安装
    5.      。。。。。。。。。。。。。。。。。。
    6.      。。。。。。。。。。。。。。。。。。
    7. 0041AD3F   .  66:3BFB       CMP DI,BX
    8. 0041AD42   .  0F85 58010000 JNZ ok_Drive.0041AEA0      ;  序列号输入框里若是“关闭软件,重新打开!!”则跳走
    9.      。。。。。。。。。。。。。。。。。。
    10.      。。。。。。。。。。。。。。。。。。
    11. 0041AE35   .  8D4D E4       LEA ECX,DWORD PTR SS:[EBP-1C]
    12. 0041AE38   .  8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
    13. 0041AE3B   .  51            PUSH ECX
    14. 0041AE3C   .  52            PUSH EDX
    15. 0041AE3D   .  E8 DE060000   CALL ok_Drive.0041B520      ;  这里跟入进去是写注册表HKEY_LOCAL_MACHINE\SOFTWARE\DriverTest  "SN"=??
    16. 0041AE42   .  8D4D E4       LEA ECX,DWORD PTR SS:[EBP-1C]
    复制代码
    得知输入的注册码存入注册表HKEY_LOCAL_MACHINE\SOFTWARE\DriverTest的SN键里。并提示重启验证。

    OD重新载入目标程序,再前面找到的程序sub main()启动代码0041B0E0处设断,进行重启过程分析:
    1. 0041B0E0   .  55            PUSH EBP             ;  启动模块入口
    2. 0041B0E1   .  8BEC          MOV EBP,ESP
    3. 0041B0E3   .  83EC 08       SUB ESP,8
    4.   。。。。。。。。。。。。。。。
    5.   。。。。。。。。。。。。。。。
    6. 0041B21A   >  E8 31020000   CALL ok_Drive.0041B450        ;  从注册表里读取假码--EAX
    7. 0041B21F   .  8BD0          MOV EDX,EAX
    8. 0041B221   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    9. 0041B224   .  FF15 DC114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrMo>;  msvbvm60.__vbaStrMove
    10. 0041B22A   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    11. 0041B22D   .  51            PUSH ECX
    12. 0041B22E   .  E8 DD000000   CALL ok_Drive.0041B310      ;[color=Red]关键Call----重起验证(搞算法的进去)[/color]
    13. 0041B233   .  33D2          XOR EDX,EDX
    14. 0041B235   .  66:3D FFFF    CMP AX,0FFFF
    15. 0041B239   .  0F94C2        SETE DL
    16. 0041B23C   .  F7DA          NEG EDX
    17. 0041B23E   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    18. 0041B241   .  66:8BF2       MOV SI,DX
    19. 0041B244   .  FF15 14124000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeS>;  msvbvm60.__vbaFreeStr
    20. 0041B24A   .  66:85F6       TEST SI,SI
    21. [color=Red]0041B24D   .  74 09         JE SHORT ok_Drive.0041B258     ;  爆破点01 -- NOP掉
    22. 0041B24F   .  66:C705 6C004>MOV WORD PTR DS:[42006C],0FFFF        ;注册标志01[/color]
    23. 0041B258   >  A1 10004200   MOV EAX,DWORD PTR DS:[420010]
    24. 0041B25D   .  85C0          TEST EAX,EAX
    复制代码
    保存修改后,试一下!哇塞!没有注册窗口了,窗口标题提示是注册版了。这么简单?
    别高兴太早,再试一下,做题到30道以后,题就不会变了,而且随机的错题统计里会出现文字错乱难以阅读。,看来还得跟进上面的关键Call细细分析下:
    1. 0041B310   $  55            PUSH EBP
    2. 0041B311   .  8BEC          MOV EBP,ESP
    3. 0041B313   .  83EC 08       SUB ESP,8
    4. 0041B316   .  68 46184000   PUSH <JMP.&msvbvm60.__vbaExceptHandler>  ;  SE 处理程序安装
    5. 0041B31B   .  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
    6. 0041B321   .  50            PUSH EAX
    7. 0041B322   .  64:8925 00000>MOV DWORD PTR FS:[0],ESP
    8. 0041B329   .  83EC 64       SUB ESP,64
    9. 0041B32C   .  53            PUSH EBX
    10. 0041B32D   .  56            PUSH ESI
    11. 0041B32E   .  57            PUSH EDI
    12. 0041B32F   .  8965 F8       MOV DWORD PTR SS:[EBP-8],ESP
    13. 0041B332   .  C745 FC 58154>MOV DWORD PTR SS:[EBP-4],ok_Drive.004015>
    14. 0041B339   .  33F6          XOR ESI,ESI
    15. 0041B33B   .  8975 EC       MOV DWORD PTR SS:[EBP-14],ESI
    16. 0041B33E   .  8975 E8       MOV DWORD PTR SS:[EBP-18],ESI
    17. 0041B341   .  8975 E4       MOV DWORD PTR SS:[EBP-1C],ESI
    18. 0041B344   .  8975 D4       MOV DWORD PTR SS:[EBP-2C],ESI
    19. 0041B347   .  8975 C4       MOV DWORD PTR SS:[EBP-3C],ESI
    20. 0041B34A   .  8975 B4       MOV DWORD PTR SS:[EBP-4C],ESI
    21. 0041B34D   .  8975 A4       MOV DWORD PTR SS:[EBP-5C],ESI
    22. 0041B350   .  8975 94       MOV DWORD PTR SS:[EBP-6C],ESI
    23. 0041B353   .  E8 880C0000   CALL ok_Drive.0041BFE0                ;读机器码
    24. 0041B358   .  8B3D DC114000 MOV EDI,DWORD PTR DS:[<&msvbvm60.__vbaSt>;  msvbvm60.__vbaStrMove
    25. 0041B35E   .  8BD0          MOV EDX,EAX
    26. 0041B360   .  B9 38004200   MOV ECX,ok_Drive.00420038
    27. 0041B365   .  FFD7          CALL EDI                       ;机器码放到00420038
    28. 0041B367   .  8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
    29. 0041B36A   .  8B1D 8C114000 MOV EBX,DWORD PTR DS:[<&msvbvm60.__vbaSt>;  msvbvm60.__vbaStrCopy
    30. 0041B370   .  B9 3C004200   MOV ECX,ok_Drive.0042003C
    31. 0041B375   .  8B10          MOV EDX,DWORD PTR DS:[EAX]
    32. 0041B377   .  FFD3          CALL EBX                       ; 注册码试练码放在0042003C
    33. 0041B379   .  8B15 38004200 MOV EDX,DWORD PTR DS:[420038]
    34. 0041B37F   .  8D4D EC       LEA ECX,DWORD PTR SS:[EBP-14]
    35. 0041B382   .  FFD3          CALL EBX
    36. 0041B384   .  8B0D 3C004200 MOV ECX,DWORD PTR DS:[42003C]
    37. 0041B38A   .  68 D9840000   PUSH 84D9
    38. 0041B38F   .  68 DD170000   PUSH 17DD
    39. 0041B394   .  51            PUSH ECX
    40. [color=Red]0041B395   .  E8 96020000   CALL ok_Drive.0041B630         ;关键!!跟进去[/color]
    复制代码
    来到:
    1. 0041B630   $  55            PUSH EBP        ;  算法CALL
    2. 0041B631   .  8BEC          MOV EBP,ESP
    3. 0041B633   .  83EC 0C       SUB ESP,0C
    4.     。。。。。。。。。。。。
    5.     。。。。。。。。。。。。
    复制代码
    由于我算法不行,主要找爆破的思路,前面分析时我没有留意下面这一点:

            局部调用来自 004154F3, 004157E3, 00415B0D, 00419DBB, 0041B395
           
    有5个地方调用了它,看来有程序中有多处检验,这次我逐个的看,着重看调用完返回后的下面的条件转向:

    来自004154F3调用下面的条件转向:
    1. 00415558   .  66:3BF3       CMP SI,BX
    2. 0041555B   .  74 09         JE SHORT ok_Drive.00415566        ; 爆破点02 -- NOP掉
    3. 0041555D   .  66:C705 74004>MOV WORD PTR DS:[420074],0FFFF  ;注册标志02
    复制代码
    来自004157E3调用下面的条件转向:00415847   .  66:85F6       TEST SI,SI
    1. 0041584A   .  74 09         JE SHORT ok_Drive.00415855  ; 爆破点03 -- NOP掉
    2. 0041584C   .  66:C705 70004>MOV WORD PTR DS:[420070],0FFFF ;注册标志03
    复制代码
    来自00415B0D调用下面的条件转向:
    1. 00415B71   .  66:3BF7       CMP SI,DI
    2. 00415B74   .  74 09         JE SHORT ok_Drive.00415B7F  ; 爆破点04 -- NOP掉
    3. 00415B76   .  66:C705 72004>MOV WORD PTR DS:[420072],0FFFF ;注册标志04
    复制代码
    来自00419DBB调用下面的条件转向:
    1. 00419E22   . /74 09         JE SHORT ok_Drive.00419E2D ; 爆破点05 -- NOP掉
    2. 00419E24   . |66:C705 6E004>MOV WORD PTR DS:[42006E],0FFFF  ;注册标志05
    3. 00419E2D   > \C745 FC 00000>MOV DWORD PTR SS:[EBP-4],0
    复制代码
    来自0041B395调用下面的条件转向(就是前面修改过的那一处):
    1. 0041B24A   .  66:85F6       TEST SI,SI
    2. 0041B24D   .  74 09         JE SHORT ok_Drive.0041B258     ;  爆破点01 -- NOP掉
    3. 0041B24F   .  66:C705 6C004>MOV WORD PTR DS:[42006C],0FFFF        ;注册标志01
    复制代码
    以上爆破点都给它NOP掉,保存修改,再试一下,错题统计的文字混乱问题已经没有了,可30道题的限制仍然没有解除。

    那我们应该如何入手解决它呢?我每次点击“转下一题”就会变更题目序号,那就从“转下一题”按钮事件追起,
    打开VBExplorer来看看事件处理入口,????没有找到,不是标准的按钮,估计是自定义控件包装了的按钮(许多软件开发者这样做,有时候不是为了统一界面风格用的,就是为了防破解!),我猜应该是应用程序文件夹下那个command.ocx干的事。换种方法找按钮事件入口:使用OllyHTML的“设置VB程序事件处理断点”脚本对所有事件下断,跑起程序来,逐个排除断点,最终单击“转下一题”按钮断下后F7一步来到这里:
    1. 004159A0  /> \55            PUSH EBP            ;  "转下一题"按钮事件处理
    2. 004159A1  |.  8BEC          MOV EBP,ESP
    3. 004159A3  |.  83EC 0C       SUB ESP,0C
    4. 004159A6  |.  68 46184000   PUSH <JMP.&msvbvm60.__vbaExceptHandler>  ;  SE 处理程序安装
    5. 004159AB  |.  64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
    6. 004159B1  |.  50            PUSH EAX
    7. 004159B2  |.  64:8925 00000>MOV DWORD PTR FS:[0],ESP
    8. 004159B9  |.  83EC 08       SUB ESP,8
    9. 004159BC  |.  53            PUSH EBX
    10. 004159BD  |.  56            PUSH ESI
    11. 004159BE  |.  57            PUSH EDI
    12. 004159BF  |.  8965 F4       MOV [LOCAL.3],ESP
    13. 004159C2  |.  C745 F8 00144>MOV [LOCAL.2],ok_Drive.00401400
    14. 004159C9  |.  8B75 08       MOV ESI,[ARG.1]
    15. 004159CC  |.  8BC6          MOV EAX,ESI
    16. 004159CE  |.  83E0 01       AND EAX,1
    17. 004159D1  |.  8945 FC       MOV [LOCAL.1],EAX
    18. 004159D4  |.  83E6 FE       AND ESI,FFFFFFFE
    19. 004159D7  |.  56            PUSH ESI
    20. 004159D8  |.  8975 08       MOV [ARG.1],ESI
    21. 004159DB  |.  8B0E          MOV ECX,DWORD PTR DS:[ESI]
    22. 004159DD  |.  FF51 04       CALL DWORD PTR DS:[ECX+4]
    23. 004159E0  |.  8B16          MOV EDX,DWORD PTR DS:[ESI]
    24. 004159E2  |.  56            PUSH ESI
    25. 004159E3  |.  FF92 1C070000 CALL DWORD PTR DS:[EDX+71C]        [color=Red];这里跟进去[/color]
    复制代码
    来到:
    1. 004153E0   > \55            PUSH EBP
    2. 004153E1   .  8BEC          MOV EBP,ESP
    3. 004153E3   .  83EC 08       SUB ESP,8
    4.    。。。。。。。。。。。。。。
    5. 00415411   .  66:391D 6C004>CMP WORD PTR DS:[42006C],BX   ;检测前面我们爆破点01处的注册标志01
    6. 00415418   .  895D EC       MOV DWORD PTR SS:[EBP-14],EBX
    7. 0041541B   .  895D E8       MOV DWORD PTR SS:[EBP-18],EBX
    8. 0041541E   .  895D E4       MOV DWORD PTR SS:[EBP-1C],EBX
    9. 00415421   .  895D D4       MOV DWORD PTR SS:[EBP-2C],EBX
    10. 00415424   .  895D C4       MOV DWORD PTR SS:[EBP-3C],EBX
    11. 00415427   .  895D B4       MOV DWORD PTR SS:[EBP-4C],EBX
    12. 0041542A   .  895D A4       MOV DWORD PTR SS:[EBP-5C],EBX
    13. 0041542D   .  895D 94       MOV DWORD PTR SS:[EBP-6C],EBX
    14. 00415430   .  0F85 94000000 JNZ ok_Drive.004154CA          ;因为爆破点修改了,所以这里会直接跳走
    15. 00415436   .  66:3D 1E00    CMP AX,1E                ;  30题
    16. 0041543A   . /0F8C 8A000000 JL ok_Drive.004154CA   
    17.                                         。。。。。。。。。。。。
    18.                                         。。。。。。。。。。。。
    19. 004154CA   >  66:3D 5000    CMP AX,50   ;80题
    20. 004154CE   . /0F85 98000000 JNZ ok_Drive.0041556C
    21.           。。。。。。。。。。。。
    22.           。。。。。。。。。。。。
    23. 0041556C   >  66:3D 6400    CMP AX,64  ;100题
    24. 00415570   .  74 33         JE SHORT ok_Drive.004155A5
    复制代码
    跟一下流程,发现通过前面提到的几个爆破点都应该处理掉了,为了保险起见,对第30题、31题分别启动运行根踪,得到2份指令运行列表,并进行了对比,流程一致,但为啥30题后题目的内容不变了呢?看来问题不在主程序,应该在调用的外部模块上(有些黑呦!),因为运行根踪得到仅是程序领空的指令列表,并没有追进外部调用里去(不知OD能否通过设置实现?),那就手工跟一下上面00415570之后的代码,看看调用了啥外部模块(F7一直来到):
    1. 00411C5D   .  BA 584E4000   MOV EDX,ok_Drive.00404E58       ;  UNICODE "Check"
    2. 00411C62   .  8D4D E8       LEA ECX,DWORD PTR SS:[EBP-18]
    3. 00411C65   .  FF15 8C114000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCopy>] ;  msvbvm60.__vbaStrCopy
    4. 00411C6B   .  8B4D 0C       MOV ECX,DWORD PTR SS:[EBP+C]
    5. 00411C6E   .  8B17          MOV EDX,DWORD PTR DS:[EDI]
    6. 00411C70   .  8D85 44FFFFFF LEA EAX,DWORD PTR SS:[EBP-BC]
    7. 00411C76   .  50            PUSH EAX
    8. 00411C77   .  51            PUSH ECX
    9. 00411C78   .  8D45 E8       LEA EAX,DWORD PTR SS:[EBP-18]
    10. 00411C7B   .  68 38004200   PUSH ok_Drive.00420038
    11. 00411C80   .  50            PUSH EAX
    12. 00411C81   .  57            PUSH EDI
    13. 00411C82   .  FF52 28       CALL DWORD PTR DS:[EDX+28]    ;  Dats.023C19EF 这里调用了Dats.dll
    复制代码
    F7追进Dats.dll里:
    1.     。。。。。。。。。。。。。
    2. 023C3F5F    68 B8233C02     PUSH Dats.023C23B8               ; UNICODE "Check"
    3. 023C3F64    66:8B39         MOV DI,WORD PTR DS:[ECX]
    4. 023C3F67    895D C8         MOV DWORD PTR SS:[EBP-38],EBX
    5. 023C3F6A    895D C4         MOV DWORD PTR SS:[EBP-3C],EBX
    6. 023C3F6D    895D B4         MOV DWORD PTR SS:[EBP-4C],EBX
    7. 023C3F70    895D A4         MOV DWORD PTR SS:[EBP-5C],EBX
    8. 023C3F73    895D 94         MOV DWORD PTR SS:[EBP-6C],EBX
    9. 023C3F76    895D 84         MOV DWORD PTR SS:[EBP-7C],EBX
    10. 023C3F79    899D 74FFFFFF   MOV DWORD PTR SS:[EBP-8C],EBX
    11. 023C3F7F    FF15 C8103C02   CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCmp>]    ; msvbvm60.__vbaStrCmp
    12. 023C3F85    F7D8            NEG EAX
    13. 023C3F87    1BC0            SBB EAX,EAX
    14. 023C3F89    33C9            XOR ECX,ECX
    15. 023C3F8B    F7D8            NEG EAX
    16. 023C3F8D    66:83FF 1E      CMP DI,1E    ;[color=Red]关键!!题目序号与十进制30比较[/color]
    17. 023C3F91    0F9CC1          SETL CL
    18. 023C3F94    0BC1            OR EAX,ECX
    19. 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 编辑 ]

    评分

    参与人数 1飘云币 +40 收起 理由
    tianxj + 40 感谢您发布的原创作品!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-1-5 20:23
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    发表于 2008-1-30 09:45:48 | 显示全部楼层
    太厉害了,顶一下!学习中!!!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-30 10:12:58 | 显示全部楼层
    学习中!!!/:good /:good /:good
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-30 22:35:34 | 显示全部楼层
    学习中!!!/:014 /:014
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-2-28 23:40
  • 签到天数: 401 天

    [LV.9]以坛为家II

    发表于 2008-2-5 11:30:35 | 显示全部楼层
    谢谢,分析得很详细!!!学到了不少。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-2-27 16:49:57 | 显示全部楼层
    学习中,谢谢分享!学到了不少。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-2-27 16:53:14 | 显示全部楼层
    谢谢分享!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-3-23 20:51:10 | 显示全部楼层
    高 实在是高 里里外外都给分析透了 ~ 用工具把这个程序的各个时间都给剖析了~~
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2022-11-11 18:09
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2008-3-25 22:32:34 | 显示全部楼层
    不容易看呀。。有点难了。。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-12-13 16:35
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2008-3-26 19:28:19 | 显示全部楼层
    我看了都不容易,你写就更不容易了,辛苦了!谢谢分享!学到了不少
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表