📜  代码逆向工程–如何对到期的软件进行逆向工程

📅  最后修改于: 2021-04-17 04:14:04             🧑  作者: Mango

本文旨在演示软件过期版本的颠覆机制,包括验证检查,通过执行高级逆向工程机制甚至无需访问或分析其源代码即可修改可执行二进制文件的现有行为。简而言之,由于早期开发者的不可用,我们仅拥有特定应用程序的可执行文件,该文件已经过期并且现在处于锁定状态。因此,我们将首先对其进行解锁,然后像逆向工程之前那样通过将其输入内部来使用它的功能。为了实现这一目标,必须具备全面的汇编语言指令知识以及OllyDBG工具的深厚操作技能。

逆向工程 –

开发软件的供应商很可能现在不存在或可能被关闭。现在产品已过期,或者可能显示一些奇怪的运行时错误,或者可能会产生奇怪的结果。现在迫在眉睫的挑战是,如何删除此类安全验证,复制以前公司提供的保护权,因为我们没有软件源代码,因为我们仅签署了软件可执行程序包的共同合同,而没有签订源代码。幸运的是,仍然可以通过分析过期的软件的二进制代码来修改或修补过期的软件,这通常被称为软件工程。

元数据分析

因此,当我们运行该软件时,它反映出一个很钝的信息,即它已过期,并且要继续试用版,请购买完整版本。从字面上可以看出,供应商已实施了复制保护计划,以最大程度地减少不请自来的用户绕过这些复制计划的难易程度。复制保护机制通常包括一种实践,在该实践中,软件通过运行软件来检查要公开的功能。除此之外,它还允许软件激活直到一定时间。如您在下面看到的,以下软件试用版已过期,无法运行。此外,当我们尝试执行错误消息时,还会显示错误消息。

要绕过此复制保护限制并延长其试用期,我们必须首先收集二进制元数据,因为我们完全不知道二进制元数据的来源,而二进制元数据是在其开发环境所遵循的。从CFF浏览器很容易得出结论,它是一个用VC++语言编译的PE 32位二进制文件。

二进制分解

在我们努力执行demoBinary.exe文件时,鉴于当前日期已经超过了批准的初步审核日期,因此它将无法运行。我们怎么利用几乎不考虑测试时间的产品?因此,为了这样做,我们首先在OllDBG中加载和调试二进制文件以了解其后端功能,然后通过向后跟踪来编辑永远不会出现在代码路径试用到期中的部分。现在真正的攻击开始了,从其官方网站下载OllyDBG工具,然后正确安装/配置它。稍后,从“文件/打开”选项中打开IDE中的demoBinary.exe二进制文件。它开始反编译并加载可执行文件的汇编代码,如下图所示。从指令00401204开始,我们可以总结出执行流程从上到下的入口点,如下所示:

现在出现的问题是,如何确定上述汇编代码中的哪一部分将被操纵,而哪一部分应保持原样。作为逆向工程的经验法则,可以随时跟踪显示的字符串跟踪执行情况。编写此软件的公司已为您提供了非常有用的消息,表明试用期已过。因此,我们的主要目标是找到显示的字符串错误消息“对不起,此跟踪软件已过期”,它可以将我们引向所需的部分。按一下F9和试用期限限制代码,开始在IDE中进行调试,一旦我们暂停了执行并获得了错误消息的负责部分,即可开始进行调试。从调用堆栈(Alt + K),跟踪错误文本是MessageBoxA的参数,如下所示;

然后,选择USER32.MessageBoxA并右键单击并选择show call以获取程序集调用消息框的起点。在下图中,在作为对MessageBoxA的调用的004011CE指令之前,如下所述将4个参数压入堆栈。

选择位于004011C0地址的PUSH 10指令,在从00401055到00401063的跳转下面的文本区域中显示引用所选行的代码行,右键单击上图以打开快捷菜单,如下所示;

上下文菜单显示00401055和00401063都包含用于MessageBoxA的PUSH 10的JA。当当前日期晚于试用日期时,将使用JA跳转。然后,右键单击CPU窗口内的0x00401055指令,然后选择二进制文件,然后单击“用NOP填充”,如下所示;

此操作使用NOP填充0x00401055的所有相应指令(无操作),这可以防止程序触及错误代码路径,并有效擦除JA代码路径到到期代码路径,如下所示。

现在,按连字符(〜)返回PUSH 10,并按如下所示填充指令0x00401063的NOP。

最后,通过右键单击CPU窗口并单击“复制到可执行文件”,单击“所有修改”,以保存修改,如下所示。


最后,保存为最终的补丁二进制文件并执行,!Hurray !!……..祝贺消息…………未显示过期错误消息。我们成功击败了试用期限制。

概括

本文介绍了一种使用OllyDBG挑战复制保护措施质量的方法,并区分了使您的产品逐渐安全以防止未经批准的使用的方法。通过努力消除应用程序的重复安全性,我们可以熟练掌握保护机制的丰富知识。通过在商品可公开获取之前进行此测试,我们可以更改代码,以使重复安全性在其发布之前逐步得到解决。