VB+浮点运算的的简单算法

标 题: 《编程百科全书》注册算法,VB+浮点运算,不过很简单的算法
作 者:laoqian
时 间:2005-02-04 16:29

链 接:http://bbs.pediy.com/showthread.php?threadid=10803

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值