【破解作者】 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,可以回到未注册状态!
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法