lishiai 发表于 2010-1-23 12:22:44

不脱壳直接破解软件

适合读者:破解爱好者
前置知识:汇编代码基本阅读能力
Icefire:时下发布的软件绝大多数都被加壳,其目的一半是为了保护作者的劳动成果、权益不受侵害,一半是为了减少电脑资源的占用、便于网络传输与交流。如果出于某种需要,要想修改软件的功能,在不脱壳的情况下是
适合读者:破解爱好者

前置知识:汇编代码基本阅读能力

Icefire:时下发布的软件绝大多数都被加壳,其目的一半是为了保护作者的劳动成果、权益不受侵害,一半是为了减少电脑资源的占用、便于网络传输与交流。如果出于某种需要,要想修改软件的功能,在不脱壳的情况下是不太方便的,尤其是一些具有时间限制的共享软件,如果你没有注册,时间一到,软件就无法使用。这时你若是想继续它,就只得破解了。而脱壳后的文件体积却增大许多,占着过多的位置让人心中不爽。那么,不脱壳就拿它没辙?非也。通过分析与研究,我认为,凡是有允许与禁止功能的地方都是可以通过体外手术(壳外补丁)进行控制的。甚至你可以在不改动原软件的任何地方来实现自己的某些愿望(有点像外挂),如显示个提示框什么的。只要你添加的代码不多、原软件剩余空间足够(一般都有空余位置),补丁后软件大小也不会改变。如果添加的代码较多,可考虑适当增肥。

不脱壳直接破解软件

文/图 laoxuetong

要实现带壳软件直接打补丁,需要一些技巧和运气,虽然这看起来是很不容易实现的,其实并不象大家想的那么难,下面听我慢慢道来。

要实现这种带壳补丁的目的,当然你需要作充分的前提条件:

过硬的软件跟踪与分析能力,因为你没有软件作者的源码,一切都要靠自己动手;

简单代码编写能力,当然是汇编代码,可以借调试软件帮忙;

必备工具:PEiD、OllyDbg、W32DasM、文本编辑器(WinHex或UltraEdit或其它)、文件增肥工具(如:ZeroAdd)等;

任一编程平台,编写补丁程序用(与使用汉化补丁类似);

最简单的加、减法运算(Icefire:这也算一条?)。

作为练习,下面以 LS定时器为例,看看如何带壳编写破解补丁。这个软件提供如下功能:它可以根据你的设定在你需要的时候提醒你,防止你忘记重要的事情;它可以根据你的设定在你需要的时候运行制定程序;各种提示都是可以是重复的,它可以每分钟、每小时、每日、每天、每周、每月、每年的重复决不会怕麻烦;在某一时间,例如:2004年1月1日20点30分关机;倒计时一定时间,例如:在2小时30分以后关机;当键盘和鼠标没有操作一定时间,例如:在你离开电脑30分钟后关机。

该软件未注册时只能使用30天,30天过后只能注册后才能使用。见图1所示:





图1

初步准备

首先使用PEiD探测得知,软件使用了ASPack 2.12->Alexey Solodovnikov加的壳。这种壳脱壳也较为容易,特征标志比较明显。加了这种壳的软件运行时,壳先自行释放被加壳的软件,然后将再运行被加壳的软件。我们只要找出释放后、运行前的位置,在这个位置跳到我们的补丁代码处进行补丁行动,补丁完成后返回,接着继续软件就完事了。

使用OllyDbg载入程序,不用运行。向下滚动代码区,直到找到如下代码:

006083AF    61               POPAD

006083B0    75 08            JNZ SHORT LsDown.006083BA

006083B2    B8 01000000      MOV EAX,1

006083B7    C2 0C00          RETN 0C

006083BA    68 00000000      PUSH 0

006083BF    C3               RETN

复制出来备用。在OllyDbg代码区按住右边的滚动条向下拖动,直到底部的全0区域。见图2所示:






图2

在全0区域的前部,选一个偏移好记的位置。在代码区双击,在弹出的编辑框中输入任意一条汇编指令,如:RETN。确定后的结果如图3所示:






图3

在OllyDbg中选择这段代码,点右键,在弹出的菜单中执行“复制到可执行文件——选择部分(不同版本的OD这个菜单略有不同)”,在跳出的代码框中点右键,并在弹出的菜单中执行“保存文件”,另起一个名称,保存备用(为简化计算,此过程必需)。



深入跟踪

这里是个高强度的工作,你需要有足够耐力和观察分析判断力。你没有注册,又过了试用期。所以你必须找到所有的判断注册与否的关键跳转,并记录下相关的代码部分(该软件使用的非可逆注册算法,只能爆破)。通过寻找,会得到如下关键代码处:

1、005131FASETE AL

2、0051321EJNZ SHORT LsDown.00513227

3、00533C89JE SHORT LsDown.00533C91

通过分析和试验,发现需要将它们分别更改成为:

1、005131FAMOV AL,1

             NOP

2、0051321EJE SHORT LsDown.00513227

3、00533C89JNZ SHORT LsDown.00533C91

则软件可以使用并且没有任何限制。



制作模拟补丁

因为这里所说的补丁制作不是在软件里直接完成,而是另用编程软件制作,所以需要取得补丁的汇编级机器码。又因为上述需要修改的汇编代码的机器码为:

MOV AL,1-->B0 01

NOP   -->90

JE SHORT LsDown.00513227-->74 07

JNZ SHORT LsDown.00533C91-->75 06

其偏移地址分别为:

005131FA

0051321E

00533C89

所以模拟补丁形如:

MOV WORD PTR SS:,1B0

MOV BYTE PTR DS:,90

MOV BYTE PTR DS:,74

MOV BYTE PTR DS:,75

JMP LsDown.006083BA          ;补丁完成后的返回

NOP

NOP

再在OllyDbg中下面的代码区的全0区域的任意位置输入上述汇编代码,然后复制出对应的汇编机器码备用。在返回到偏移006083B0处,将JNZ SHORT LsDown.006083BA改为形如JMP 0060A310(你选定的位置),复制出机器码备用。到此,模拟补丁代码获取工作完成。



编写补丁程序

众所周知,反汇编后的代码位置的偏移与软件经过编译后的物理偏移是不一样的,要在壳外植入补丁需要取得对应位置的物理偏移。我们这里需要两处物理偏移,一处是对应于JNZ SHORT LsDown.006083BA的,一处是补丁部分的起始位置,这就要借助于文本编辑器进行。

用UltraEdit(或其它文本编辑器)打开前面保存的修改过的更名文件,使用查找功能查找hex:75 08 B8 01(对应于JNZ SHORT LsDown.006083BA)。得到首地址为:000935B0h,记下备用,然后拉到文件的最后,查找添加的代码位置(对应RETN),得到首地址为:00095510h(视你选择的位置不同而不同),记下备用,至此全部准备工作完成。

做好上述准备工作后,你就可以使用任一编程软件来编写你的补丁用程序了。

请注意我们所要做的工作:修改006083B0处的跳转;植入动态补丁代码和设置返回跳转,其余还应该考虑版本检测、原文件备份、提示帮助等问题。以下是我用 VB 编写的主要部分代码:

    Open Fname For Binary As fhandle

    '再次检验

    '=============================================

    '寻找软件版本的关键标志


    'VB中Get命令读数据指针从1开始,注意与hex编辑器中的地址

    '的区别。即 偏移+1。

    Get fhandle, &H935B0, data1 '为保险读取四个字节,也可多读

    Get fhandle, &H935B1, data2

    Get fhandle, &H935B2, data3

    Get fhandle, &H935B3, data4

    '=============================================

    If (data1 <> &H61) And (data2 <> &H75) And (data3 <> &H8) _

      And (data4 <> &HB8) Then MsgBox "请核对软件版本!", _

      vbCritical + vbOKOnly, "文件错误:": Close fhandle: Exit Sub

    '修改全部要补丁的数据

    '==========================

    '壳的出口部分的修改

    Put fhandle, &H935B1, &HE9

    Put fhandle, &H935B2, &H5B

    Put fhandle, &H935B3, &H1F

    Put fhandle, &H935B4, &H0

    Put fhandle, &H935B5, &H0

    Put fhandle, &H935B6, &H90

    Put fhandle, &H935B7, &H90

    '增加动态修改用代码

    Put fhandle, &H95511, &H66

    Put fhandle, &H95512, &H36

    Put fhandle, &H95513, &HC7

    Put fhandle, &H95514, &H5

    Put fhandle, &H95515, &HFA

    Put fhandle, &H95516, &H31

    Put fhandle, &H95517, &H51

    Put fhandle, &H95518, &H0

    Put fhandle, &H95519, &HB0

    Put fhandle, &H9551A, &H1

    Put fhandle, &H9551B, &HC6

    Put fhandle, &H9551C, &H5

    Put fhandle, &H9551D, &HFC

    Put fhandle, &H9551E, &H31

    Put fhandle, &H9551F, &H51

    Put fhandle, &H95520, &H0

    Put fhandle, &H95521, &H90

    Put fhandle, &H95522, &HC6

    Put fhandle, &H95523, &H5

    Put fhandle, &H95524, &H1E

    Put fhandle, &H95525, &H32

    Put fhandle, &H95526, &H52

    Put fhandle, &H95527, &H0

    Put fhandle, &H95528, &H74

    Put fhandle, &H95529, &HC6

    Put fhandle, &H9552A, &H5

    Put fhandle, &H9552B, &H89

    Put fhandle, &H9552C, &H3C

    Put fhandle, &H9552D, &H53

    Put fhandle, &H9552E, &H0

    Put fhandle, &H9552F, &H75

    Put fhandle, &H95530, &HE9

    Put fhandle, &H95531, &H86

    Put fhandle, &H95532, &HE0

    Put fhandle, &H95533, &HFF

    Put fhandle, &H95534, &HFF

    Put fhandle, &H95535, &H90

    Put fhandle, &H95536, &H90

    Put fhandle, &H95537, &H90

    '完成写入,关闭它

    Close fhandle



Icefire:细心的读者可能注意到,这两段代码中所使用的首地址比我们记录的首地址多1,这是因为VB的最小指针单位是1而不是0,而文本编辑器等的最小指针单位是0,所以在不同编程平台上编程时要多加注意。



编好补丁代码后,将其编译为可执行程序,然后试试你的东西,看能否将带壳的软件打补丁而且正常工作!我编好的补丁软件界面如图4所示:






图4

如果一切正常,那你就大功告成了。



后记

有时,你可能想到要别出心裁的在软件中添加点属于自己有个性的东西,比如警示框等等。那也不难,只要你知道弹出对话框需要什么条件、用到哪些代码就可以做到的。例如:现在我想在软件启动前弹出一个对话框,如图5所示:






图5

我们该如何做呢?这个问题当然要难一点。如果壳外有现成的对话框调用函数,就可以简单地进行调用。如果没有则需要添加较多的代码,这里就不讲了,免得有骗稿费之嫌。

总之,编写补丁如同编写一个软件,同样能实现自己的目的与愿望,展示自己的才华与智慧。个中乐趣只有亲自品尝之。
页: [1]
查看完整版本: 不脱壳直接破解软件