Reverse – CRACK ME
0x00 前言
- 注意:本题目在10月28日晚上的信息安全部培训中当作例子进行了讲解,现提供完整解题思路。
- 我在比赛中没有做这道题(那时候忙着带军训),现在补上一些分析。
0x01 环境准备
- Windows系统电脑/虚拟机
- IDA Pro 7.0,下载地址(校园网):CSTA文件服务器 – 逆向资源区
- 需要管理员帐户,路径不能有中文,建议登录到Administrator用户进行(开启方法:控制面板-计算机管理-用户和组-用户-Administrator-取消“帐户已禁用”-设置密码)。
0x02 题目概况
- 题目要求:获得注册码
- 题目提供文件:zip文件,解压后仅获得exe文件一个
- 需要的前序知识:
- 了解Windows GUI编程简单基础
- 了解Intel 80×86处理器的寄存器和汇编指令
- 题目难度(1-5):大一 5.0,大二 4.0,大三及以上 2.0。
0x03 静态分析
- 首先使用32位的IDA打开exe程序,按照默认的配置即可。
- IDA分析完成后,主界面为如下状态:
- 此时选中的是WinMain方法,WinMain方法一般是微软MFC程序或者.NET程序的主方法。但是要注意对于GUI应用程序来说,主方法的目的只有一个,那就是加载应用程序的“单例”,开始进行主运行循环(Main RunLoop)*。所以我们没办法在主运行循环开始之前寻找所需的代码。
主运行循环:主运行循环(Main RunLoop)是iOS应用开发中的概念,因为实际上大多数GUI系统的实现都大体相同,所以这里借用iOS的概念进行说明。一般而言,在GUI应用程序启动的时候,都会加载一个所谓的“应用程序单例”,在iOS中这个类的名字叫
UIApplication
,它的作用就是为了支撑整个GUI。在GUI运行过程中,实际上是出于一个永不停止的循环中。程序反复等待用户的操作,比如点击了按钮或者输入了文本。在用户做了相应的操作之后,GUI管理器(在iOS中一般是UIControl
)会向特定的对象发送消息,用户只需要编写一些回调方法,就可以实现在特定的条件下执行特定的代码。例如在用户点击某个按钮的时候进行一些数据的处理。据我所知,iOS、Android、Java AWT/Swing都是这样的工作模式(实际上可能绝大多数的GUI实现都是这样)。
- 该程序在点击注册按钮之后会弹出对话框,考虑这个过程,可能注册码校验的过程在点击注册按钮的回调方法中。
- 所以本题的初步思路可以用字符串查找的方法,查找的字符串为MessageBox,然后再向前定位或许就可以找到关键代码进行分析。
在MFC应用程序设计中,
MessageBox
类可以用于显示一个简单的对话框窗口,而不是一个大型的窗口(这种窗口在Java中称为JFrame
,我没做过MFC的开发,不太清楚在MFC中叫什么),其特点是要依赖于一个特定的“大型窗口”才可以工作。本例中弹出的“哎,注册码错了,你得换个新的呦!”显然属于MessageBox
,而显示MessageBox
一定在做完了注册码校验之后,故向前定位或许就可以找到关键代码。
0x04 通过动态调试定位关键代码
- 使用字符串搜索功能进行字符串查找,查找内容为
MessageBox
- 找到的第一处位于
sub_4016E0
子程序中,按下F5
按钮进行反编译,获得伪代码。 - 在return语句之前任意一句下断点,然后选择调试程序为Local Windows debuger,启动这个程序。然后点击注册按钮,程序并未触发断点。
- 这说明我们寻找到的这个
MessageBox
不是当前的执行逻辑可以到达的,那我们就寻找下一个,下一个MessageBox
位于子程序sub_401720
中。 - 按照和之前一样的方法,按
F5
反编译然后再下断点,执行程序。 - 这次程序在断点处停住了,说明我们可能找到了关键位置的后面,现在再向前定位即可。我们将子程序
sub_401720
更名为callFailedMessageBox
- 然后我们再在程序中搜索
callFailedMessageBox
,目的是定位到调用子程序的地方,这就是向前定位,这次我们定位到了loc_40161F
标号处。 - 这段代码是没办法进行反汇编的,原因是函数栈不平。但是这里我们可以直接分析汇编代码。我们将
loc_40161F
标号改为checkFailedLabel
。然后看右侧的注释CODE XREF
,它代表了上面代码中跳转到此标号的位置,IDA提供了便捷功能可以快速到达此位置,我们双击注释即可,其实跳转的地方就在上方。 - 上面的代码就是我们要分析的关键代码了,虽然是汇编语言,但是有一定汇编语言的知识的话也是不难看懂的。
0x05 注册逻辑的分析
- 这部分我过两天再补充,有些同学可能还需要自己做一下。