• 标 题:爆破经验谈
  • 作 者: jney2
  • 时 间:2003/04/22 08:21am
  • 链 接:http://bbs.pediy.com

如何做TNT专家?——爆破经验谈
声明:这是jney2的第二破文。我只是一个菜鸟,一点点经验与和我一样刚入门的初学者共享。

一,爆破的几个条件。
1、爆破工具:十六进制编辑器任一款(推荐用HEX Workshop)。WIN32DASM反汇编器。有这两样就可以,初学者万不要贪多求全。精通一两件,其它触类旁通、举一反三。
2、爆破手会使用以上工具。一个爆竹不会点引就想当爆破手,还是去下载MP3,看DVD去吧。jney2相当怀念当年用PCTOOL改《三国志IV》,哈哈,张飞的智力、魅力都是100。一两个小时就征服全国了。可惜现在有许许多多的游戏工具,还有变速器。东东越先进,人就越懒,学到的知识就越少。我不是说有好东东就不用哟。
3,爆破手必须会汇编。实在不会,也不要紧,依葫芦画瓢总会吧,找几个最详细,最完美,最经典的教程练一把。成功了!!!哈哈,有兴趣了吧,有信心了吧,好了好了朋友赶紧学汇编吧。如果你试了N次都没成功,我的结论是:在其它方面更适合发挥你的聪明才智。
4,信心、耐心、恒心你都得有一点吧。

有了上面的几点,你就可以进入CRACK的初级阶段了。事实上,jney2的水平也就这些。jney2的现状是:97年大专毕业时,算是一个DOS高手吧,学校的唯一一本有关中断调用大全的书我硬是霸占了一年才还。用SR分析过NATAS4744的源代码。所以8086指令系统的汇编功底还是有的。毕业后几年一直干着与电脑无关的事,又没充电。学校学的那点老底早没了。所以到了现在,VB、VC、BC、PB、DELPHI、ASP、JAVA...我是一门都不会。记忆力是一天不如一天了,惭愧呀!真羡慕那些还在学校学习的小弟妹!

废话少说,还是说几点近来当爆破手的几点经验吧。

一,如何快速确定爆破物。
1,确定目标有没有加壳。没有最好了,有的话看是不是常见壳,可不可以用现有脱壳软件快速脱掉。搞不定的话,暂时放弃它。“我吃定你了!”,不要这样,老兄。不就是一壳么,不要和他一般见识。记着,你今天的重点是爆破。不要主次不分、本末倒置,这也是初学者最易犯的错误。
这方面,我用PEID。它可以整合到资源菜单,非常方便。
2,确定用什么语言编写。我的经验是,DELPHI的程序结构清晰、紧凑,最好分析。其次是VC,BC,ASM,比较难的是VB,要有一定的经验才可搞定一两个。VB P-CODE的我就真的一窍不通了,用DEXC反编译出来的代码我一名也看不懂。VF的我也不插手。
这方面,我用LANGUAGE2000,把待查软件的图标拖到LANGUAGE2000的快捷方式上就OK了。
3,确定爆破物有没有防爆破技术。大多数的软件还是没用的。如果你修改文件后再运行有病毒感染提示或重新安装提示就表示你暂时可以放弃它了。记得我上面说过的,不要和它一般见识。
我遇到很毒的就有 斗地主5.4 脱壳后,能运行,但结果是自动关机,看来用它作关机软件倒是蛮好的。

二,如何快速找到爆破点。
1,用Win32DASM反汇编并保存工程文件。
IDA PRO虽说功能强大,个头大不说,也没有完美汉化版,给我的感觉一个字:慢!我不推荐初学者使用。
2,在反汇编文件中找到可疑点。
经典语句自不用说,比如,“恭喜”,“注册成功”,“注册码错误”
“无效的注册码”,“Thank You","Sorry"...找到后,一般向上不远处就可看到条件转移语句JZ、JNZ、JLE什么的。
事实上,只有极少极少的软件只修改注册判断就OK的。所以我们要把更多的注意力转到其它的可疑点。如未注册标识,过期警告,次数标识,NAG对话框...,熟练使用各种工具的搜索功能是基本功之一。找到后再向上不远处找条件转移语句。

如果找不到:
3,利用EXESCOPE中的对话框或字符串的ID号和地址指针,通过一定的转换,可在反汇编文件中找到相应的提示。
一般的有这样的参数入栈:
PUSH 00000064 (64即为ID号为100,当然不要遇到这样的语句就是,要凭自己的经验和感觉判断。还有,Win32DASM里的提示也不是完全对,它的解释很清楚,“Possible",“可能是”。
4,在十六进制编辑软件中搜索到提示信息的起始地址,把它换成程序运行时的偏移地址。如你得到地址是004DE356,那么回到Win32DASM中搜索6856E34D00,(它就是:PUSH 004DE356,我用这个方法曾对付个花指令)如果能找到一处或两处就表示找对了。有很多程序蛮狡猾的,不一定行得通。

5,找到注册判断函数CALL(子程序)
一般在条传转移语句的上面,如果你找到的CALL在程序中被调用了二三十次,那肯定不是了,顶多是字符串比较函数罢了。只一次的程序少,我见过的一般在三到六次之间。

6,通过以上可疑点,最好能找准注册标志变量,一种是固定内存变量,在程序中事先就定义好的。一般有以下几种比较形式:
mov eax, dword ptr [00401078]
cmp eax, 00000001
jz ...

mov eax, dword ptr [00401078]
test eax, eax
jz ...

mov eax, dword ptr [00401078]
mov ebx, dword ptr [eax]
cmp ebx, 00000000
jnz ...

还一种是利用堆栈偏移的临时变量;如
mov eax, dword ptr [ebp+50]
cmp eax,00000001
jz ...

...还有几种与前面的几种类似,不一一举例。

7,最好能分析一下程序的结构和流程。

到这里,找准爆破点应该没问题了。

三,如何爆破。
当你找准爆破点后,你会发现有很多种爆破的方法都可以达目的。
1,修改转移语句。
我一般这样改:
不需要跳,我就把74XX,75xx,0F84xxxxxxxx,0F85xxxxxxxx...中的xx,xxxxxxxx(偏移量)改为00,00000000。
需要跳,我就把74,75改为EB,把0F84,0F85改为90E9。这可避免万一你有正确的注册码反而会出错的事情发生。
2,修改注册标志变量,如变量为1则为注册,为0则为未注册,那么你只要搜索所有将该变量置0的语句改为置1就行了。
mov eax, 00000000
mov dword ptr [00401078], eax
这种好改。但大多是这样:
xor eax, eax
mov dword ptr [00401078], eax
这种有些难度,它不是简单地送值,而是异或置0。xor eax, eax的机器码是33C0,只有两个字节,而mov eax, 00000001的机器码是B801000000有五个字节,这可不好玩。我们可这样改,把CC30改为B001,B001是什么?就是mov al, 01啦!一般情况下这样改都不会有问题。
3,修改判断函数CALL。
如果这个函数只是判断注册是否正确,并返回AX的值,我一般会这样改。在CALL入口处就改为B801000000C3,就是
mov eax, 00000001
ret
这样可少执行代码,并且不访问注册表。甚至可把后面死码都置为00。
4,修改次数限制。
我在爆破亿虎软件时,我上面的方法都用了,看上都象正式的了,什么注册提示都没了,但用起来还是有30的限制。我实在分析不出暗桩在哪儿,我就只好改这里了。当然不是改次数。改判断使程序一直认为低于30就行了。

四,对于爆破的几点认识。
1,爆破不是最简单的。
如果一个软件采用明码比较,不管它有没有加壳,都可用OllyDbg之类的动态调试工具在很短的时间内获得,并做成内存注册机,速度之快有时令人惊讶,我曾五分钟之内找到注册码。爆破往往要试N次,改N处才可成功,还要测试。
2,爆破时要注重分析编程者的思路和判断机制,这样才可以学他人的长处,了解他的不足。这样才可在初级阶段学到一些有用技术。我觉得这一点比分析算法更重要。作者在升级或作同类软件时,他的注册算法肯定都是不一样的,而他的流程和判断机制基本都是一样的。我遇到一个软件要求注册但压根儿就没输入注册码的地方。它是通过注册文件注册的。
3,爆破还可把有不作用的功能屏蔽掉,做真正的完美版,如上网自动更新等等。当然高手还可加些功能,像我们用的Win32DASM 10.0

五,几点其它经验。
1,在Win32DASM中,右键双击CALL上面的调用地址,就可转到被调用处。同样右键双击转移入口上面的地址,就可转到开始跳的那一句,这功能相当有用哟!
2,搜索时可用如下的表示:
X, 0000001D       (因为程序不一定只用EAX)
+00000050]
只取一部分特征值有想不到的妙处,并且一般不会漏。
3,一个击破,各各击破。对于多产作者或同一公司的不同产品一般都有效,对于以后的升级版本也一样。
4,拿来主义。
我的第一个破解就是借来的。 DivX Subtitle Displayer是一个很小很实用的播放软件。前几月我一直用它看电影,我用的是4.44破解补丁,后来网上出了4.5。我就用FC32比较破解前后差异,然后再找到修改点,提取该点的特征值。再在4.5中搜索该值,运气好得很,就一处,改它!再运行!成功!再也没有烦人的NAG。从此踏上了我的爆破手生涯。作为初学者我建议不要用此种方法。


爆破不苦码字苦!以上高手见了也许不屑一顾,但作为像我一样的菜鸟应该有一定的帮助。由于我是边想边码,没有准备很详细的例子。所以不到之处和错误一定请各位指正。不然有谁因我而误入歧途我实担当不起。