- UID
- 11261
注册时间2006-4-24
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
我是破解爱好者,但没有汇编基初,年龄也大了(35),纯爱好.我不是不想达到会算法作注册机程度,而是根据自身的情况,觉得不太可能
如果大多数软件我会爆破,我就很知足了(如能达到.obi-one 兄的水平,我就已经很高兴了)从网上下载了一篇文章,很受启发.
对于暴破新手都有一个问题,暴破要如何准确找到下手的地方呢?我觉得关键是要理解作者的思路。比如一个程序,如果象书本上的例题程序一样,每一句用中文注释,当然是很好理解的。但对于一大堆的反汇编出来的代码,如何化微观为宏观,将把散乱的汇编代码划分成一块块的可以理解的、可以用中文注释的语句块,这就需要对汇编语言的理解和破解经验了。汇编语言可以边破边学,如果经验不足,看不出来,那可以背几种定式,我记得好象是豆豆兄前一阵有篇文章作了总结了,大家可以看一下。
不管是什么程序,只要是要求注册的,肯定要有判断注册特征(比如注册表里有没有注册信息或者某个保存注册信息的文件里保存的信息是否合法),程序中就一定会有(注意,是一定有)注册信息的计算比较过程,因为作者写程序时不可能未卜先知,知道哪个用户会注册,哪个不会注册,所以他的程序的每份拷贝里肯定都要有这个验证过程,所不同的是不同的程序有的隐藏得较深,有的隐藏得很浅罢了。这就是暴破能够成功的理论依据!!!
一般常见的有两种形式(注意:可能用功能类似的指令替换,比如lea形式可以换成mov形式,反正是赋值,同理,寄存器使用也是这样,可以换成其它的寄存器)
a)这种方式在计算程序段中计算出结果后直接比较处理,程序流程如下:
取你输入的注册码到 eax
计算注册码 <===可能在这里直接计算或者调用计算子程序计算,都是这一类
把计算的注册码地址放到 edx
比较
相等则跳转到正常运行程序段 <===这里改成无条件跳转就OK
出错提示,向后跳转让你重新输入或直接跳到退出
正常程序段:
XXXXXXX
这种的改法是找出(或者大胆猜测)注册码正确时的跳转方向,直接修改成无条件跳到这里,就OK了。
b)这种方式不是那么直接,会有一段公用程序来计算,计算的结果不返回,公用程序仅返回一个合法与否的标志(一般是放在ax/al/bx/bl中的一个值,常见是0或1),这是这一类的特点。偶的作业2就是这一类的一个例子。流程如下:
取你输入的注册码到 eax
调用计算公用子程序
比较返回值是否为1
相等则跳转到正常运行程序段 <===*
出错提示,向后跳转让你重新输入或直接跳到退出
正常程序段:
XXXXXXXXX
要暴破这种方式的,有人可以马上会说直接在它的比较下面的条件跳转je xxxx或jne/jg/jb xxxx处(打*号处)改成跳到正确的入口就OK了,是啊,有的程序确实这样,但这样改未免眼光太短浅了,你只是解决了眼下这个判断,往往程序会在开始运行时或者使用某些关键功能的地方还有类似的判断,当然也可以用同样的方法,把暗桩一个一个拔掉,不过这样不是费时费力吗?也不符合破解艺术化的要求。好比菜鸟可能要用一吨TNT来炸掉一栋摩天大楼,高手用2克就够了,那就是技术高低的区别了。真正完美的破法应该是看看程序用了哪个寄存器或者变量传回参数的(很简单,看下面紧跟的指令比较哪个就是了),然后跟到计算子程序里,中间计算过程如果闲得没事当然可以读一下,不过一般偶是不怎么读的,直接往下找,找到返回处,向上几条指令,找一条看起来顺眼的,修改它使子程序的返回址永远合法,就OK了。
所谓看起来顺眼,是要求一:这条指令不能是call或jmp je之类的跳转指令,否则改它可能会影响程序的流程的;二是这条指令要占有足够的位置,足够是视你前面看的传回参数的变量或寄存器而定,比如要用BL传回0或1,那只要2字节就够了,把它改成“B0 01”[就是mov bl,01];如果要求用bx传回,那就多了,一条指令不够用的话,那只好找两条,如果位置比需要的多的话,剩下的用90补。
唉,码字好辛苦啊,算了,留些下次再说吧,今天就到这里
其实大家不要用另类的眼光来看暴破,破解是的目的是解除软件的保护,能正常使用软件的完全功能。为了达到这个目的,采用暴破是一种手段,采取研究注册码算法然后做出注册机是另一种手段,并非自古华山一条路的,只要能迅速、准确地达到目的,就是好方法。
有人担心暴破因为对原程序作了改动,会影响程序的正确结果,其实这种担心有道理但不必要,因为要实现完美的暴破,必须要对原软件流程和运算过程正确理解的基础上(同样理解原软件的注册算法也一样),对程序的关键判断点进行有选择的修改(比如有几处判断,在哪里改动最优、改动最少、改动最合理),只要满足这样的条件,可以肯定暴破的程序在正常使用中和算号注册的程序没有不同。所以请想当暴破手的同志要端正观念,不要以为暴破就不用读程序的算法,就很轻松。
再就是暴破也有其独到的用处和独到的功能。比如要上网验证注册码的程序,算号法算出的注册码也没办法,只能是暴破了,不信各位可以试试flashfxp,呵呵,就算算法100%正确,还是要被连网验证挡在注册成功的门外。而且暴破的程序,只要选择适当的地方改动,甚至可以跳过验证注册过程,加快程序运行的速度。
对于某些特别BT的作者,大家可千万别认死理,非要把他的算法整出来。否则会掉进作者的陷井里,万劫不复的。比如我举例写一程序,为描述方便,仅用中文描述,注册码分四段,每段五位,形如*****-*****-*****-*****。
程序开始
。。。。
提示你输入注册码,并获得你输入的注册码
取第一段五位
((((((第一位asc值 XOR 86H)+第二位)左移2位)-32)+第三位*5)右移3位-(第四位右移一位)+(第五位 and 68)//就这一过程写成汇编有一大段,你要是想读,就把你累得够呛了。保存结果一
真正计算这五位的计算过程,保存结果A
结果一 XOR 结果A //这里是坚定你继续往下读的信心,计算出来的结果还是有用的嘛,有人甚至窃喜成功在望了
取第二段五位
一段同样复杂的计算,保存结果二 //恭喜你还能挺过来
真正计算这五位的计算过程,保存结果B
结果一 XOR 结果A
结果二 XOR 结果B
取第三段五位
一段同样复杂的计算,保存结果三 //还没吐血吗?快了吧
真正计算这五位的计算过程,保存结果C
结果二 XOR 结果B
结果三 XOR 结果C
取第四段五位
一段更加复杂的计算,保存结果四 //读完还没晕死的话,可能是神了
真正计算这五位的计算过程,保存结果D
结果三 XOR 结果C
比较结果A、B、C、D,看注册码对不对,作相应跳转
大家看出来了吧,上面有几段用于迷惑跟踪者的计算,结果好象有用,但要注意啊,xor两次就是还原了啊!!呵呵,看你以后还敢不敢读算法啦,当然上面的迷惑计算段还可以搞得更加复杂,效果也更好。我想世界上比偶更毒的还是大有人在的,嘻嘻。如果是暴破可以大胆直接跳过上面的计算,直接在比较结果片改动1到2个byte,就可以收工了。
至于暴破好还是算号好,我觉得完全没有必要来争论,因为各人习惯不同,反正用得顺手就好了。同时也给大家提个醒,不要认死理被人家拖到陷井里哦。
------------------------------------------------------------------ 本教程集由北极熊[DFCG]整理,仅供研究学习使用,请不要用于非法目的! |
|