好友
阅读权限10
听众
最后登录1970-1-1
|
先发几句感叹..
在两年前我就想学习破解了,当时还在学校,那时候确实有很多时间,
可是我下载了茫茫多的教程和资料都没怎么看,就学了一点点汇编...
后来就把这事儿丢一边儿了,一直到前几天由于某原因,我又回来了,
这是我第一次破解软件,发这个贴子直是希望大家鼓励一下!
没发过这类贴子,有不足之处大家多指教!以下格式还是从别的贴子弄过来的 呵呵
【文章标题】: 第一次破解,大家鼓励一下
【软件名称】: XXXX物流系统
【加壳方式】: 无
【保护方式】:注册码,重启动验证
【编写语言】: VB
【使用工具】: od
【操作平台】: xp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
我是在虚拟机里搞的,XP系统
软件安装完后点主程序进入的时候会出来一个序列号,注册按钮默认是不可用的,我随便输入注册码,按钮还是禁用的,由于我以前看过几个破解教程,
上边有的会提示注册码错误等信息,然后根据提示信息来下手,可这个什么都没提示,当时就傻了。 我两年前下载的破解工具包还在,里边工具挺全的,
其实都还不会用,我用OD载入了程序,然后运行跑了一下,没出什么错,我本人就是学编程的,是搞JAVA的,上班半年了,所以对程序调试还是很懂的,
我在OD中找到了断点插件,在里边看看有什么能用的,我想如果程序要验证肯定要拿我的假注册码来和真的比,于是我把字符比较的断点全选上了,结果
不知道为什么没效果。我又看了看插件上其他的断点,忽然看到了一个限制断点,里边有禁用按钮的,狂喜啊!要不是我看到,我也不知道会有这样一个断点,
以后一定要看看windows编程里的API,我把这个断点选上后输入了假注册码,才输入一个字符程序就断下来了,我向上找啊找,想看看程序是不是比较了注册码,
然后才断下的,结果向上找了N行也没啥信息,这时候我才发现汇编块儿中的很多都是MSVBVM60什么的DLL啊,我才想到以前看的程序的领空问题,我就百度
了一下OD领空,然后发现我现在的OD果然没在程序的领空,而是在系统上... 明白了我就找到以前存的资料看了一下OD的操作,主要看怎么返回程序领空,按照
资料操作,正常返回到程序里了,我又向上找,找了一会儿终于发现了比较还有跳转命令! 我想起了以前看过的教程,改标志可以让跳转改变,可是我实在不知道
什么标志影响什么,无赖之下又想起了可以改汇编代码,我就在工具包里扒出了汇编手册,对着上边将跳转给改了。重新运行,输入字符,注册按钮变成可用了,
高兴啊.. 点了注册却发现报了个错,说缺少个什么DLL,郁闷啊.... 我把这个名字搞到去搜索了一把,找到了,看来是个常用的DLL,下载下来搞到 system32下,
重新运行,注册,然后程序就进入了用户登录界面,因为系统很老,用的ACCESS数据库,我找了个软件把密码搞出来,然后打开看了默认的用户和密码,我用
管理员登录,然后程序就卡了10几秒,然后竟然退出了... 我又傻了 然后我想肯定是程序又验证了,这样改了程序也用不了,不如我找到真的注册码就万事大吉了,
就这样我又回到我修改跳转的地方往上找,找了很多CALL,大部分都是MSVBVM60什么的,好像是VB带的方法吧,终于找到了一个是程序自己的CALL,进去后
一直跟了很久,也没发现什么... 我又出去继续向找,又找到一个CALL,发现CALL下边紧跟着的汇编是比较语句,我想可能就是这个吧,我进去单步跟着走,没走多久
发现了机器码,又走了一会儿发现了我输入的注册码,我就耐着心走啊走,走了很久,这个CALL还真长啊... 发现了机器码转成数字了,带小数点,一串0,我猜想可能
在计算了,又走了几步发现了 堆栈 ss:[0012EE10]=181DA33A (十进制 404595514.) 我一看这很像啊,就复制下来了,又重载入程序,粘贴 404595514 这个
,然后一路F9程序走完,注册按钮竟然可用,真的找到注册码了! 一看时间都12点多了,我早上8点多开搞的,激动啊,没想到半天搞出来了,吃了午饭找了个教程,
做注册机的,看完了发现要分析算法什么的,我就继续进入那个主要的CALL找到了那段,本来想比着教程做个内存注册机的,我想我汇编这么差,就分析一下,就当练练,
然后就开始百度啊对着资料一句句分析代码,分析完后发现算法很简单,直是我技术实在菜,所以还是花了点时间,大牛不要笑话 !下边是CALL里重点分析的一段代码:
00996B52 . 52 push edx ; 这里出现机器码
00996B53 . FF15 88124000 call dword ptr ds:[<&MSVBVM60.#581>; MSVBVM60.rtcR8ValFromBstr
00996B59 . 833D 0090A500>cmp dword ptr ds:[A59000],0 //上边一行将机器码转为实数比,这行比较长度是否等于0
00996B60 . 75 08 jnz short Cargo.00996B6A //如果上边是0跳转
00996B62 . DC35 90854000 fdiv qword ptr ds:[408590] //将机转换后的机器码除以 ds:[408590] 中的数
00996B68 . EB 11 jmp short Cargo.00996B7B //跳到 00996B7B
00996B6A > FF35 94854000 push dword ptr ds:[408594]
00996B70 . FF35 90854000 push dword ptr ds:[408590]
00996B76 . E8 6943A7FF call <jmp.&MSVBVM60._adj_fdiv_m64>
00996B7B > DC0D 981D4000 fmul qword ptr ds:[401D98] //相乘
00996B81 . DC05 88854000 fadd qword ptr ds:[408588] //相加
00996B87 . DFE0 fstsw ax //将状态给ax
00996B89 . A8 0D test al,0D //比较
00996B8B . 0F85 0A010000 jnz Cargo.00996C9B //没跳
00996B91 . FF15 30124000 call dword ptr ds:[<&MSVBVM60.__vb>; MSVBVM60.__vbaFpI4 //转换字符
00996B97 . 8945 B4 mov dword ptr ss:[ebp-4C],eax
00996B9A . DB45 B4 fild dword ptr ss:[ebp-4C] ; 这里出现注册码
以下是当时的计算数据:
st=1038691006.5000000000
ds:[00408590]=18.00000000000000
除以
st=57705055.916666664960
ds:[00401D98]=7.000000000000000
乘以
st=403935391.41666667520
ds:[00408588]=660123.0000000000
加上
结果:404595514.4166666752
取整数部分 404595514
最终注册码为:404595514
分析完后终于自己做了第一个注册机! 我怕算出来的两个参数是根据其他什么算出来的,我又装了2003的虚拟机,然后用生成的注册码试了一下,我想多了,两个参数是死的。
另外我找到了程序读取的一个文件,发现里边是存注册码的地方,我才知道为什么改了跳转不行!
呵呵 到这里就彻底结束了! 没什么技术含量,以后我会努力做好的,谢谢大家! |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|