在软件安全领域,逆向工程是一种重要的技术手段,它允许安全研究人员深入理解软件的工作原理,发现潜在的安全漏洞,甚至破解软件的保护机制。本文将介绍如何使用OllyDbg这一强大的逆向工程工具,对一个未知来源的软件进行破解,去除其试用版的限制。
在开始之前,需要强调的是,进行逆向工程需要对汇编语言有深入的了解。此外,计算机上应该安装以下工具:
这些工具将帮助分析和修改软件的二进制文件。
软件保护机制是软件开发商为了保护其版权和防止未授权使用而设置的一种技术手段。常见的保护机制包括但不限于:
本文将重点介绍如何通过修改二进制文件,去除软件的时间限制保护。
首先,需要确定软件的来源。可以使用CFF Explorer工具来查看软件的一些基本信息,例如开发语言。例如,如果软件是用VC++开发的,那么它就是一个原生的可执行文件,而不是在CLR(公共语言运行时)下运行的.NET应用程序。
对于原生可执行文件,不能使用ILDASM或Reflector这样的工具来分析其操作码。需要采用不同的方法来破解它。
假设手头有一个名为SoftwareExpiration.exe的软件,它在试用期结束后就无法使用了。目标是去除这个限制,使其可以继续使用。以下是具体的步骤:
虽然IDA Pro也是一个强大的工具,但它是商业化的,并且不是免费提供的。OllyDbg虽然不如IDA Pro强大,但在某些场景下仍然非常有用。首先,从官方网站下载并正确配置OllyDbg。
接下来,打开SoftwareExpiration.exe程序,它将反编译二进制文件。不要害怕那些奇怪的汇编代码,因为所有的修改都是在原生汇编代码中进行的。
在OllyDbg中,可以看到程序的入口点指令,例如00401204。CPU主线程窗口显示了以汇编指令形式执行的软件代码,从上到下执行。这就是为什么在逆向原生可执行文件时需要汇编编程知识。
由于没有实际的源代码,如何检查汇编代码呢?这里的错误消息“对不起,这个试用软件已过期”可能会帮助解决问题,因为通过这个错误消息,可以确定导致这个错误消息的代码路径。
当错误对话框仍然显示时,按F9或从调试菜单开始调试。现在,可以找到时间限制代码。然后按F12暂停代码执行,以便找到导致错误消息显示的代码。
好的,现在按Alt+K查看调用栈。在这里,可以很容易地找出试用错误文本是MessageBoxA的参数。
MessageBoxA
选择调用栈底部附近的USER32.MessageBoxA,然后右键选择显示调用,如下所示:
它显示了选择的汇编调用MessageBoxA的起始点。注意代码行旁边的大于符号(>),这表明另一行代码跳转到该位置。在调用MessageBoxA之前(红色右窗格),四个参数被推入堆栈。这里的PUSH 10指令包含了>符号,这是另一行代码引用的。
选择位于004011C0地址的PUSH 10指令,引用所选行的代码将在CPU窗口的顶部窗格下方的文本区域中显示,如下所示:
选择上图中的文本区域代码,然后右键打开快捷菜单。它允许轻松导航到引用所选行的代码,如下所示:
到目前为止,已经确定了负责产生错误消息的实际代码行。现在是时候对二进制代码进行一些修改了。前图的上下文菜单显示00401055和00401063都包含JA(跳转)到用于消息框的PUSH 10。
首先,从上下文菜单中选择Go to JA 00401055。现在应该在0x00401055位置的代码上。最终目标是防止程序触发错误代码路径。所以这可以通过将JA指令更改为NOP(无操作)来实现,实际上什么也不做。右键点击CPU窗口中的0x00401055指令,然后选择二进制,然后点击
Fill with NOPs
如下所示:
此操作将0x00401055的所有对应指令填充为NOP,如下所示。
按减号(~)返回PUSH 10,然后重复上述过程,对0x00401063指令进行处理,如下所示:
现在通过在CPU窗口中右键点击来保存修改。点击
Copy to Executable
,然后点击
All Modifications
。然后在下一个出现的对话框中点击
Copy all
按钮,如下所示:
点击Copy all按钮后,将出现一个名为SoftwareExpiration.exe的新窗口。在这里,右键点击这个窗口,然后选择
Save File
,如下所示。