CRACKME.EXE的脱壳与序列号破解

发布时间 2023-06-20 13:18:59作者: Auion

查壳

通过在查壳软件PEiD v0.94中选择CRACKME.EXE文件打开即可查看该软件的所加壳的类型,查看结果如下所示:

此时所进行的普通扫描(Normal Scan),Normal Scan虽然速度快且方便,但只能检测出某些此前已知的加壳和压缩工具,对于新型加壳技术可能不准确或无法识别。

因此,为了确定软件是否加壳,还可以选择进行深度扫描(Deep Scan)和核心扫描(Hardcore Scan),其具体步骤为点击“->”符号,选择“Deep Scan”或“Hardcore Scan”进行进一步的扫描操作,此时则会如下图所示出显示其所加壳。

查找程序的原始入口(OEP)

根据跨段指令表寻找OEP

此时可以双击启动LordPE.EXE工具,然后在其右侧的按键中选择“PE Editor”点击后选择rebp.exe文件打开,此时即可再新窗口中查看到rebp.exe文件的相关信息,随后在其右侧的按键中选择“Sections”开启新窗口“Sections Table”,此时即可在该窗口中查看到CRACKME.EXE文件的各个区块的信息,其具体的操作步骤与查看结果如下图所示:

其中区块.pediy就是外壳,当对于一个文件加载器(Loader),运行时,各区块被映射到内存,现在程序的入口点地址为8000h。

运行OllyDbg,调试选项中“Event”将暂停点设置在主模块的入口点。打开CRACKME.EXE,程序会暂停在00408000h处。

随后点击F7键实现单步步入操作,直至程序执行至地址004080C8h处

随后点击F8键实现单步步过操作,直至程序运行至地址00408135h处

由上图中地址00413135处的汇编显示将会进行跳转操作,继续点击F8进行单步步过操作即可跳转至地址00460000h处,即第一条跨段跳转指令。

通过分析可知,从地址00460000h处开始的程序段的主要工作是还原各区块数据,初始化原程序。

继续按F8键直至程序执行至地址00460283h处,可以查看到如下图所示的汇编指令,该指令相当于“jump 401000”,即第二条跨段指令。

此时继续按F8键则会实现二次跳转,跳转后程序将运行至地址00401000h处,即如下所示:

PE文件被加壳后,外壳程序在运行时会进行初始化过程,其中有两次使用到跨段转移指令。第一次是从.pediy区块跳转到外壳程序的第二部分,即外壳程序代码的另一个段中。第二次是从外壳程序的第二部分跳转至目标程序本身的代码所处的区块,通常是PE文件中的.text段,即程序的主体代码段。

判断是否为OEP的关键,在于寻找到程序中第二次跳转发生的地方。由于外壳程序需要将目标程序装载入内存,因此第一次跳转并不是最终目标程序的OEP。而第二次跳转,则代表目标程序已经被正确加载,并开始执行程序正文。因此,通过定位第二次跳转的位置,就可以确认目标程序的OEP,即定位外壳程序第二次跳转后的位置即为目标程序的OEP,从而实现加壳程序的去除。

需要注意的是,不同的加壳器可能采用不同的跨段指令和跳转方式,因此针对不同的加壳器,需要采取相应的分析方法来确定OEP。同时,采用该方法需要具备汇编语言和调试技巧方面的知识。

抓取内存映像文件

一般的Dump软件都是根据MODULEENTRY32结构中的modBaseSize和modBaseAddr字段得到进程的映像大小和基址,再调用ReadProcessMemory来读取进程的数据。

读取成功后,一些Dump工具会检查 IMAGE DOS FIGNATURE和IMAGE_NT_SIGNATURE 是否完整,如果不完整则会将保存在磁盘上的原始文件的头部取出来替换到 Dump下来的数据文件,并将程序入口点修改为 OEP。

运行CRACKME.EXE和LordPE,在LordPE的选项(“Options”)中勾选“Full dump header from disk(完整转存,从磁盘粘贴文件头)”。

在进程窗口选择CRACKME.EXE,单击右键执行“correct ImageSzie(修正镜像大小)”命令即可。

镜像修正结果如下所示

随后点击右键执行“dump full(完整转存)命令”即可转去内存数据并保存在文件中。

如下图所示则表明转存完成

此时转存文件自动保存为dumped.exe文件,随后点击“Exit(退出)”退出LordPE。

PE文件(输入表)重建

运行ImportREC,在其列表框中选择CRACKME.EXE进程。

由上图可知此时OEP为00008000,但根据之前分析可知OEP为00001000,因此,需要对OEP的虚拟地址(RVA)进行修改操作,随后单击“IAT AutoSearch”按钮,使其自动检测IAT的偏移和大小,此时则会弹出如下对话框。

如上图所示则表明所输入的OEP已经发挥作用了。此时则需要单击“Get Imports”按钮使其分析IAT结构得到基本信息。

单击“Fix Dump”按钮选择刚刚抓取的dumped.exe映像文件。此时则会自动创建一个dumped_.exe文件(脱壳后的文件),该文件可正常运行。

双击启动LordPE.EXE工具,然后在其右侧的按键中选择“PE Editor”点击后选择dumped_.exe文件打开,此时即可再新窗口中查看到dumped_.exe文件的相关信息,随后在其右侧的按键中选择“Sections”开启新窗口“Sections Table”,此时即可在该窗口中查看到dumped_.exe文件的各个区块的信息,即如下所示:

由上图可知,脱壳后的区块信息中新增了.mackt区块。软件脱壳结束。

序列号破解

直接双击运行脱壳后的软件dumped_.exe后会进入到如下界面。

依次点击“File”和“Exit”则会直接退出该程序。

依次点击“File”和“About”则会出现如下弹窗。

依次点击“File”和“Register”则会出现如下弹窗。

在“Name”和“Serial”的输入框中依次输入如下图所示内容。

点击“OK”后出现如下弹窗表明输入的用户名与序列号不正确。

综上所述,可以直接通过输入错误的用户名及序列号后出现的提示错误的弹窗为入口进行分析。

在OllyDBG中打开CRACKME.EXE,此时汇编代码的起始地址为00401000h,此时在反汇编窗口右键打开菜单栏,在其中找到“Search for”后点击“All referenced text strings”。

随后则会打开交叉参考字符串窗口,在其中可以直接看到存在两种情况的错误提醒。

 

双击第一个错误提示窗口的地址跳转至其相应的地址处。

根据上述地址的前后的汇编代码进行分析,其中00401228h至00401245h这一系列的地址即为注册机的汇编代码。

从上述汇编代码可知,上述汇编中调用了三个函数,这三个函数的起始地址分别为0040137E、004013D8、00401362。

call 0040137E函数对应的汇编代码如下所示。

call 004013D8函数对应的汇编代码如下所示。

call 00401362函数对应的汇编代码如下所示。

根据对上述汇编代码的分析可知:根据用户名生成序列号的过程,首先需要判断输入的用户名的字符是否为大写字母,若为小写字母则需要先将小写字母(njh)转换成大写字母(NJH),随后则将大写字母字符所对应的ASCII的值(十进制数:78、74、72;十六进制数:4E、4A、48)相加(十进制:78+74+72=224),随后将相加的值先与十六进制数0x5678进行异或操作(十进制:224 ^ 0x5678 = 224 ^ 22136 = 22168),随后再将上述计算结果与0x1234进行异或操作(十进制:55082 ^ 0x1234 = 55082 ^ 4660 = 17580)得到序列号17580。

此时双击运行上述脱壳后的程序,依次点击“File”和“Register”进入到注册弹窗,并在弹窗(Register)中依次输入“njh”和“17580”后点击“OK”按钮,此时反馈弹窗显示如下。

由上图可知上述分析所得到的用户名对应的序列号正确,即可以正常实现注册操作。

随后,综合上述分析可以编写得到根据用户名获取序列号的的C语言程序,其具体C语言程序如下图所示。

此时运行C语言代码的运行结果如下所示。

此时双击dumped_.exe后依次点击“File”和“Register”进入注册界面,依次输入如下图所示的用户名及序列号。

 

点击“OK”后则会显示如下弹窗,此时表明所输入的用户名与序列号处于匹配状态,即注册成功。

备注:CRACKME.EXE软件