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