接上篇Windows系统C/C++逆向分析。
今天主要介绍一下.NET C#程序的逆向分析过程。众所周知,C#语言是对JAVA语言系统的升华。汇集JAVA面向对象的思想,同时也将微软传统MSVC/VC++的优点发挥的淋漓尽致。跟JAVA类似,C#也是一种解释型语言,编译完同样会生成字节码文件,在程序运行时,借助它自己的解释器进行实时解释运行。C#的字节码中间语言称为IL语言,其解释器一般是指CLR,类比于JAVA的JVM。当然,C#的解释器不限于CLR,现阶段开源软件Mono也实现了一个C#解释器。而且,Mono不仅能运行在Windows上,还能运行在Linux上。不过Mono本来就是为了在Linux上运行.NET C#。
C#使用csc进行编译,编译生成的可执行文件也是exe格式文件。但不同于C/C++编译出来的程序,使用dumpbin反编译C#的exe文件,并不能帮助我们分析程序。因为C#语言系统在C/C++之上又抽象了一层,.text代码段虽然还能解析出部分C语言代码段,但主体逻辑都存储在IL中。所以,我们需要工具进一步来分析exe文件中的IL代码块。然后进一步解析出C#源码。
介绍一些.NET C#的逆向工具:
ildasm:将从exe提取出IL代码
ilasm:将IL代码编译成exe可执行文件
dotpeek:Jetbrains家族的用于反编译C#程序的工具,也可反编译为IL
关于ilasm和ildasm一般在安装visual studio时,会自动安装。当然,你得是.NET C#开发。ilasm工具一般跟.net framework在同一路径下,一般是C:\Windows\Microsoft.NET\Framework对应版本下。ildasm工具一般在C:\Program Files (x86)\Microsoft SDKs\Windows对应版本下。
将exe反编译成IL字节码命令:
ildasm program.exe /output:program.il
将IL字节码再次编译成exe命令:
ilasm program.il /exe /output:program.modified.exe
当然,我们逆向有时是为了修改程序,改变它的一些行为,所以会在IL层次进行修改,改完后在恢复成exe文件。关于上述命令行工具的更多功能,请参考微软官方的文档:https://docs.microsoft.com/en-us/dotnet/framework/tools/
另外,只要涉及到IL中间语言的程序,都可以使用该工具分析。
语言之间的转化过程大致如上图。当然,有兴趣的也可以研究一下C#与IL的互相转化。今天暂且介绍这么多!