![]() |
适合读者:破解爱好者 前置知识:无 踢开PC安全虎的障碍 文/图 飞鸟 许多朋友觉得解密很神秘,认为破解软件很难,其实,只要有一定的汇编基础,加之正确地分析方法和解密技巧,我们都可以成功的破解软件!本人就是一 |
适合读者:破解爱好者 前置知识:无 踢开PC安全虎的障碍 文/图 飞鸟 许多朋友觉得解密很神秘,认为破解软件很难,其实,只要有一定的汇编基础,加之正确地分析方法和解密技巧,我们都可以成功的破解软件!本人就是一个菜鸟,通过看书和学习高手的经验,再加上经过亲身动手实践,终于成功的破解了一款软件——PC安全虎。下面就让我们一起踢开这只拦路“虎”! PC安全虎顾名思义,是用来保护我们的电脑不被侵犯的软件。也就是可以锁定自己的电脑,让电脑不能实现某些功能,很适合用在公共场合和公用电脑上。不过该软件是共享软件,未注册版只能使用10天,只有注册才能不受任何限制的享受它带来的便利。该怎么办呢?破解它!1.001版下载地址:http://www.sjlm.net/soft2/PCTiger.zip。 先说说我们要用到的软件。今天我们要使用的破解软件是SoftICE(如图1所示)。
图1 相信大家一定听说过它的大名。什么?你没有听说过它?那好吧,我简单的介绍一下它。SoftICE是目前公认最好的跟踪调试工具。使用Soft-ICE可以很容易的跟踪一个软件、或是监视软件产生的错误进行除错,它有DOS、Windows 3.1、Windows 95/98/NT/2000/各个平台上的版本。SoftICE本是用来对软件进行调试、跟踪、除错的工具,在Cracker手中变成了最厉害的破解工具。同类软件还有个TRW2000,是国人所开发,使用时无需加载是其最大特点(SofICE使用时必须事先加载随系统启动),但TRW2000的稳定性没有SoftICE好。SoftICE下载地址:http://www.newhua.com/down/si405w9x.zip。 由于SoftICE的名气太大,导致许多软件都防它,所以给SoftICE打“补丁”就成为必不可少的举动了。这里为大家推荐Frogsice,Frogsice是最好的SoftICE加强软件,它并不是简单的将SoftICE隐藏,而是让你可以配合SoftICE避过现在流行的各种加密、保护软件里面的各种防止SoftICE的陷阱。有了它,你再也不用怕在装入一个程序准备调试的时候,程序会告诉你发现SoftICE的存在而终止运行,或者干脆把你的机器重新启动,又甚至触发更残酷的报复手段。Frogsice下载地址:http://www.pediy.com/tools/Debuggers/softice%20tools/FrogsICE/FROGSICE.ZIP。 介绍完所用的工具,再来谈谈软件保护软件。大家知道,为了保护自己辛辛苦苦编写的软件,软件作者们可谓是煞费苦心,想出许多办法保护自己的软件。如果我们能对软件的保护方式做到心中有数,在破解时就会做到有的放矢了。大致说来常见软件保护方式有如下几种: 1.序列号方式。这是最常见的保护软件保护方式了,就是要我们输入注册码的那种程序,比方说我们要破解的PC安全虎就是这样的软件。这类软件一般是这样进行注册码比较的(以下是一个经典的流程): mov eax [ ] 这里可以是地址,也可以是其它寄存器 mov edx [ ] 这里可以是地址,也可以是其它寄存器,通常这两个地址就储存着重要信息 call 00?????? 注册码比较call test eax eax jz(jnz) 如果相等(不相等)就跳走 也有这样的注册码比较过程,也非常经典: mov eax [ ] “[ ]”中可以是地址,也可以是其它寄存器 mov edx [ ] 同上 cmp eax,edx 比较eax与edx是否相等 jz(jnz) 如果相等则跳走 这类软件破解难度不一样,有非常非常难,也有很简单的,因为它们采用的算法不一样。 2.时间限制。就是软件有使用时间限制的软件,过期就无法使用。比方说著名的扫描器流光2001就是这类软件的一个典范,过期就无法使用。 3.功能限制。这类软件不提供完整的程序功能,当你想使用某功能时往往会弹出对话框要你注册。破解PWL文件的PwlTool就是这样的软件,未注册的DEMO版只能破4位密码,而且没有输入注册码地方, 4.NAG窗口。不断的弹出窗口提示你要注册,让你不胜其烦。比方说解密软件TRW2000123,如果使用的是未注册版本,在使用过程中就会不断地弹出册提示框,很是讨厌。这类软件一般来说相对容易破解。 5.Key file。顾名思义,只有拥有了Key文件才能使用全部功能,这类软件也不少,16进制文件编辑软件WinHEX就是这样的软件,这类软件一般来说破解起来不容易。 6.广告窗口。这类在软件中不断的显示赞助商的广告,下载软件网络蚂蚁和网际快车就是这样的软件。 7.加密光盘。这类软件只能在光盘上运行,拷贝到硬盘上之后无法运行。比方说游戏软件傲世三国就是这样的软件。喜欢游戏的朋友一定要学会这类软件的破解方法,否则只能玩光盘游戏了。 8.水印。此类软件如果未注册的话,会在你要生成的文件(比方说图片上)加上水印,让你的图示出现Demo version之类的字,AutoGraphicsHTML就是这样的软件。 9.安装程序。现在有许多程序使用Install Shield来制作它们的安装程序,而且在安装时就要求输入注册码。这一类程序的注册过程主要是由Install Shield来控制的,Install Shield将其安装过程的信息存放在编译后的脚本文件Setup.ins中。因此,只需要对Setup.ins文件进行反编译,即可洞悉Install Shield的整个安装过程。网际金典3就是使用Install Shield制作的安装程序。 10.加密狗。分为软件狗和硬件狗两种,都非常不好对付,常见的加密狗有以色列的Hasp系列,国产的Sense3,金天地DJ、MH型软件狗等等。 除此以外还有许多保护方式,这里就不多介绍了,如果感兴趣的话,留意我们的杂志或上网查找相关资料。下面谈谈软件的基本破解方式。一般说来,要破解一个软件有静态分析法和动态跟踪法两种基本方式(也不绝对),当然两者的结合也是必不可少的。静态分析主要是使用W32DASM等工具软件反汇编目标程序,然后根据软件的提示信息找到关键比较的地方,从而破解程序。注意,如果目标软件有加壳一定要先脱壳才行;动态跟踪法主要是使用SoftICE或TRW2000等软件跟踪调试目标程序,通过下断点切入到目标软件中,找到关键比较的地方,然后再破解程序。使用动态跟踪法不脱壳也可以,脱壳则更好。具体到今天我们要破解的程序PC安全虎,我们要使用静态分析法和动态跟踪法结合(大多数程序的破解都采用这种方法)来找到软件的注册码。 好了,背景知识介绍完毕,下面我们正式开始行动破解PC安全虎。运行PC安全虎,可以看到如图所示界面(如图2所示)。
图2 点击“系统菜单”中的“用户注册”(如图3所示)。
图3 在出现的窗口中输入假“用户ID”:1,假“注册码”:135792468(如图4所示)。
图4 然后按下Ctrl+D键呼出SoftICE,输入BPX hmemcpy这个“万能”断点,按F5返回到程序中,点击“写入注册信息”按钮被中断下来。 这里的断点和中断大概菜鸟们不太了解,所谓断点就是程序被中断的地方,这个词对于破解者来说是再熟悉不过了。那么什么又是中断呢?中断是CPU处理外部突发事件的一个重要技术。它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行CPU原来的工作。 举个例子来说,中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方。当你正处理文件时,电话铃响了(中断请求),不得不在文件上做一个记号(返回地址),暂停工作,去接电话(中断),并告之对方“按第一次说的去办”(调中断服务程序),然后,再静下心来(恢复中断前状态),接着处理文件……计算机领域的科学家们观察了类似实例,借用了这些思想、处理方式和名称,研制了一系列中断服务程序及其调度系统。 我们破解的过程就是输入断点,然后程序会以我们输入的注册码或用户名进行计算,将计算结果和正确的注册码相比较,此时我们将它中断下来,之后我们通过分析程序,找到正确的注册码。所以我们需要为被破解的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,从而达到解密的目的。 BPX用来在指令处下断点,在BPX命令中不用区分大小写。函数Hmemcpy是Windows9x系统的内部函数,位于Kernel32.dll中,它的作用是将内存中的一块数据拷贝到另一个地方。由于Windows9x系统频繁使用该函数处理各种字串,因此用它作为断点很实用,它是Windows9X平台最常用的断点。这个俗称万能断点的家伙,一般的编程书籍上很少提到,原因它是底层的东西,没有特殊需要,一般不直接调用。要提醒大家的是,在Windows NT/2K中没有这个断点,因为其内核和Windows 9x完全不同。 背景知识介绍完毕,OK,让我们继续,按8下F12键,可能有的朋友要问了,你怎么知道要按8下F12键呀?这是初学解密的朋友经常会问的问题,许多教程告诉我们要按几下F12,然后再如何如何。可到底按几下是怎么知道的呢?这也是颇令初学者头痛的问题。其实,到底按几下F12键并没有定数,一定要自己跟踪调试过才知道。一个简单的判断方法是边按F12边数着自己按了几次,直到被跟踪调试的程序出现为止(一般显示注册失败之类的提示信息),这样,你应该按的次数就是记住的次数减去1,如按了9次出现注册失败之类的提示,则正确的按法是按F12键8次。 现在,按F10键单步跟踪,直到到了下面这些代码处: :00408AD6 E825D50000 call 00416000 //★★关键,这是验证注册码的CALL,按F8键跟入 :00408ADB :00408ADE :00408AE1 837DC800 cmp dword ptr [ebp-38], 00000000 :00408AE5 * Possible StringData Ref from Data Obj ->" 注册成功! 重新启动本软件注册即? ->"缮В? 谢谢。" //可以看出这是注册成功的提示信息 F10键其实是TRW2000中的P命令的快捷键,P指令的作用是单步执行程序。在破解过程中如果感觉快要到关键的地方了,就按F0键单步执行程序,免得不小心漏过关键的地方。另外有人可能想问“关键call是怎么发现的呢?”我的经验是:关键是多做练习,熟能生巧。再有,也有一定的技巧,就是看是否有我们开篇时介绍的那些经典流程,如果有就说明那个call可能是关键call。一般说来,在关键call下边不远处会有跳转语句,如je、jz等等。还有一个方法就是逆向推理,由注册失败时的代码向上看,看哪里有能跳过注册失败时的语句,然后分析为什么这个语句没有跳转,再向上看就能发现关键的跳转和关键call。这只是本人的经验之谈,不敢保证所有的软件都如此,切记要灵活分析,多动脑子,勤练习就有感觉了。顺便说一句,在解密时有很好的感觉也很重要,这可不是谁能教你的。 好了,让我们继续。按F8进入00408AD6处的Call 00416000之后,首先会来到下面这行代码处: :00416000 5 push ebp //进入关键Call后光标停留在这一行 到了上面所示这一行代码后,小心地按F10键大约176下左右,直到看到下面这些代码为止: :00416176 0FBE11 movsx edx, byte ptr [ecx] //取用户名字符的ASCII值,保存到edx :00416179 85D2 test edx, edx //比较edx是否为0,即比较是否取完用户名 :0041617B 743B je 004161B8 //取完即跳 :0041617D 83BD74FFFFFF1E cmp dword ptr [ebp+FFFFFF74], 0000001E //取了多少个字符? :00416184 7D32 jge 004161B8 //取够30个则跳,十六进制的1E等于十进制的30 :00416186 8B :00416189 038574FFFFFF add eax, dword ptr [ebp+FFFFFF74] : :00416192 8B8D74FFFFFF mov ecx, dword ptr [ebp+FFFFFF74] :00416198 03848D78FFFFFF add eax, dword ptr [ebp+4*ecx-00000088] : : : : :004161AA 8B8574FFFFFF mov eax, dword ptr [ebp+FFFFFF74] :004161B0 8890E :004161B6 EBA6 jmp 0041615E //继续取下一个字符 以上是个循环,主要实现以下这些功能:先将用户名每个字符的ASCII值加上一个数,这个数按其所在位数不同而不同。从第1位开始,1~30位所加的数依次为(十进制):23、15、18、17、4、21、24、2、19、7、22、10、11、13、5、72、238、118、29、103、105、161、27、122、140、71、248、84、149、151。 每位字符与上述对应的数相加后所得的和,除以0x17,求得一个余数。余数再与0x42相加和的ASCII的值,作为对应用户名位数的注册码,把用户名各个字符计算出的结果依次排列成串。 当用你输入的用户名计算完毕,会跳转到这里: :004161B8 8B8D74FFFFFF mov ecx, dword ptr [ebp+FFFFFF74] :004161BE C681E : :004161CA E8E1DB0000 call 00423DB0 :004161CF :004161D2 :004161D5 7712 ja 004161E9 //大于则跳走到004161E9处 :004161D7 6828254800 push 00482528 //不大于则软件内置字符CNIAWFKU入栈 :004161DC 68E :004161E1 E80AE10000 call :004161E6 :004161E9 68E :004161EE 8D4D : : : 上面这部分代码是要进行真假注册码对比,当0<用户名长度≤5时,在计算结果后加上"CNIAWFKU",作为正确的注册码。当5<用户名长度≤30时,根据用户名各位字符的ASCII值计算出结果(ASCII),排列成串直接作为正确的注册码。如果你输入的用户名长度超过31位(包括31位),则30为以后的字符不列入计算范围,即注册码最长为30位(中文算2个字符)。 上面最后三条语句可以看到这是多么经典的比较过程啊,一定要牢记这种形式,以后在解密时碰到它们就要留心了。根据分析可以知道,要想得到注册码的话,只要在SoftICE中输入BPX 004161E9 do "d 487AE0",然后返回到PC安全虎中重新注册,点击“写入注册信息”后会被中断下来,在SoftICE中就可以直接看到正确的注册码(图5)!该命令的含义是在偏移地址004161E9处下断点,然后执行do "d 487AE0"指令,即显示内存地址487AE0中的值,也就是显示注册码。在本例中中断下来后,输入D EAX也可以看到当我们用用户名1时,PC安全虎的注册码为:ECNIAWFKU。按F5键返回到PC安全虎中,重新输入注册码,看我们注册成功了(图6)!这个注册码你也可以用,因为它是通用的。 暴力破解的话可以将偏移地址 到了这里我们就得到了PC安全虎的注册码,本文只是用它来举例,没有别的意思,希望大家不要开发注册机,毕竟我们的目的是学习而非破坏。其实,解密很简单,甚至于不需要懂得太多的汇编知识(最基础的还是需要掌握),兴趣才是最好的老师,是最终能否成功的关键! <span style="font-family: 宋体 |