深入理解Linux下C语言的反汇编原理 (linux c 反汇编)

反汇编是一种将机器码转换为汇编代码的过程。在Linux下使用反汇编工具进行分析,可以帮助程序员理解系统调用以及程序的执行过程。而C语言作为系统编程的主流语言,深入理解其反汇编原理则有助于编写更加高效和可靠的程序。

1. 反汇编的基础概念

在Linux下,反汇编工具主要有objdump和gdb两种。objdump是一种命令行工具,可以查看程序的汇编语言,但不能进行调试;gdb是一种调试工具,可以通过反汇编对程序进行调试。

反汇编的基本原理就是将二进制文件转换为汇编代码。汇编代码是一种类似于C语言的低级语言,它更接近于机器语言。反汇编的过程可以将二进制代码转换为汇编代码,使程序员能够更好地理解程序的执行过程。

2. C语言与反汇编的关系

C语言是一种高级编程语言,其代码可以通过编译器转换为机器语言。反汇编可以将机器语言转换为汇编代码,因此C语言代码可以通过反汇编工具转换为相关的汇编代码。通过反汇编,程序员可以理解C语言代码的实际执行过程以及其与机器指令的关系。

例如,下面是一个简单的C语言程序:

“`

#include

int mn() {

printf(“Hello, World!”);

return 0;

}

“`

通过反汇编,可以将其转换为以下汇编代码:

“`

0x0000000000400536 : push %rbp

0x0000000000400537 : mov %rsp,%rbp

0x000000000040053a : mov $0x4005c4,%edi

0x000000000040053f : mov $0x0,%eax

0x0000000000400544 : callq 0x400430

0x0000000000400549 : mov $0x0,%eax

0x000000000040054e : pop %rbp

0x000000000040054f : retq

“`

可以看到,程序的执行流程由汇编代码表示。通过理解程序的反汇编结果,程序员可以更好地优化其代码,提高程序的性能。

3. 深入理解反汇编的目的

除了帮助程序员理解程序的执行过程,反汇编还有其他重要的作用。

在安全领域中,反汇编可以用于逆向工程,即对闭源软件进行分析。逆向工程可以帮助安全专家检测软件漏洞并进行修补,从而确保软件的安全性。

此外,反汇编还可以用于学习和探索。通过反汇编Linux操作系统的核心部件,比如内核和驱动程序,可以更好地理解操作系统的内部机制和工作原理。通过深入理解操作系统的反汇编,开发人员可以编写更加高效且卓越的系统程序。

相关问题拓展阅读:

用c-free5.0编译一个C程序后,如何用c-free查看这个程序的反汇编代码呢?像OD一样查看

c-free默认的调试器是gdb。可以这样查看:

1.给程序下断点。

2.点击debug菜单下的start debug。程序停在断点处。

3.点击debug菜单雹兄最下边的Console.弹出gdb的窗口。

4.在此窗口最下边的命令行编辑框输入:disassemble ,点击“Enter”按钮。游肆逗就会看到反汇编的神卖代码。

其实就是gdb的运用。

更详细的信息:

什么软件能将C语言的执行文件反汇编为汇编源代码

用一个反汇编调试器即可。

IDA或者OllyDbg,方便直观,当然VC也有自带的调试器,不过很麻烦,不如IDA或者OD方便。

补充:

DLL 属于可执行文件中的一类,又称为动态链接库,不能直接用DEBUG加载,一般由应用程序因使用该库中的函数,而由操作系统在应用程序加载的同时被加载入特定地址,这个地址一般是DLL在链接时指定的。当DLL被加载到运行空间,根据输出函数表,可以得到各个函数的入口地址,然后用DEBUG在各个入口下断点,调用该函数时DEBUG将跟踪进入该函数,从而实现反汇编。

反汇编属于逆向工程,逆向工程的主要手段有两大类,其中一类是动态分析,另一类是静态分析。

前面提到的方法属于动态分析,由DEBUG实现反汇编,该方法不容易得到完整的代码,一般只能形成一段一段独立分散的代码,同时由于DEBUG的局限性,反汇编的代码质量多不高,生成的代码不能直接使用,原因在于DLL在加载时若没有加载到指定地址空间,操作系统将对代码进行重定向,所以DEBUG只能得到重定向后的代码,这类代码必须修改每一个重定向点,才能形成可执行代码。作为WINDOWS32位操作系统, OLDBG是最为优秀的调试、跟踪、反汇编工具,多窗口运行搜戚和,可以方便的通过窗口操作完成各类动作,而不需要像一般DEBUG那样由命令行来完成,OLDBG还有许多一般调试器不具备的功能,同时由于每一代高手不断的修改,使其具有多种功能,同时带来的就世盯是混乱,谁也不知道有多少版本,谁也不清楚每个版本到底增加了什么功能,但就这样,也是瑕不掩疵, OLDBG任然是DEBUG中最强大,更好使用的。

静态分析和动态分析不同,静态分析直接打开原程序,加载而不运行,然后直接分析加载的代码。目前静态分析工具,最强大的当属IDA,IDA支持几乎所有种类的汇编语言。

IDA加载应用程序有许多选项,可以选择完整的加载整个程序,也可以选择加载程序的某个块,一般可选择的是否加载文件头、资源表、输入表、输出表等等。

IDA还支持调试,也就是说,当你在进行反汇编过程时,可以直接使用IDA来调试跟踪,以分析代码的动态执行情况,不过就动态跟踪来说,OLDBG更为强大。

IDA反汇编的正确率和代码的复杂程度有关,对于正规开发的代码仔袭,尤其是如果能够获得源程序的调试文件,即所谓的PDB文件,IDA可以读取PDB文件中的信息,使得反汇编的效率和准确度大为提高,生成的代码甚至比源代码易读。IDA将反汇编生成的结果存入IDB文件中。当你确认反汇编的结果达到你的要求,可以让IDA输出汇编源代码,IDA也提供其他格式的输出,例如HTML文件,便于用户阅读。楼主主要是用于分析DLL文件,一般来说这类文件更适合做静态分析,所以推荐使用IDA来进行。

IDA对于分析那些加壳或含有大量花指令、混淆代码、垃圾代码的程序,反汇编的正确率会大为下降,因为IDA无法正确的确认当期位置上的数值是属于代码,还是属于数据,是普通C字符,还是DELPHI的字符串,还是UNICODE字符串,是结构数据还是数组还是类表(DELPHI生成的代码中含有大量的类表)等等。遇到这种情况,就需要使用者掌握许多技巧,例如可以通过使用者对当前数据的认识,指导IDA如何处理当前的数据。对于大批量的,具有某些规律的数据,IDA还提供了脚本语言(文件尾位idc),通过对脚本的执行来指导IDA如何进行反汇编。对于更为复杂的情况,例如程序是自解压运行的,这时IDA就没有任何能力来进行正确的分析,通常都会用OLDBG动态跟踪,等程序完成自解压后从内存中将解压后的代码完整的挖下来形成文件,再由IDA进行静态分析。

对于成功进行反汇编的代码,IDA根据代码的入口、调用、转移等指令,可以为使用者提供各种格式的程序的流程图,IDA提供许多格式由用户选择,便于用户理解程序的结构。

汇编语言的科学定义,其实就是介于机器码(各种01)和高级语言(如C)之间的一种语言。你用C语言写一段程序,其实要在机器上运行的话,机器是不懂的,要经过编译器、汇编器编译,变成汇编,最终再变成机器码,机器根据这些机器码的01可以控制硬件电路完成你程序想执行的操作。

可以使用Linux下的objdump命令来反汇编。

常用命令:

objdump -x obj:以某种分类信息的形式把目标文件的数据组成输出;肆渣

objdump -t obj:输出目标文件的符号表

objdump -h obj:输出目标文件的所有段概括

objdump -j ./text/.data -S obj:输出指定段的信息(反汇编源代码)

objdump -S obj:输出目标文件的符号表,当gcc -g时打印更明显迟雀

 objdump -j .text -Sl stack1 | more

-S 尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。

-l 用文件名和行号码雹早标注相应的目标代码,仅仅和-d、-D或者-r一起使用

使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。

-j name 仅仅显示指定section的信息

DOS,,系统下的DEBUG调试程序,,,

运行后,,用参数 -U

如:

-U 0B2A:

行动后就会把这地址里面的东西换成汇编了,伏羡行,,缺哗

不过学过点汇编更好,,

另外DEBUG还有很多参数可以用,自己找找吧,网上应该很多,派枯,

用一个反汇编调试器就行了

IDA或者OllyDbg,方便直观伏唤察唤,当然VC也有自带的调试器,不过很麻缺没凯烦,不如IDA或者OD方便

关于linux c 反汇编的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 深入理解Linux下C语言的反汇编原理 (linux c 反汇编)