首页 » 智能 » 为什么要反汇编_反汇编_文件

为什么要反汇编_反汇编_文件

admin 2024-11-28 03:23:42 0

扫一扫用手机浏览

文章目录 [+]

反汇编顾名思义便是汇编的逆过程,将二进制文件反汇编成汇编代码。
arm-linux-objdump是交叉编译工具链里的一个工具,专门用来反汇编的,将二进制代码反汇编成汇编代码来查看。

为什么要反汇编

为什么要反汇编_反汇编_文件 为什么要反汇编_反汇编_文件 智能

1.逆向破解。
将可实行程序反汇编得到汇编代码,再根据汇编代码推理出全体程序的逻辑。
这个不是一样平常人能做的,能看懂大量汇编措辞写的程序都很困难了,更别说反推别人的代码逻辑。

为什么要反汇编_反汇编_文件 为什么要反汇编_反汇编_文件 智能
(图片来自网络侵删)

2.调试程序时可以帮助我们理解并检测天生的可实行程序是否正常,尤其是在理解链接脚本和链接地址等观点时。

3.C措辞的源代码编译链接天生的可实行文件再反汇编,可以帮助我们理解C措辞和汇编措辞的对应关系,有助于深入理解C措辞。

反汇编文件的天生和解读

反汇编文件的天生:

上面是一个大略的Makefile,功能是把源文件.S和.c先编译成.o文件,再把.o文件链接成.elf的可实行文件。
arm-linux-objdump -D led.elf > led_elf.dis是将led.elf反汇编成ed_elf.dis。

源文件:star.s是一个汇编文件

star.s是一个学习S5PV210开拓板时点亮LED的汇编程序,由开始、点亮、延时和去世循环组成,在这里并不关注详细实现的功能,重点是和反汇编天生的文件进行对照。

得到的反汇编文件:led_elf.dis

解析:

1.第一行:led.elf: file format elf32-littlearm。
表明此汇编程序是由led.elf天生,程序是32的小端模式。

2.00000000 <_start>:前面的00000000是标号的地址,<_start>是标号,对应start.s的_start标号。
实在标号就相称于C措辞中的函数名,在C措辞中也可以用函数名代表函数的首地址,在这里可以得到印证。
反汇编的标号便是由汇编文件得来的,这样可以方便我们找到反汇编文件和汇编文件对应的部分。

3.全体反汇编文件分为三列,分别对应:指令地址、指令机器码、指令机器码反汇编到的指令。

我们在这里对汇编文件的前几句进行解读:

1.ldr r1, [pc, #112]:此句对应于汇编文件的ldr r1, =0xE0200240。
功能是将0xE0200240存到r1寄存器中。
[pc, #112]代表pc+70地址处的数据(#112是十进制),此时PC指向的是当前地址的下两级,便是pc = 0 + 8,于是pc + 70 = 78。
78地址处存放的数据便是e0200240,刚好即是汇编语句要加载的数据0xE0200240。
以是ldr r1, [pc, #112]和ldr r1, =0xE0200240实现的是同样的功能。

2.ldr r0, [pc, #112]对应于汇编文件的ldr r0, =0x00111000。
解读的办法和上面同等,只是要把稳此时PC= 4 + 8。

3. str r0, [r1]语句汇编语句和反汇编语句是同等的。

4. mov r2, #4096对应于汇编的mov r2, #0x1000,两者是相同的,十进制的4096即是十六进制的0x1000。

补充:1.PC指向当前地址的前两级是由于流水线的存在,不同型号的ARM芯片流水线的级数是不同的,但是在反汇编文件里为了统一,都是按照3级流水线处理。

2.为什么向寄存器加载数据,有的是直接加载(mov r2, #4096),有的要用相对寻址的办法加载(ldr r1, [pc, #112])?这里涉及到合法立即数和造孽立即数,大略来书便是数据太大,一条语句的数据部分表达不了,于是就将要加载的数据放在某个地址处,要用到的时候就去该地址处取,此时的ldr也是伪指令。

致芯科技有限公司不但可以直接破解芯片,提取芯片程序烧录代码,做到一比一复制,而且可以供应芯片程序反汇编,用以修 改优化程序,其余我们还给客户供应电子产品PCB抄板,PCB设计一条龙式产品做事(PCB克隆、改板、事理图及BOM单制作、PCB生 产、样机制作调试、成品加工一条龙做事型企业)。
为那些专注产品市场推广的客户节省大量开拓韶光和开拓用度,帮助客户永久在产 品市场上具有领先上风,为客户创造代价。
欢迎来电详询!

标签:

相关文章