黑客防线,在攻与防的对立统一中寻求突破!2001年创刊的黑客技术专业刊物!
plant

设为首页
收藏本站
联系我们
网站导航

黑客文章 - 加密解密 - 浏览 - [原创]踢开PC安全虎的障碍

[原创]踢开PC安全虎的障碍

黑客 发布日期:2009-4-27 0:20:43 共有 2773 人次浏览
适合读者:破解爱好者
前置知识:无
踢开PC安全虎的障碍
文/图 飞鸟
许多朋友觉得解密很神秘,认为破解软件很难,其实,只要有一定的汇编基础,加之正确地分析方法和解密技巧,我们都可以成功的破解软件!本人就是一

适合读者:破解爱好者

前置知识:无                                         

踢开PC安全虎的障碍

/ 飞鸟

    许多朋友觉得解密很神秘,认为破解软件很难,其实,只要有一定的汇编基础,加之正确地分析方法和解密技巧,我们都可以成功的破解软件!本人就是一个菜鸟,通过看书和学习高手的经验,再加上经过亲身动手实践,终于成功的破解了一款软件——PC安全虎。下面就让我们一起踢开这只拦路“虎”!

    PC安全虎顾名思义,是用来保护我们的电脑不被侵犯的软件。也就是可以锁定自己的电脑,让电脑不能实现某些功能,很适合用在公共场合和公用电脑上。不过该软件是共享软件,未注册版只能使用10天,只有注册才能不受任何限制的享受它带来的便利。该怎么办呢?破解它!1.001版下载地址:http://www.sjlm.net/soft2/PCTiger.zip

先说说我们要用到的软件。今天我们要使用的破解软件是SoftICE(如图1所示)。

1

相信大家一定听说过它的大名。什么?你没有听说过它?那好吧,我简单的介绍一下它。SoftICE是目前公认最好的跟踪调试工具。使用Soft-ICE可以很容易的跟踪一个软件、或是监视软件产生的错误进行除错,它有DOSWindows 3.1Windows 95/98/NT/2000/各个平台上的版本。SoftICE本是用来对软件进行调试、跟踪、除错的工具,在Cracker手中变成了最厉害的破解工具。同类软件还有个TRW2000,是国人所开发,使用时无需加载是其最大特点(SofICE使用时必须事先加载随系统启动),但TRW2000的稳定性没有SoftICE好。SoftICE下载地址:http://www.newhua.com/down/si405w9x.zip

    由于SoftICE的名气太大,导致许多软件都防它,所以给SoftICE打“补丁”就成为必不可少的举动了。这里为大家推荐FrogsiceFrogsice是最好的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   比较eaxedx是否相等

jz(jnz) 如果相等则跳走

这类软件破解难度不一样,有非常非常难,也有很简单的,因为它们采用的算法不一样。

2.时间限制。就是软件有使用时间限制的软件,过期就无法使用。比方说著名的扫描器流光2001就是这类软件的一个典范,过期就无法使用。

3.功能限制。这类软件不提供完整的程序功能,当你想使用某功能时往往会弹出对话框要你注册。破解PWL文件的PwlTool就是这样的软件,未注册的DEMO版只能破4位密码,而且没有输入注册码地方,

4NAG窗口。不断的弹出窗口提示你要注册,让你不胜其烦。比方说解密软件TRW2000123,如果使用的是未注册版本,在使用过程中就会不断地弹出册提示框,很是讨厌。这类软件一般来说相对容易破解。

5Key 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,金天地DJMH型软件狗等等。

    除此以外还有许多保护方式,这里就不多介绍了,如果感兴趣的话,留意我们的杂志或上网查找相关资料。下面谈谈软件的基本破解方式。一般说来,要破解一个软件有静态分析法和动态跟踪法两种基本方式(也不绝对),当然两者的结合也是必不可少的。静态分析主要是使用W32DASM等工具软件反汇编目标程序,然后根据软件的提示信息找到关键比较的地方,从而破解程序。注意,如果目标软件有加壳一定要先脱壳才行;动态跟踪法主要是使用SoftICETRW2000等软件跟踪调试目标程序,通过下断点切入到目标软件中,找到关键比较的地方,然后再破解程序。使用动态跟踪法不脱壳也可以,脱壳则更好。具体到今天我们要破解的程序PC安全虎,我们要使用静态分析法和动态跟踪法结合(大多数程序的破解都采用这种方法)来找到软件的注册码。

好了,背景知识介绍完毕,下面我们正式开始行动破解PC安全虎。运行PC安全虎,可以看到如图所示界面(如图2所示)。

 

2

点击“系统菜单”中的“用户注册”(如图3所示)。

 

3

在出现的窗口中输入假“用户ID”:1,假“注册码”:135792468(如图4所示)。

 

4

然后按下Ctrl+D键呼出SoftICE,输入BPX hmemcpy这个“万能”断点,按F5返回到程序中,点击“写入注册信息”按钮被中断下来。

这里的断点和中断大概菜鸟们不太了解,所谓断点就是程序被中断的地方,这个词对于破解者来说是再熟悉不过了。那么什么又是中断呢?中断是CPU处理外部突发事件的一个重要技术。它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行CPU原来的工作。

    举个例子来说,中断就是由于有特殊事件(中断事件)发生,计算机暂停当前的任务(即程序),转而去执行另外的任务(中断服务程序),然后再返回原先的任务继续执行。打个比方。当你正处理文件时,电话铃响了(中断请求),不得不在文件上做一个记号(返回地址),暂停工作,去接电话(中断),并告之对方“按第一次说的去办”(调中断服务程序),然后,再静下心来(恢复中断前状态),接着处理文件……计算机领域的科学家们观察了类似实例,借用了这些思想、处理方式和名称,研制了一系列中断服务程序及其调度系统。

    我们破解的过程就是输入断点,然后程序会以我们输入的注册码或用户名进行计算,将计算结果和正确的注册码相比较,此时我们将它中断下来,之后我们通过分析程序,找到正确的注册码。所以我们需要为被破解的程序设置断点,在适当的时候切入程序内部,追踪到程序的注册码,从而达到解密的目的。

    BPX用来在指令处下断点,在BPX命令中不用区分大小写。函数HmemcpyWindows9x系统的内部函数,位于Kernel32.dll中,它的作用是将内存中的一块数据拷贝到另一个地方。由于Windows9x系统频繁使用该函数处理各种字串,因此用它作为断点很实用,它是Windows9X平台最常用的断点。这个俗称万能断点的家伙,一般的编程书籍上很少提到,原因它是底层的东西,没有特殊需要,一般不直接调用。要提醒大家的是,在Windows NT/2K中没有这个断点,因为其内核和Windows 9x完全不同。

    背景知识介绍完毕,OK,让我们继续,按8F12键,可能有的朋友要问了,你怎么知道要按8F12键呀?这是初学解密的朋友经常会问的问题,许多教程告诉我们要按几下F12,然后再如何如何。可到底按几下是怎么知道的呢?这也是颇令初学者头痛的问题。其实,到底按几下F12键并没有定数,一定要自己跟踪调试过才知道。一个简单的判断方法是边按F12边数着自己按了几次,直到被跟踪调试的程序出现为止(一般显示注册失败之类的提示信息),这样,你应该按的次数就是记住的次数减去1,如按了9次出现注册失败之类的提示,则正确的按法是按F128次。

    现在,按F10键单步跟踪,直到到了下面这些代码处:

:00408AD6 E825D50000              call 00416000    //★★关键,这是验证注册码的CALL,按F8键跟入

:00408ADB 83C408                  add esp, 00000008

:00408ADE 8945C8                  mov dword ptr [ebp-38], eax

:00408AE1 837DC800                cmp dword ptr [ebp-38], 00000000

:00408AE5 0F84AF000000            je 00408B9A  //跳则注册失败

* Possible StringData Ref from Data Obj ->"

 

 

     注册成功!

 

     重新启动本软件注册即?

                                        ->"В?

     谢谢。" //可以看出这是注册成功的提示信息

F10键其实是TRW2000中的P命令的快捷键,P指令的作用是单步执行程序。在破解过程中如果感觉快要到关键的地方了,就按F0键单步执行程序,免得不小心漏过关键的地方。另外有人可能想问“关键call是怎么发现的呢?”我的经验是:关键是多做练习,熟能生巧。再有,也有一定的技巧,就是看是否有我们开篇时介绍的那些经典流程,如果有就说明那个call可能是关键call。一般说来,在关键call下边不远处会有跳转语句,如jejz等等。还有一个方法就是逆向推理,由注册失败时的代码向上看,看哪里有能跳过注册失败时的语句,然后分析为什么这个语句没有跳转,再向上看就能发现关键的跳转和关键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 8B45F0                  mov eax, dword ptr [ebp-10]

:00416189 038574FFFFFF            add eax, dword ptr [ebp+FFFFFF74]

:0041618F 0FBE00                  movsx eax, byte ptr [eax]       //依次取字符的ASCII值送入eax

:00416192 8B8D74FFFFFF            mov ecx, dword ptr [ebp+FFFFFF74]

:00416198 03848D78FFFFFF          add eax, dword ptr [ebp+4*ecx-00000088]

:0041619F 99                      cdq              //edx清零

:004161A0 B917000000              mov ecx, 00000017 //ecx置值为0x17

:004161A5 F7F9                    idiv ecx      //eax/ecx ,商放在eax,余数放在edx

:004161A7 83C242                  add edx, 00000042  //edx=余数+0x42

:004161AA 8B8574FFFFFF            mov eax, dword ptr [ebp+FFFFFF74]

:004161B0 8890E07A4800            mov byte ptr [eax+00487AE0], dl  //把每次计算结果的ASCII值保存

:004161B6 EBA6                    jmp 0041615E    //继续取下一个字符

    以上是个循环,主要实现以下这些功能:先将用户名每个字符的ASCII值加上一个数,这个数按其所在位数不同而不同。从第1位开始,130位所加的数依次为(十进制):231518174212421972210111357223811829103105161271221407124884149151

  每位字符与上述对应的数相加后所得的和,除以0x17,求得一个余数。余数再与0x42相加和的ASCII的值,作为对应用户名位数的注册码,把用户名各个字符计算出的结果依次排列成串。

    当用你输入的用户名计算完毕,会跳转到这里:

:004161B8 8B8D74FFFFFF            mov ecx, dword ptr [ebp+FFFFFF74]

:004161BE C681E07A480000          mov byte ptr [ecx+00487AE0], 00

:004161C5 68E07A4800              push 00487AE0      //计算结果入栈

:004161CA E8E1DB0000              call 00423DB0

:004161CF 83C404                  add esp, 00000004

:004161D2 83F805                  cmp eax, 00000005    //用户名长度大于5吗?

:004161D5 7712                    ja 004161E9     //大于则跳走到004161E9

:004161D7 6828254800              push 00482528        //不大于则软件内置字符CNIAWFKU入栈

:004161DC 68E07A4800              push 00487AE0     //0<用户名≤5时的计算结果入栈

:004161E1 E80AE10000              call 004242F0        //组成一个字符串

:004161E6 83C408                  add esp, 00000008

:004161E9 68E07A4800              push 00487AE0  //★★正确注册码入栈,在这里可以看到正确注册码

:004161EE 8D4D0C                  lea ecx, dword ptr [ebp+0C] //输入的假注册码放到[ebp+0C]

:004161F1 E8BAB1FEFF              call 004013B0   //★★★关键!这是真假注册码比较call

:004161F6 85C0                    test eax, eax   //eax等于0吗?

:004161F8 752D                    jne 00416227    //eax不等于0则跳走,跳则注册失败!

    上面这部分代码是要进行真假注册码对比,当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)!这个注册码你也可以用,因为它是通用的。

    暴力破解的话可以将偏移地址004161F8处的jne 00416227改为两个NOP即空操作,即可注册成功。要想制作出破解版,可以用16进制文件编辑软件UltraEdit打开PC安全虎,然后按Alt+F3查找E8BAB1FEFF85C0752D,找到后改为E8BAB1FEFF85C090909090就是NOP空操作的机器码。

到了这里我们就得到了PC安全虎的注册码,本文只是用它来举例,没有别的意思,希望大家不要开发注册机,毕竟我们的目的是学习而非破坏。其实,解密很简单,甚至于不需要懂得太多的汇编知识(最基础的还是需要掌握),兴趣才是最好的老师,是最终能否成功的关键!

<span style="font-family: 宋体

所属分类: 加密解密     网摘收藏: Google 雅虎 百度 POCO 365key 和讯 天极