-
-
[原创]一个质因数分解工具的简单破解
-
发表于: 2011-3-19 18:41 5037
-
在网上淘来的一个小软件,号称可以分解29位以内的数(不知是否真实,因为事实上当一个素数的位数超过16位时它的速度就杯具了)本来想用它验证下自己写的质因数分解程序(代码在这里http://bbs.pediy.com/showthread.php?t=131048),不料软件有个注册机制,老是提示挺烦人的,顺便搞掉他= =。旨在讨论,同时为了保护作者的权益(众人:P话!其实我也不好意思的= =),软件名就不说了。
进入正题。PEID之,无壳,大爱;VB编写的,怪不得速度...
既然无壳就直接扔进OD,程序给出了机器码,随便喂给它一个注册码,注册!(应该不会成功吧= =,成功了反倒省事了)弹出提示框说注册失败。messagebox下断,再来一次,杯具的是程序无视了我的断点继续提示失败,到底是不了解VB的程序,找资料吧。经过一番查找,重新在rtcmsgbox函数下断,这会成功断了下来,返回调用处得到这么一行代码:
004128FB . FF15 9C104000 call dword ptr [<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
也就是提示注册失败,网上看找到了这里
... ...
0041283B . FF15 64104000 call dword ptr [<&MSVBVM60.__vbaHresultChe>; MSVBVM60.__vbaHresultCheckObj
00412841 > 8B45 E0 mov eax, dword ptr [ebp-20]
00412844 . 50 push eax ; 传入用户输入的注册码
00412845 . FF15 54124000 call dword ptr [<&MSVBVM60.#581>] ; MSVBVM60.rtcR8ValFromBstr
0041284B . FF15 C4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ; MSVBVM60.__vbaFpR8
00412851 . DB46 38 fild dword ptr [esi+38] ; st0 = 正确注册码
00412854 . DD9D 38FFFFFF fstp qword ptr [ebp-C8] ; 正确注册码装入ebp-c8,st0 = 用户输入的注册码
0041285A . DC9D 38FFFFFF fcomp qword ptr [ebp-C8] ; 比较两个“码”
00412860 . DFE0 fstsw ax
00412862 . F6C4 40 test ah, 40
00412865 . 75 07 jnz short 分解质因.0041286E ; 跳走成功
00412867 . B8 01000000 mov eax, 1
0041286C . EB 02 jmp short 分解质因.00412870
0041286E > 33C0 xor eax, eax
00412870 F7D8 neg eax
00412872 . 8D4D E0 lea ecx, dword ptr [ebp-20]
00412875 . 66:8985 4CFFF>mov word ptr [ebp-B4], ax
0041287C . FF15 50124000 call dword ptr [<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
00412882 . 8B3D 4C124000 mov edi, dword ptr [<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00412888 . 8D4D D8 lea ecx, dword ptr [ebp-28]
0041288B . FFD7 call edi ; <&MSVBVM60.__vbaFreeObj>
0041288D . 66:83BD 4CFFF>cmp word ptr [ebp-B4], 0
00412895 . 0F84 0D010000 je 分解质因.004129A8 ; 跳走完蛋
0041289B . 8B3D EC114000 mov edi, dword ptr [<&MSVBVM60.__vbaVarDu>; MSVBVM60.__vbaVarDup
004128A1 . B9 04000280 mov ecx, 80020004
004128A6 . 894D A0 mov dword ptr [ebp-60], ecx
004128A9 . B8 0A000000 mov eax, 0A
... ...
这里就是比较注册码的位置,有些地方我加了注释,但是正确注册码的计算代码却不在此处。有了这些要搞掉它就轻而易举了。爆破开始!将 00412865的jnz改为jmp即可,改了以后再次随意喂一个注册码,注册!哈,注册完成,烦人的提示框消失不见。除了改变跳转还有其他地方也可以实现爆破,例如也可以改 00412870处的取补操作,把这里改为xor eax,eax再注册,同样成功。
其实还有个更方便的办法,打开regmon,运行程序后在regmon中可以清楚看到程序在注册表中的操作,包括保存是否注册信息的表项:
10.26076508 #?鄍2.04.exe:1512 QueryValue HKCU\Software\... ...\value SUCCESS "False"
将键值改为true即可,连OD都省了。
一个很简单的爆破,分享思路,大牛莫笑。
进入正题。PEID之,无壳,大爱;VB编写的,怪不得速度...
既然无壳就直接扔进OD,程序给出了机器码,随便喂给它一个注册码,注册!(应该不会成功吧= =,成功了反倒省事了)弹出提示框说注册失败。messagebox下断,再来一次,杯具的是程序无视了我的断点继续提示失败,到底是不了解VB的程序,找资料吧。经过一番查找,重新在rtcmsgbox函数下断,这会成功断了下来,返回调用处得到这么一行代码:
004128FB . FF15 9C104000 call dword ptr [<&MSVBVM60.#595>] ; MSVBVM60.rtcMsgBox
也就是提示注册失败,网上看找到了这里
... ...
0041283B . FF15 64104000 call dword ptr [<&MSVBVM60.__vbaHresultChe>; MSVBVM60.__vbaHresultCheckObj
00412841 > 8B45 E0 mov eax, dword ptr [ebp-20]
00412844 . 50 push eax ; 传入用户输入的注册码
00412845 . FF15 54124000 call dword ptr [<&MSVBVM60.#581>] ; MSVBVM60.rtcR8ValFromBstr
0041284B . FF15 C4104000 call dword ptr [<&MSVBVM60.__vbaFpR8>] ; MSVBVM60.__vbaFpR8
00412851 . DB46 38 fild dword ptr [esi+38] ; st0 = 正确注册码
00412854 . DD9D 38FFFFFF fstp qword ptr [ebp-C8] ; 正确注册码装入ebp-c8,st0 = 用户输入的注册码
0041285A . DC9D 38FFFFFF fcomp qword ptr [ebp-C8] ; 比较两个“码”
00412860 . DFE0 fstsw ax
00412862 . F6C4 40 test ah, 40
00412865 . 75 07 jnz short 分解质因.0041286E ; 跳走成功
00412867 . B8 01000000 mov eax, 1
0041286C . EB 02 jmp short 分解质因.00412870
0041286E > 33C0 xor eax, eax
00412870 F7D8 neg eax
00412872 . 8D4D E0 lea ecx, dword ptr [ebp-20]
00412875 . 66:8985 4CFFF>mov word ptr [ebp-B4], ax
0041287C . FF15 50124000 call dword ptr [<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
00412882 . 8B3D 4C124000 mov edi, dword ptr [<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
00412888 . 8D4D D8 lea ecx, dword ptr [ebp-28]
0041288B . FFD7 call edi ; <&MSVBVM60.__vbaFreeObj>
0041288D . 66:83BD 4CFFF>cmp word ptr [ebp-B4], 0
00412895 . 0F84 0D010000 je 分解质因.004129A8 ; 跳走完蛋
0041289B . 8B3D EC114000 mov edi, dword ptr [<&MSVBVM60.__vbaVarDu>; MSVBVM60.__vbaVarDup
004128A1 . B9 04000280 mov ecx, 80020004
004128A6 . 894D A0 mov dword ptr [ebp-60], ecx
004128A9 . B8 0A000000 mov eax, 0A
... ...
这里就是比较注册码的位置,有些地方我加了注释,但是正确注册码的计算代码却不在此处。有了这些要搞掉它就轻而易举了。爆破开始!将 00412865的jnz改为jmp即可,改了以后再次随意喂一个注册码,注册!哈,注册完成,烦人的提示框消失不见。除了改变跳转还有其他地方也可以实现爆破,例如也可以改 00412870处的取补操作,把这里改为xor eax,eax再注册,同样成功。
其实还有个更方便的办法,打开regmon,运行程序后在regmon中可以清楚看到程序在注册表中的操作,包括保存是否注册信息的表项:
10.26076508 #?鄍2.04.exe:1512 QueryValue HKCU\Software\... ...\value SUCCESS "False"
将键值改为true即可,连OD都省了。
一个很简单的爆破,分享思路,大牛莫笑。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [原创][讨论]连连看外挂寻路算法 13060
- [下载]MDebug 调试器脚本与命令行说明(pdf) 29803
- [原创]DIY扫雷 实现秒杀功能 8786
- [求助][求助]关于隐藏文件夹 3215
- [原创]一个质因数分解工具的简单破解 5038
看原图
赞赏
雪币:
留言: