逆向工程学习日志 01

逆向 #逆向工程

逆向工程是什么?

逆向工程是一个比较通用的术语,在工业和软件领域都能看到它的身影,它指的是对已经生产出来的产品或已经编译过的可执行文件进行分析,进而得知其运行原理和生产流程或可能的源代码的一项技术。

本博客主要是分享软件逆向工程。

汇编和反汇编

汇编语言

所有开发出来的程序最终都要从源代码被编译成可执行文件,以机器码的形式被计算机执行。但是在现代编程语言和机器码之间存在着汇编语言这一层中间语言,它比机器语言高级,但是却比现代编程语言低级,而这样的它就变成了我们分析一个可执行文件的源代码的工具了。

gcc反汇编

我们以c语言为例,开发一个c语言程序,我们最终把它编译成对应平台的可执行文件,现在假设我们有一个叫作program.c的源代码文件,它的内容如下:

int main()
{
    return 0;
}

在Linux下的话将其编译成可执行文件program需要我们以下命令:

gcc program.c -o program

源代码文件如何变成可执行文件我们暂且不讲,我们来讲讲如何获得我们上面讲到的这个程序的汇编语言代码。

我们可以用一个叫作objdump的工具来反汇编编译出来的程序。通过以下命令即可:

objdump -d program

然后我们会获得一连串的汇编命令,像这样从一个可执行文件中分析出汇编代码就叫作反汇编,根据编译器和平台的不同反汇编出来的汇编代码也会不一样,这里就不赘述了。

反编译

反编译类似于反汇编,但是从可执行文件中分析出来的是高级语言的代码,但是一般反编译是不够准确的,因为编译器在将源代码编译成可执行文件时会做诸多优化,所以反编译分析出来的高级语言代码不一定就是源代码。

对于C语言这种纯编译类型的语言编译出来的程序来说,反编译的难度是非常高的,因为诸如gcc等编译器在编译时会进行自动优化。但对于像Java的class文件和C#的IL这些用于JIT运行的中间代码来说,反编译相对比较简单,因为语言VM的opcode相比CPU指令来说还是简单许多的。

在Windows上,我们可以很容易的使用dnspy或者ilspy来反编译dll中的C# IL。