目录
逆向工程之逆向分析实战(一):破解 “crack me” 程序
在逆向工程的实践中,通过实际案例来分析和破解程序是提升技能的关键。本次实战我们将以 “crack me” 程序为例,深入了解逆向分析的步骤和方法。
一、实战内容介绍
(一)目标
本次逆向分析实战的目标是破解 “crack me” 程序。这个程序运行时会提示过期(Out of date),需要购买凭证,我们要找出绕过这个限制并使程序正常运行的方法。
(二)原理
逆向分析是从可执行程序出发,通过各种工具和技术,分析程序的结构、逻辑和算法,以达到理解程序功能和可能的修改途径的目的。在这个过程中,我们利用程序的一些特性,如文件的 MD5 值来确保分析的是同一个程序版本,通过分析程序在运行过程中的报错信息、分支跳转等行为,结合反汇编工具查看程序的汇编代码,逐步弄清楚程序的验证机制,从而找到破解的方法。
二、逆向分析步骤
(一)准备工作
- 获取程序和工具
- 我们已经获取了 “crack me” 程序(.exe 文件),其 MD5 值用于确认版本一致性,因为程序名称可重命名,但 MD5 值固定。
- 同时,老师已经将本次分析所需的工具发给大家,我们要将程序和工具都放在虚拟机中进行操作,这样可以防止因程序可能存在的恶意代码或病毒而对主机造成损害。
(二)初步运行程序
在虚拟机中直接运行 “crack me” 程序,会发现它提示 “Out of date”,要求购买凭证,这是我们破解的起点。这一步不需要使用额外的命令。
(三)使用 study pe 分析程序信息
- 工具介绍与命令
使用 study pe 软件来查看程序信息。通过 “File” -> “Open”(不同软件可能操作不同,这里假设类似)打开 “crack me.exe” 程序。 - 分析结果
- 发现程序是 32 位的,并且没有加壳。这两个信息对于后续的分析很重要,没有加壳意味着我们可以更直接地对程序进行反汇编分析。
(四)使用 IDA32 进行反汇编分析
- 工具介绍与命令
启动 IDA32,通过 “File” -> “Open” 打开 “crack me.exe” 程序。IDA32 会自动对程序进行分析,完成后显示反汇编后的代码。 - 整体把握程序结构
- IDA32 将程序入口点自动命名为 start,点击 start 进入程序执行的起点。我们要先从总体上把握程序结构,不要一开始就陷入具体语句的分析。观察程序的分支情况,发现程序有多个分支,不同的分支会导致不同的结果,如提示错误信息或执行成功。
- 例如,直接运行程序显示 “Out of date” 相关信息,这表明在程序开始阶段的某个分支判断中出现了这种情况,我们需要分析这个跳转附近的代码,了解其跳转条件。
(五)分析程序分支与关键代码
- 分析第一次跳转相关代码
- 在代码中发现涉及 “KEFILE” 相关的操作。看到有 “push offset File name”,其中 “file name” 被识别为字符串 “k file.date”,然后调用 “create file” 函数,接着将结果与某个值比较,如果满足条件则跳转。这意味着程序在检查是否存在 “k file.date” 文件。
- 我们在 “crack me” 程序所在目录新建一个名为 “k file.date” 的文本文件,再次运行程序,发现出现新的错误 “key file is not valid sorry”,这表明程序通过了文件存在的检查,但对文件内容有进一步要求。
- 深入分析后续分支与条件判断
- 继续观察代码,发现后续还有多个分支和条件判断。比如有读取 “k file.date” 文件内容的操作,涉及到读取字节数的比较,如读取 15 个字节(通过 “push 40646H” 等操作判断,这里 40646H 与字符‘F’相关,结合读取操作可知要读取一定数量的字节),以及读取字符个数与十六进制 “10H”(十进制为 16)的比较。如果读取字节数不足或字符个数小于 16,则会跳转到错误提示分支。
- 还有比较某个值(如 ESI 的值)与 8 的大小,如果小于 8 则跳转到错误分支,如果大于等于 8 则可能跳转到成功分支。这一系列条件判断表明程序对 “k file.date” 文件内容有严格要求。
(六)确定破解方法
通过对代码的分析,我们发现可以通过在 “k file.date” 文件中输入特定内容来绕过验证。具体来说,要输入足够多的字符(大于等于 16 个),并且其中‘G’的数量要大于等于 8。这样,程序在执行过程中就能通过各个条件判断,最终执行成功。
(七)动态分析验证(使用 IDA 的动态分析功能)
- 设置断点与调试准备
- 虽然 IDA 主要是静态分析工具,但它也具备强大的动态分析能力。我们可以在程序中设置断点来观察程序在运行过程中的状态。例如,当我们修改 “k file.date” 文件内容或者没有该文件时,可以在关键代码处设置断点,如在判断文件是否存在的代码处(“create file” 相关代码附近),使用 IDA 的 “Add breakpoint” 功能。
- 对于这个 Windows 程序,选择 “local windows debug” 作为分析器,然后点击执行(“Yes”),程序会运行到断点处。
- 单步执行与观察状态
- 在断点处,可以使用快捷键 F7(步进进入此函数)或 F8(不进入此函数)进行单步执行。在执行过程中,可以查看寄存器的值、栈的状态等信息。例如,可以看到 ESI 等寄存器的值在程序运行过程中的变化,从而更好地理解程序对文件内容的验证过程。通过动态分析,进一步验证了我们之前通过静态分析得出的破解方法的正确性。
通过以上步骤,我们完成了对 “crack me” 程序的逆向分析和破解,这种实战过程对于理解逆向工程中的分析方法和技巧非常有帮助,希望大家可以通过类似的练习不断提升逆向分析能力。