• 标 题:用ollyDbg寻找VB程序的注册核心的一点思路
  • 作 者:lordor
  • 时 间:2003/06/20 10:14am
  • 链 接:http://bbs.pediy.com

 

用ollyDbg寻找VB程序的注册核心的一点思路
   --北森职业规划人才测评软件 专业版破解手记


对象:北森职业规划人才测评软件 专业版2003
作者:lordor[CCG][BCG][DFCG]
Mail:lordor@sina.com
QQ:88378557
目的:属技术交流,无其它目的,请不要任意散布或用用商业用途。初学破解,如有不对的地方欢迎批评指出。
工具:ollydbg1.09C,fi301


一、分析一下,VB编写程序,用Messagebox提示出错,用W32Dasm找不到一点提示,ok,那就用VB杀手-ollyDbg来寻找注册核跟我来。

二、首先载入程序,ctrl+A分析程序,刚开始时是停在程序入口点,现在向上看,可以看到VB的很多函数,如下:

00401519      25            DB 25                                    ;  CHAR '%'
0040151A   .  50            PUSH EAX
0040151B   >  1040 00       ADC BYTE PTR DS:[EAX],AL
0040151E   .- FF25 B8104000 JMP DWORD PTR DS:[<&MSVBVM60.EVENT_SINK_>;  MSVBVM60.EVENT_SINK_QueryInterface
00401524   .- FF25 8C104000 JMP DWORD PTR DS:[<&MSVBVM60.EVENT_SINK_>;  MSVBVM60.EVENT_SINK_AddRef
0040152A   .- FF25 A8104000 JMP DWORD PTR DS:[<&MSVBVM60.EVENT_SINK_>;  MSVBVM60.EVENT_SINK_Release
00401530   .- FF25 60104000 JMP DWORD PTR DS:[<&MSVBVM60.#303>]      ;  MSVBVM60.GetMemStr
00401536   .- FF25 74104000 JMP DWORD PTR DS:[<&MSVBVM60.#309>]      ;  MSVBVM60.PutMemStr
0040153C   .- FF25 4C104000 JMP DWORD PTR DS:[<&MSVBVM60.#300>]      ;  MSVBVM60.GetMem2
00401542   .- FF25 70104000 JMP DWORD PTR DS:[<&MSVBVM60.#306>]      ;  MSVBVM60.PutMem2
00401548   .- FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#304>]      ;  MSVBVM60.GetMemVar
0040154E   .- FF25 B4104000 JMP DWORD PTR DS:[<&MSVBVM60.#310>]      ;  MSVBVM60.PutMemVar
00401554   .- FF25 C0104000 JMP DWORD PTR DS:[<&MSVBVM60.#312>]      ;  MSVBVM60.SetMemVar
0040155A   $- FF25 1C114000 JMP DWORD PTR DS:[<&MSVBVM60.#100>]      ;  MSVBVM60.ThunRTMain
职业规划.<Mod> $  68 CC2D4000   PUSH 职业规划.00402DCC

三、这是函数导入表,好像所有的VB程序都有这样的VB函数。仔细找rtcMsgBox函数,在这里
0040145E   .- FF25 58104000 JMP DWORD PTR DS:[<&MSVBVM60.#595>]      ;  MSVBVM60.rtcMsgBox
在这一行点击右健,选择"follow"项,会进入(MSVBVM6.0.DLL)如下:

MSVBVM60.>  55              PUSH EBP   ==>在这按F2下断
73472097    8BEC            MOV EBP,ESP
73472099    83EC 4C         SUB ESP,4C
7347209C    8B4D 14         MOV ECX,DWORD PTR SS:[EBP+14]
7347209F    53              PUSH EBX

四、F2下断,F9运行,在注册框中点击确定,会栏下来,发现会进入MSVBVM6的领空,好,再按alt+k,看看誰调用段代码,如下:

Call stack of main thread
Address    Stack      Procedure                             Called from                   Frame
0012F3B4   0041E99F   ? MSVBVM60.rtcMsgBox                  职业规划.0041E999


五、双击called from“职业规划.0041E999”,来到如下,职业规划的领空:


0041E98A   .  51            PUSH ECX
0041E98B   .  8D85 78FFFFFF LEA EAX,DWORD PTR SS:[EBP-88]
0041E991   .  52            PUSH EDX
0041E992   .  50            PUSH EAX
0041E993   .  8D4D 88       LEA ECX,DWORD PTR SS:[EBP-78]
0041E996   .  6A 00         PUSH 0
0041E998   .  51            PUSH ECX                                 ;  出错
0041E999   .  FF15 58104000 CALL DWORD PTR DS:[<&MSVBVM60.#595>]     ;  MSVBVM60.rtcMsgBox
0041E99F   .  8D95 08FFFFFF LEA EDX,DWORD PTR SS:[EBP-F8]


六、这段代码就是跳出错框,现在找到关键核心了,向上看看,是从那里跳来的,来到如下:


0041E2B5   . /7D 12         JGE SHORT 职业规划.0041E2C9
0041E2B7   . |68 A0000000   PUSH 0A0
0041E2BC   . |68 A05E4000   PUSH 职业规划.00405EA0
0041E2C1   . |53            PUSH EBX
0041E2C2   . |50            PUSH EAX
0041E2C3   . |FF15 40104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>;  MSVBVM60.__vbaHresultCheckObj
0041E2C9   > \8B06          MOV EAX,DWORD PTR DS:[ESI]
0041E2CB   .  56            PUSH ESI
0041E2CC   .  FF90 00030000 CALL DWORD PTR DS:[EAX+300]
0041E2D2   .  8D4D B0       LEA ECX,DWORD PTR SS:[EBP-50]
0041E2D5   .  50            PUSH EAX
0041E2D6   .  51            PUSH ECX
0041E2D7   .  FF15 54104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSe>;  MSVBVM60.__vbaObjSet
0041E2DD   .  8BD8          MOV EBX,EAX
0041E2DF   .  8D45 D0       LEA EAX,DWORD PTR SS:[EBP-30]
0041E2E2   .  50            PUSH EAX
0041E2E3   .  53            PUSH EBX
0041E2E4   .  8B13          MOV EDX,DWORD PTR DS:[EBX]
0041E2E6   .  FF92 A0000000 CALL DWORD PTR DS:[EDX+A0]               ;  取得注册码
0041E2EC   .  85C0          TEST EAX,EAX
0041E2EE   .  DBE2          FCLEX
0041E2F0   .  7D 12         JGE SHORT 职业规划.0041E304
0041E2F2   .  68 A0000000   PUSH 0A0
0041E2F7   .  68 A05E4000   PUSH 职业规划.00405EA0
0041E2FC   .  53            PUSH EBX
0041E2FD   .  50            PUSH EAX
0041E2FE   .  FF15 40104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaHresu>;  MSVBVM60.__vbaHresultCheckObj
0041E304   >  8B4D D0       MOV ECX,DWORD PTR SS:[EBP-30]            ;  注册码入ecx
0041E307   .  51            PUSH ECX
0041E308   .  FF15 14104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>;  MSVBVM60.__vbaLenBstr
0041E30E   .  8B55 D4       MOV EDX,DWORD PTR SS:[EBP-2C]
0041E311   .  33DB          XOR EBX,EBX
0041E313   .  83F8 1F       CMP EAX,1F                               ;  比较注册码长度是否为1f,即31位
0041E316   .  52            PUSH EDX
0041E317   .  0F9CC3        SETL BL
0041E31A   .  F7DB          NEG EBX
0041E31C   .  FF15 14104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>;  MSVBVM60.__vbaLenBstr
0041E322   .  33C9          XOR ECX,ECX
0041E324   .  83F8 1A       CMP EAX,1A                               ;  比较注册码长度是否为1a,即26位
0041E327   .  8D55 D0       LEA EDX,DWORD PTR SS:[EBP-30]
0041E32A   .  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
0041E32D   .  0F9FC1        SETG CL
0041E330   .  52            PUSH EDX
0041E331   .  50            PUSH EAX
0041E332   .  F7D9          NEG ECX
0041E334   .  6A 02         PUSH 2
0041E336   .  23D9          AND EBX,ECX
0041E338   .  FF15 0C114000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeS>;  MSVBVM60.__vbaFreeStrList
0041E33E   .  8D4D B0       LEA ECX,DWORD PTR SS:[EBP-50]
0041E341   .  8D55 B4       LEA EDX,DWORD PTR SS:[EBP-4C]
0041E344   .  51            PUSH ECX
0041E345   .  52            PUSH EDX
0041E346   .  6A 02         PUSH 2
0041E348   .  FF15 24104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObjList
0041E34E   .  83C4 18       ADD ESP,18
0041E351   .  66:85DB       TEST BX,BX
0041E354   .  0F84 BE050000 JE 职业规划.0041E918                     ;  关键跳转,在这里nop掉即可破解
0041E35A   .  8B06          MOV EAX,DWORD PTR DS:[ESI]
0041E35C   .  56            PUSH ESI
0041E35D   .  FF90 0C030000 CALL DWORD PTR DS:[EAX+30C]
0041E363   .  8D4D B4       LEA ECX,DWORD PTR SS:[EBP-4C]
0041E366   .  50            PUSH EAX
0041E367   .  51            PUSH ECX
0041E368   .  FF15 54104000 CALL DWORD PTR DS:[<&MSVBVM60.__vbaObjSe>;  MSVBVM60.__vbaObjSet
0041E36E   .  8BD8          MOV EBX,EAX
0041E370   .  8D45 D4       LEA EAX,DWORD PTR SS:[EBP-2C]
0041E373   .  50            PUSH EAX
0041E374   .  53            PUSH EBX
0041E375   .  8B13          MOV EDX,DWORD PTR DS:[EBX]
0041E377   .  FF92 A0000000 CALL DWORD PTR DS:[EDX+A0]

---------------------------------------

总结:
把0041E354处的nop掉即可破解。
其实VB程序也没有什么好怕的,好东西大家分享,如有更好方法,请告知我。


cracked by lordor[CCG][BCG][DFCG]
03.6.20