arm linux 反汇编工具

2012-03-27 23:37:00 weixin_30613727 阅读数 36

http://hi.baidu.com/jiangboss/blog/item/d00582f3544be3c80a46e0f5.html

这里就介绍三个好了,也是非常常用的。

1、AXD

      ADS自带的调试工具,自然也可以当作反汇编器来用。不过,说实话,界面还是比较土的。

2、IDA Pro

      如果有ARM反汇编模块,IDA Pro可以说是最好的反汇编工具了。可以自定义函数、记录、跳转。等等,十分优秀。

3、fromelf

      用ADS的人,如果没用过fromelf,说明只是个初级水平。这个命令行工具十分强大。反汇编只是其中沧海一粟而已。和linux下的二进制工具链中的readelf差不多的用法。但是功能远比readelf丰富。

转载于:https://www.cnblogs.com/androidme/archive/2012/03/27/2420437.html

2015-11-22 12:08:32 junzhang1122 阅读数 1696

最近在帮别人反汇编一个pos机的bin文件,调试的方法如下。

使用arm-linux 工具链里面的arm-linux-objdump 就能反汇编

cd到bin文件所在的目录, 在命令行下输入:

arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm

参数:
-D 反编译所有代码
-m 主机类型, arm
-b 文件格式, binary

对于ELF格式的文件只要一个-D参数即可

就可以把xxx.bin反汇编到xxx.asm文件

2017-10-28 10:09:14 dhauwd 阅读数 6513

学习ARM反汇编工具objdump和一个简单实例

                                                                         --参考朱有鹏ARM裸机编程


1、反汇编的原理&为什么需要反汇编
arm-linux-objdump -D led.elf > led_elf.dis
objdump是gcc工具链中的反汇编工具,作用是由编译链接好的elf
格式的可执行程序,来反过来得到汇编源代码。

-D表示反汇编。

>左边的是ELF的可执行程序(反汇编时候的原材料)
>右边的是反汇编生成的反汇编程序。其实就是一个汇编语言。


一般情况下我们写一个源代码

类似于我们WINDOW里面是EXE的格式,PE格式是官方的名字。


2、为什么我们需要进行反汇编,我们要的就是可执行程序。

反汇编的原因有以下:
1、逆向破解
你想盗版的原来的程序,最终得到程序的源代码。
2、调式程序的时候,反汇编代码可以帮助我们理解程序。

(我们学习时使用objdump主要目的是这个),
尤其是在理解链接脚本,链接地址等概念时候。
尤其是在理解链接的时候,用反汇编对你的理解非常大。


如果你是C语言写的源代码,反汇编之后得到的汇编语言的源代码,

可以有助于你理解C和汇编之间的关系,
非常有助于理解深入理解C语言。

3、反汇编文件的分析:

(1)第一个是标号比如000000这些是代表当前的地址

(2)第二个标号比如e59f0050:代表的是机器码的意思,其实我们写的所有的可执行程序都是机器码

只不过汇编语言就是相当于一句汇编语言对应一个机器码,这样我们编程就不用像以前那么辛苦了。

  0:	e59f0050 	ldr	r0, [pc, #80]	; 58 <delay_loop+0x10>
这句话是 ldr r0, =0x11111111 // 从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断这个数

编译器翻译出来就是上面的一句话,0x11111111这个数是ARM伪指令提供的。

那么到底机器把这句话放置在哪里呢?

把这句话放置在58这个地址中,后面已经有注释了:

再往下看58地址中,可以看到显示11111111


led.elf:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:	e59f0050 	ldr	r0, [pc, #80]	; 58 <delay_loop+0x10>
   4:	e59f1050 	ldr	r1, [pc, #80]	; 5c <delay_loop+0x14>
   8:	e5810000 	str	r0, [r1]

0000000c <flash>:
   c:	e3e00008 	mvn	r0, #8
  10:	e59f1048 	ldr	r1, [pc, #72]	; 60 <delay_loop+0x18>
  14:	e5810000 	str	r0, [r1]
  18:	eb000008 	bl	40 <delay>
  1c:	e3e00010 	mvn	r0, #16
  20:	e59f1038 	ldr	r1, [pc, #56]	; 60 <delay_loop+0x18>
  24:	e5810000 	str	r0, [r1]
  28:	eb000004 	bl	40 <delay>
  2c:	e3e00020 	mvn	r0, #32
  30:	e59f1028 	ldr	r1, [pc, #40]	; 60 <delay_loop+0x18>
  34:	e5810000 	str	r0, [r1]
  38:	eb000000 	bl	40 <delay>
  3c:	eafffff2 	b	c <flash>

00000040 <delay>:
  40:	e59f201c 	ldr	r2, [pc, #28]	; 64 <delay_loop+0x1c>
  44:	e3a03000 	mov	r3, #0

00000048 <delay_loop>:
  48:	e2422001 	sub	r2, r2, #1
  4c:	e1520003 	cmp	r2, r3
  50:	1afffffc 	bne	48 <delay_loop>
  54:	e1a0f00e 	mov	pc, lr
  58:	11111111 	tstne	r1, r1, lsl r1
  5c:	e0200240 	eor	r0, r0, r0, asr #4
  60:	e0200244 	eor	r0, r0, r4, asr #4
  64:	00895440 	addeq	r5, r9, r0, asr #8

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:	00001a41 	andeq	r1, r0, r1, asr #20
   4:	61656100 	cmnvs	r5, r0, lsl #2
   8:	01006962 	tsteq	r0, r2, ror #18
   c:	00000010 	andeq	r0, r0, r0, lsl r0
  10:	45543505 	ldrbmi	r3, [r4, #-1285]	; 0x505
  14:	08040600 	stmdaeq	r4, {r9, sl}
  18:	Address 0x00000018 is out of bounds.


4、反汇编文件的格式和看法


标号地址、标号名字、指令地址、指令机器码
指令机器码反汇编到的指令

扩展:ARM汇编中用地址池的方式实现非法立即数。

指令和地址是一一对应的,
我们下载烧录的bin文件,内部其实就是
一条一条的指令机器码,这些指令每一条都有一个指令地址。
这个地址是连接的ld给根据我们写的链接脚本来指定的。


-Ttext  :指定我们的起始地址的。

所有的地址都从别的地址开始执行,根据你的地址来执行。



5、展望:反汇编工具帮助我们分析链接脚本


反汇编的时候得到的地址是链接器考虑了链接脚本之后得到的地址,而
我们写代码是通过指定链接脚本来让链接器给我们链接合适的地址。


但是有时候我们写的链接脚本有误,或者我们不知道
这个链接脚本会怎么样?


这时候可以通过看反汇编文件分析这个链接脚本的效果。
看是不是我们想要的,如果不是的话可以改了再看。






2016-03-27 20:31:52 qq_18973645 阅读数 6261

《朱老师物联网大讲堂》学习笔记

学习网站:www.zhulaoshi.org


objdump是我们进行反汇编的工具


还记得Makefile文件吗?

led.bin: start.o 
arm-linux-ld -Ttext 0x0 -o led.elf $^

下载烧录执行的bin文件,内部其实是一条一条的指令机器码。这些指令每一条都有一个指令地址,这个地址是连接的时候ld给指定的(ld根据我们写的链接脚本来指定)


arm-linux-objcopy -O binary led.elf led.bin
从可执行文件到可烧录的镜像文件

arm-linux-objdump -D led.elf > led_elf.dis
做反汇编的

gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin

%.o : %.S
arm-linux-gcc -o $@ $< -c


%.o : %.c
arm-linux-gcc -o $@ $< -c 


clean:
rm *.o *.elf *.bin *.dis mkx210 -f


这里我们关注的是这一句

arm-linux-objdump -D led.elf > led_elf.dis

这里使用的是gcc工具中的反汇编

由编译链接好的elf格式的可执行程序来反过来得到汇编源代码
-D表示反汇编,由此可见这个工具还有其它功能

> 左边的是elf格式的可执行程序,也就是反汇编时候的原材料,右边的是反汇编生成的反汇编程序

led.elf:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:	e59f006c 	ldr	r0, [pc, #108]	; 74 <delay_loop+0x10>
   4:	e59f106c 	ldr	r1, [pc, #108]	; 78 <delay_loop+0x14>
   8:	e5810000 	str	r0, [r1]

0000000c <flash>:
   c:	e3a00030 	mov	r0, #48	; 0x30
  10:	e59f1064 	ldr	r1, [pc, #100]	; 7c <delay_loop+0x18>
  14:	e5810000 	str	r0, [r1]
  18:	eb00000f 	bl	5c <delay>
  1c:	e3a00028 	mov	r0, #40	; 0x28
  20:	e59f1054 	ldr	r1, [pc, #84]	; 7c <delay_loop+0x18>
  24:	e5810000 	str	r0, [r1]
  28:	eb00000b 	bl	5c <delay>
  2c:	e3a00018 	mov	r0, #24
  30:	e59f1044 	ldr	r1, [pc, #68]	; 7c <delay_loop+0x18>
  34:	e5810000 	str	r0, [r1]
  38:	eb000007 	bl	5c <delay>
  3c:	e3a00028 	mov	r0, #40	; 0x28
  40:	e59f1034 	ldr	r1, [pc, #52]	; 7c <delay_loop+0x18>
  44:	e5810000 	str	r0, [r1]
  48:	eb000003 	bl	5c <delay>
  4c:	e3a00030 	mov	r0, #48	; 0x30
  50:	e59f1024 	ldr	r1, [pc, #36]	; 7c <delay_loop+0x18>
  54:	e5810000 	str	r0, [r1]
  58:	ebffffeb 	bl	c <flash>

0000005c <delay>:
  5c:	e59f201c 	ldr	r2, [pc, #28]	; 80 <delay_loop+0x1c>
  60:	e3a03000 	mov	r3, #0

00000064 <delay_loop>:
  64:	e2422001 	sub	r2, r2, #1
  68:	e1520003 	cmp	r2, r3
  6c:	1afffffc 	bne	64 <delay_loop>
  70:	e1a0f00e 	mov	pc, lr
  74:	11111111 	tstne	r1, r1, lsl r1
  78:	e0200240 	eor	r0, r0, r0, asr #4
  7c:	e0200244 	eor	r0, r0, r4, asr #4
  80:	00989680 	addseq	r9, r8, r0, lsl #13

Disassembly of section .ARM.attributes:

00000000 <.ARM.attributes>:
   0:	00001a41 	andeq	r1, r0, r1, asr #20
   4:	61656100 	cmnvs	r5, r0, lsl #2
   8:	01006962 	tsteq	r0, r2, ror #18
   c:	00000010 	andeq	r0, r0, r0, lsl r0
  10:	45543505 	ldrbmi	r3, [r4, #-1285]	; 0x505
  14:	08040600 	stmdaeq	r4, {r9, sl}
  18:	Address 0x00000018 is out of bounds.



反汇编的原因有以下
1.逆向破解
2.我们在调试程序时侯,反汇编代码可以帮助我们理解程序

3.把c源代码编译链接生成的可执行程序,反汇编后得到对应汇编代码,可以帮助

我们理解c语言和汇编语言之间的对应关系,非常有助于深入理解c语言

尤其是在理解链接脚本,链接地址,时候帮助非常大



 

扩展:ARM汇编中用地址池方式来实现非法立即数

 

下面是上面反汇编代码的汇编代码

#define GPJ0CON	0xE0200240 
#define GPJ0DAT	0xE0200244

.global _start
_start:
	ldr r0, =0x11111111
	ldr r1, =GPJ0CON
	str r0, [r1]

flash:	
	ldr r0, =( (0<<3) | (1<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]

	bl delay
	
	ldr r0, =( (1<<3) | (0<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]

	bl delay
	
	ldr r0, =( (1<<3) | (1<<4) | (0<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]	

	bl delay

	ldr r0, =( (1<<3) | (0<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]	

	bl delay

	ldr r0, =( (0<<3) | (1<<4) | (1<<5) )
	ldr r1, =GPJ0DAT
	str r0, [r1]
	
	bl flash	
	
delay:
	ldr r2, =10000000
	ldr r3, =0x0
delay_loop:
	sub r2, r2, #1
	cmp r2, r3
	bne delay_loop
	mov pc, lr 


展望:反汇编工具帮助我们分析链接脚本
反汇编的时候得到的指令地址是链接器考虑了链接脚本之后得到的地址,而我们写代码时通过指定连接脚本来让链接器给我们链接合适的地址。
但是有时候我们写的链接脚本有误(或者我们不知道这个链接脚本会怎么样),这时候可以通过看反汇编文件来分析这个链接脚本的效果,看是不是我们想要的,如果不是可以改了再看。





2018-09-08 14:12:00 weixin_30399797 阅读数 18

最近在调试uboot的代码时,用的新版本的uboot,lowlevel_init函数里是空的,而且在链接文件中也没有发现对lowlevel_init.o的链接。

在bl lowlevel_init 之前和之中加了两个电灯,发现在bl之后的部分并没有被执行,所以想看看具体程序有没有运行这个函数。

在网上找反汇编bin文件的时候发现有朋友提供的方法,很好用。

使用arm-linux 工具链里面的arm-linux-objdump 就能反汇编

cd到bin文件所在的目录, 在命令行下输入:

arm-linux-objdump -D -b binary -m arm xxx.bin > xxx.asm

参数:

-D 反编译所有代码

-m 主机类型, arm

-b 文件格式, binary

对于ELF格式的文件只要一个-D参数即可

就可以把xxx.bin反汇编到xxx.asm文件

转载于:https://www.cnblogs.com/liushuhe1990/p/9609092.html

Linux下ARM汇编教程

阅读数 578

linux反汇编调试

阅读数 1680