dnSpy 逆向初探
- 0x01 前言
- 0x02 dnSpy简介
- 0x03 准备工作
- 0x04 动手逆向
- 0x05 总结
0x01 前言
今天拿到了一道逆向题目,但由于编写该程序的语言使用的是.NET,所以导致大家熟知的IDA pro和Ollydbg无法使用。于是我开始去网上搜索可以反编译.NET的工具,很幸运找到了我们今天的主角——dnSpy。
0x02 dnSpy简介
dnSpy是一款专门用于.NET程序的逆向编程工具,功能强大,开发人员可以通过dnSpy针对.NET程序的逆向反编译.NET代码,了解到它是如何工作的,以便学习或指导。
dnSpy软件针对NET语言的复杂性,提供了一个更好的替代库的文档,还能恢复丢失或不可用的源代码,解决定位性能问题,帮助开发人员分析依赖关系、检查混淆。
0x03 准备工作
程序是从Jarvis OJ上拿到的,是一道经典的Crackme题目。修改后缀名并解压缩后,成功拿到程序,发现是可运行的.exe程序,果断试运行一下,弹出输入注册码页面,题目提示FLAG就是注册码。
我们试着随便输入一串字符串,点击注册,提示注册失败:
由此可以推测,此处应该是一个比较语句,用于比较输入的字符串和真正的注册码之间的关系,如果不一致则弹出注册失败;如果一致,即获得flag也就是注册码,则弹出注册成功。flag一定是写在程序内部的某一段字符串,要想获得flag,必须对此程序进行逆向。
0x04 动手逆向
我们首先使用PEiD查看一下程序信息:
发现该程序是个.NET程序,所以我们需要寻找一个能够反编译.NET程序的工具。此时就需要用到dnSpy了,打开该程序,dnSpy会自动进行反编译,默认反编译为C#语言,也可以选择反编译为VB和IL语言,因为我觉得C#语言比较容易看懂,所以本片就用C#语言来讲解。程序打开后如下图所示:
这里可以看到一些关于程序的信息,比如程序所在位置、版本号、入口点和时间间隔等。我们在左侧程序集资源管理器中依次选择CrackMe—>CrackMe.exe—>-:
可以发现里面包含了5个程序段,在前面我们知道该程序里面肯定包含的一个字符串是“注册失败”,我们可以以此为突破口进行解题。首先打开第一个程序段,按下ctrl+f组合键,输入“注册失败”字符串进行查找,很幸运,在第一个程序段里面就成功匹配到了,如下图所示:
可以看到,此处的程序逻辑和我们前面的猜测一致,确实是一处字符串比较,不过稍有不同的是经过base64编码后的字符串比较。字符串b是程序中固定写好的,字符串a由函数名称可知,是把我们输入的注册码经过base64编码后而成的,然后比较字符串a和b,如果相同,则显示“注册成功”。由此可知,我们只需要把字符串b进行base64解码,即可得到flag。
经过分析后,打开base64在线解码工具,在文本框中输入字符串b,点击解码,即得到flag:
我们把解码得到的字符串作为注册码输入到程序中,成功弹出“注册成功”界面。
0x05 总结
1.做本道题,首先需要弄清楚该程序使用什么语言写的,IDA pro和ollydbg并不是万能的,它们不能将.NET程序反编译。这是我刚拿到这道题踩得一个坑,拿到题后想都不想的就拿IDA pro分析,结果做不出来,又拿ollydbg来分析,还是一样,到最后才想到使用PEiD查看程序信息,题目本身不难,但在这浪费了不少时间。
2.这道题让我涨了不少见识,知道了有dnSpy这么一个专门反编译.NET程序的工具,以前还从未使用过。
3.在拿到题目时,如果是可运行的程序,根据运行结果尝试着推断可能的程序结构,为后面逆向程序节省不少时间。