【破解作者】 laoqian[FCG]
【作者邮箱】 lao-qian@163.com
【作者主页】 www.FCGchina.com
【使用工具】 fly ollydbg 1.10 ,UltraEdit8.0
【破解平台】 Win98se/2000/xp
【软件名称】 《编程百科全书》
【下载地址】 http://www.xiaowu.net/soft/2604.htm
【软件简介】 本软件集成 Win32API函数、Visual Basic函数,ASP函数、VBScript函数 、 JavaScript函数、Turbo C函数等一些函数查询和各种语言用法。别外两个特色功能是学习笔记和个人心情日记,未注册也可以完全使用这两个功能。
【加壳方式】 无
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
《编程百科全书》也可以看看,只是有注册提示,烦,遂去掉它了,
抽时间看注册算法。VB的,还是浮点运算,不过很简单的算法。

用fly ollydbg进入,开始不知道设什么断点好,点击注册,始终断不下来,呵呵,主要是太懒,不愿一个一个的试那些断点。

我随便把VB的比较断点都开了,MSVBVM60.__vbaVarTstEq,MSVBVM60.__vbastrcmp,等,重新运行程序,断下在004195DF

代码:
004195DF   .  FF15 80104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>;  MSVBVM60.__vbaVarTstEq 中断的地方 004195E5      66:8BF0       mov si,ax 004195E8   .  8D95 6CFFFFFF lea edx,dword ptr ss:[ebp-94] 004195EE   .  8D85 70FFFFFF lea eax,dword ptr ss:[ebp-90] 004195F4   .  52            push edx 004195F5   .  50            push eax 004195F6   .  53            push ebx 004195F7   .  FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObjList 004195FD   .  83C4 0C       add esp,0C 00419600   .  8D8D 58FFFFFF lea ecx,dword ptr ss:[ebp-A8] 00419606   .  FF15 18104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>;  MSVBVM60.__vbaFreeVar 0041960C   .  66:85F6       test si,si 0041960F   .  0F84 4B010000 je 编程百科.00419760    ;这里跳了,就完了!不跳,注册成功!爆破点。 00419615   .  8B75 08       mov esi,dword ptr ss:[ebp+8] 00419618   .  56            push esi                                 ;  msado15.1F446B80 ........ ....... ........ 00419760   > \B9 04000280   mov ecx,80020004    ;跳到这里失败!!! 00419765   .  B8 0A000000   mov eax,0A 0041976A   .  898D 30FFFFFF mov dword ptr ss:[ebp-D0],ecx 00419770   .  898D 40FFFFFF mov dword ptr ss:[ebp-C0],ecx 00419776   .  BE 08000000   mov esi,8 0041977B   .  8D95 B8FEFFFF lea edx,dword ptr ss:[ebp-148] 00419781   .  8D8D 48FFFFFF lea ecx,dword ptr ss:[ebp-B8] 00419787   .  8985 28FFFFFF mov dword ptr ss:[ebp-D8],eax 0041978D   .  8985 38FFFFFF mov dword ptr ss:[ebp-C8],eax 00419793   .  C785 C0FEFFFF>mov dword ptr ss:[ebp-140],编程百科.00406728 0041979D   .  89B5 B8FEFFFF mov dword ptr ss:[ebp-148],esi 004197A3   .  FF15 04114000 call dword ptr ds:[<&MSVBVM60.__vbaVarDu>;  MSVBVM60.__vbaVarDup 004197A9   .  8B55 A0       mov edx,dword ptr ss:[ebp-60] 004197AC   .  68 F06A4000   push 编程百科.00406AF0 004197B1   .  52            push edx 004197B2   .  FF15 14104000 call dword ptr ds:[<&MSVBVM60.__vbaStrI4>;  MSVBVM60.__vbaStrI4 004197B8   .  8B1D 1C114000 mov ebx,dword ptr ds:[<&MSVBVM60.__vbaSt>;  MSVBVM60.__vbaStrMove 004197BE   .  8BD0          mov edx,eax 004197C0   .  8D4D 84       lea ecx,dword ptr ss:[ebp-7C] 004197C3   .  FFD3          call ebx                                 ;  <&MSVBVM60.__vbaStrMove> 004197C5   .  8B3D 34104000 mov edi,dword ptr ds:[<&MSVBVM60.__vbaSt>;  MSVBVM60.__vbaStrCat 004197CB   .  50            push eax 004197CC   .  FFD7          call edi                                 ;  <&MSVBVM60.__vbaStrCat> 004197CE   .  8985 60FFFFFF mov dword ptr ss:[ebp-A0],eax 004197D4   .  8D85 28FFFFFF lea eax,dword ptr ss:[ebp-D8] 004197DA   .  8D8D 38FFFFFF lea ecx,dword ptr ss:[ebp-C8] 004197E0   .  50            push eax 004197E1   .  8D95 48FFFFFF lea edx,dword ptr ss:[ebp-B8] 004197E7   .  51            push ecx 004197E8   .  52            push edx 004197E9   .  8D85 58FFFFFF lea eax,dword ptr ss:[ebp-A8] 004197EF   .  6A 00         push 0 004197F1   .  50            push eax 004197F2   .  89B5 58FFFFFF mov dword ptr ss:[ebp-A8],esi 004197F8   .  FF15 50104000 call dword ptr ds:[<&MSVBVM60.#595>]     ;  MSVBVM60.rtcMsgBox这就是出错的窗口!这里设断也可以。 004197FE   .  8D4D 84       lea ecx,dword ptr ss:[ebp-7C] 00419801   .  FF15 40114000 call dword ptr ds:[<&MSVBVM60.__vbaFreeS>;  MSVBVM60.__vbaFreeStr


断下在004195DF,我们往上看,一直可以看到产生机器码的地方,就不啰嗦了。
我们在0041952E下断点,重新运行程序,断下:(这时寄存器窗口调整到FPU)

代码:
0041952E   .  8B08          mov ecx,dword ptr ds:[eax]               ;  msado15.1F446AE8 00419530   .  8BF0          mov esi,eax 00419532   .  FF51 34       call dword ptr ds:[ecx+34]  ;读出存储的注册码,原始的当然是不对的,存在ecx里 00419535   .  85C0          test eax,eax 00419537   .  DBE2          fclex 00419539   .  7D 0F         jge short 编程百科.0041954A 0041953B   .  6A 34         push 34 0041953D   .  68 40624000   push 编程百科.00406240 00419542   .  56            push esi                                 ;  msado15.1F446B80 00419543   .  50            push eax 00419544   .  FF15 3C104000 call dword ptr ds:[<&MSVBVM60.__vbaHresu>;  MSVBVM60.__vbaHresultCheckObj 0041954A   >  DB45 A0       fild dword ptr ss:[ebp-60]               ;  这里看到机器码,装入整数 0041954D   .  DD9D BCFDFFFF fstp qword ptr ss:[ebp-244] 00419553   .  DD85 BCFDFFFF fld qword ptr ss:[ebp-244]               ;  入栈机器码 我的是859061954 00419559   .  833D 00504300>cmp dword ptr ds:[435000],0              ;比较是否注册的标志吧,猜。 00419560   .  75 08         jnz short 编程百科.0041956A 00419562   .  DC35 48134000 fdiv qword ptr ds:[401348]               ;  机器码 除以4,我们察看[401348]可知为4 00419568   .  EB 11         jmp short 编程百科.0041957B                  ;  st0=214765488.50000000000 0041956A   >  FF35 4C134000 push dword ptr ds:[40134C] 00419570   .  FF35 48134000 push dword ptr ds:[401348] 00419576   .  E8 B980FEFF   call <jmp.&MSVBVM60._adj_fdiv_m64> 0041957B   >  DC0D 40134000 fmul qword ptr ds:[401340]               ;  *3 00419581   .  DC05 38134000 fadd qword ptr ds:[401338]               ;  +15482662 00419587   .  DC25 30134000 fsub qword ptr ds:[401330]               ;  -469 0041958D   .  DC25 28134000 fsub qword ptr ds:[401328]               ;  -23 00419593   .  DC25 20134000 fsub qword ptr ds:[401320]               ;  -45 00419599   .  DC05 18134000 fadd qword ptr ds:[401318]               ;  +95 0041959F   .  DC25 10134000 fsub qword ptr ds:[401310]               ;  -631 004195A5   .  DC25 08134000 fsub qword ptr ds:[401308]               ;  -52 004195AB   .  DC05 00134000 fadd qword ptr ds:[401300]               ;  +2,到此我们得到算好的注册码为10进制保存在堆栈 004195B1   .  DFE0          fstsw ax 004195B3   .  A8 0D         test al,0D 004195B5   .  0F85 80080000 jnz 编程百科.00419E3B 004195BB   .  FF15 14114000 call dword ptr ds:[<&MSVBVM60.__vbaFpI4>>;  MSVBVM60.__vbaFpI4 004195C1   .  8985 B0FEFFFF mov dword ptr ss:[ebp-150],eax           ;  取整,注册码转为16进制保存在eax 004195C7   .  8D85 58FFFFFF lea eax,dword ptr ss:[ebp-A8] 004195CD   .  8D8D A8FEFFFF lea ecx,dword ptr ss:[ebp-158] 004195D3   .  50            push eax 004195D4   .  51            push ecx 004195D5   .  C785 A8FEFFFF>mov dword ptr ss:[ebp-158],8003 004195DF   .  FF15 80104000 call dword ptr ds:[<&MSVBVM60.__vbaVarTs>;  MSVBVM60.__vbaVarTstEq 注册码比较 004195E5      66:8BF0       mov si,ax 004195E8   .  8D95 6CFFFFFF lea edx,dword ptr ss:[ebp-94] 004195EE   .  8D85 70FFFFFF lea eax,dword ptr ss:[ebp-90] 004195F4   .  52            push edx 004195F5   .  50            push eax 004195F6   .  53            push ebx 004195F7   .  FF15 2C104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeO>;  MSVBVM60.__vbaFreeObjList 004195FD   .  83C4 0C       add esp,0C 00419600   .  8D8D 58FFFFFF lea ecx,dword ptr ss:[ebp-A8] 00419606   .  FF15 18104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeV>;  MSVBVM60.__vbaFreeVar 0041960C   .  66:85F6       test si,si 0041960F   .  0F84 4B010000 je 编程百科.00419760    ;这里跳了,就完了!不跳,注册成功! 00419615   .  8B75 08       mov esi,dword ptr ss:[ebp+8] 00419618   .  56            push esi                                 ;  msado15.1F446B80


我们可以去看看[401300]...[401348]里保存了什么,
在od里下d 4013000,这时我们选择64双精度显示,可以看到如下:

代码:
00401300         2.000000000000000        52.00000000000000 00401310         631.0000000000000        95.00000000000000 00401320         45.00000000000000        23.00000000000000 00401330         469.0000000000000        15482662.00000000 00401340         3.000000000000000        4.000000000000000



【破解总结】

我们看到了产生注册码,至于怎样去比较,我就不管了。
算法太简单:
注册码=[机器码/4]*3+15482662-469-23-45+95-631-52+2

btw:他把注册信息写在Comdlg.dll里,这可是一个18MB的文件啊,第一次见到如此的!
恢复原来的Comdlg.dll,可以回到未注册状态!
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!