目录
在软件安全和逆向工程领域,深入理解软件的运行机制并进行破解分析,不仅能帮助我们更好地掌握程序的工作原理,也对安全防护有着重要意义。今天,就带大家通过一个实际案例,来学习软件逆向分析与破解的过程。
一、准备工作
我们本次的目标软件是 “correct me”(假设这是一款有试用期限和激活限制的软件),在开始分析前,要确保使用的是同一版本软件,这里可以通过 MD5 值来校验,它就像软件的 “指纹”,即使软件名称被随意修改,MD5 值也固定不变。同时,相关工具(如 study pee、ida 32 等)也已提前发送给大家,我们会在虚拟机中操作,避免因操作破解软件而导致主机感染病毒。
二、初步分析
- 运行软件:在虚拟机中直接运行 “correct me” 程序,发现提示 “out of date”,要求购买凭证,这是常见的软件试用过期提示,意味着我们需要找到绕过这个验证的方法。
- 查看软件信息:使用 study pee 软件打开目标程序,获取到两个关键信息:程序是 32 位的且没有加壳。这对于后续分析非常有利,因为 32 位程序的结构相对简单,没有加壳意味着无需先处理复杂的壳保护机制,我们可以直接对程序代码进行分析。
- 用 IDA 32 打开程序:用 ida 32 打开 “correct me” 程序,ida 会自动将入口点命名为 start,点击 start 进入程序代码区。此时,面对复杂的程序代码,不要逐句查看,而应先从整体把握程序的结构和逻辑。
三、程序流程分析与破解
- 整体流程梳理:观察程序代码,发现存在多个分支。有的分支会提示 “valuation period out of time”(试用期限已过)、“purchase new license”(购买新许可证),这就是我们运行程序时看到的过期提示;还有的分支会提示 “kefile is not value”(文件无效)或 “you really did it congratulate”(成功提示)。由此可知,程序主要是在进行各种验证,只有通过所有验证才能正常使用软件。
- 解决 “试用过期” 问题:直接运行程序出现过期提示,说明程序运行时会跳转到提示过期的分支。分析该分支附近代码,发现程序会检查是否存在名为 “kefile.date” 的文件。代码中使用
push offset file name
将文件名 “kefile.date” 入栈,然后调用create file
函数进行文件创建或检查操作。根据判断条件,如果没有找到该文件,就会提示过期。所以,我们在程序所在目录新建一个名为 “kefile.date” 的文本文件。 - 解决 “文件无效” 问题:新建文件后再次运行程序,提示 “kefile is not valid sorry”,这表明程序在检查文件内容。进一步分析代码,发现程序在读取文件时对文件内容有一系列验证。
- 文件读取长度验证:程序使用
push
等指令准备读取文件,如push 4646h
(对应字符 “FF”,这里是为读取文件做的参数设置),然后调用read file refer
函数读取文件。读取后会检查读取的字节数,它期望读取 15 个字节,如果读取成功,相关寄存器(如 eax)不为零,否则为零并跳转到错误分支。所以,我们需要确保文件内容足够长,以满足读取要求。 - 文件内容字符验证:除了长度验证,程序还会对文件内容进行字符验证。它会从文件中读取字符与 “47h”(即字符 “G”)进行比较,如果相等,某个计数器(esi)就会自增。最后会判断 esi 的值是否大于等于 8,若满足则验证通过,否则提示文件无效。因此,我们在 “kefile.date” 文件中输入足够数量(至少 8 个)的 “G” 字符。再次运行程序,成功得到 “you really did it congratulate” 的提示,至此程序破解成功。
- 文件读取长度验证:程序使用
四、动态分析(可选步骤,用于深入理解)
为了更直观地理解程序运行过程,我们可以进行动态分析。ida 虽然主要是静态分析软件,但它的动态分析功能也很强大。
- 设置断点:在关键位置(如文件检查、读取验证等代码处)设置断点,比如在检查 “kefile.date” 文件是否存在的代码处设置断点。
- 选择调试器:因为是 Windows 程序,我们选择 “local windows debug” 进行调试。点击执行后,程序会运行到断点处。
- 单步执行:使用快捷键(如 F7 进入子函数、F8 不进入子函数单步执行)逐行执行代码,观察程序的执行流程、寄存器值的变化以及程序的跳转情况。例如,在验证文件内容字符时,可以看到 esi 的值随着读取到 “G” 字符而自增。通过动态分析,我们可以更深入地了解程序的运行机制,对于复杂的验证逻辑有更清晰的认识。
通过以上步骤,我们成功破解了 “correct me” 软件,构造出了符合其验证要求的文件(文件名 “kefile.date”,文件内容包含至少 8 个 “G” 字符)。这是一种常见的软件破解方法,即通过分析程序的验证逻辑,构造满足验证条件的文件来绕过限制。希望大家通过这个案例,对软件逆向分析有更深入的理解,在合法合规的前提下进行技术研究和学习。