反汇编Dis解析

Posted zongzi10010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反汇编Dis解析相关的知识,希望对你有一定的参考价值。


title: 反汇编Dis解析
tags: ARM
date: 2018-10-21 18:02:58
---

反汇编dis解析

关于段,反汇编文件中包含了代码段,数据段,bss段,comm段和注释段.

COMM段BSS段

对于全局变量来说,如果初始化了不为0的值,那么该全局变量则被保存在data段,如果初始化的值为0,那么将其保存在bss段,如果没有初始化,则将其保存在common段,等到链接时再将其放入到BSS段。关于第三点不同编译器行为会不同,有的编译器会把没有初始化的全局变量直接放到BSS段。

参考 链接脚本.md

Disassembly of section .text:
Disassembly of section .data:
Disassembly of section .rodata:  // 只读数据段(const全局变量)
Disassembly of section .bss:     //(初始值为0,无初始值的全局变量)
Disassembly of section .comment:

COMM段BSS段

这两个段并不在bin文件中保存,可以查看反汇编的代码前面的标号与bin的大小对比.所以实际上bss段代码的实现要自己写的.

注释段

这个在反汇编文件的最下方,类似如下,其实他是字符串的asc编码,复制到winhex中查看一下即可

00000000 <.comment>:
   0:   43434700    cmpmi   r3, #0  ; 0x0
   4:   4728203a    undefined
   8:   2029554e    eorcs   r5, r9, lr, asr #10
   c:   2e342e33    mrccs   14, 1, r2, cr4, cr3, {1}
  10:   47000035    smladxmi    r0, r5, r0, r0
  14:   203a4343    eorcss  r4, sl, r3, asr #6
  18:   554e4728    strplb  r4, [lr, #-1832]
  1c:   2e332029    cdpcs   0, 3, cr2, cr3, cr9, {1}
  20:   00352e34    eoreqs  r2, r5, r4, lsr lr
  24:   43434700    cmpmi   r3, #0  ; 0x0
  28:   4728203a    undefined
  2c:   2029554e    eorcs   r5, r9, lr, asr #10
  30:   2e342e33    mrccs   14, 1, r2, cr4, cr3, {1}
  34:   47000035    smladxmi    r0, r5, r0, r0
  38:   203a4343    eorcss  r4, sl, r3, asr #6
  3c:   554e4728    strplb  r4, [lr, #-1832]
  40:   2e332029    cdpcs   0, 3, cr2, cr3, cr9, {1}
  44:   00352e34    eoreqs  r2, r5, r4, lsr lr

注意使用hex格式复制,显示的是gcc的版本,这里是直接列复制的,实际的需要按地址排序,小端模式

技术分享图片

技术分享图片

Bl指令

反汇编的Bl指令中的地址,并不是实际的跳转地址,他只是起到方便查看的作用,实际跳转的地址是pc指针的偏移量

3000005c:   eb000106    bl  30000478 <sdram_init> 

30000060:   e3a01000    mov r1, #0  ; 0x0
30000064:   e59f204c    ldr r2, [pc, #76]   ; 300000b8 <.text+0xb8>
30000068:   e59f304c    ldr r3, [pc, #76]   ; 300000bc <.text+0xbc>

 
这里的bl   30000478不是跳转到30000478,这个时候sdram并未初始化;
为了验证,我们做另一个实验,修改连接脚本sdram.lds, 链接地址改为0x32000478,编译,查看反汇编:

 
3000005c:   eb000106    bl  30000478 <sdram_init> 

30000060:   e3a01000    mov r1, #0  ; 0x0
30000064:   e59f204c    ldr r2, [pc, #76]   ; 300000b8 <.text+0xb8>
30000068:   e59f304c    ldr r3, [pc, #76]   ; 300000bc <.text+0xbc>

可以看到现在变成了bl 30000478,但两个的机器码eb000106都是一样的,机器码一样,执行的内容肯定都是一样的。 因此这里并不是跳转到显示的地址,而是跳转到: pc + offset,这个由链接器决定。

假设程序从0x30000000执行,当前指令地址:0x3000005c ,那么就是跳到0x30000478;如果程序从0运行,当前指令地址:0x5c 调到:0x00000478

跳转到某个地址并不是由bl指令所决定,而是由当前pc值决定。反汇编显示这个值只是为了方便读代码。

重点: 反汇编文件里, B或BL 某个值,只是起到方便查看的作用,并不是真的跳转。




以上是关于反汇编Dis解析的主要内容,如果未能解决你的问题,请参考以下文章

将 python 反汇编从 dis.dis 转换回 codeobject

《Linux内核 核心知识全解析(完)》

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编框架 | PyCharm 中导入 Capstone 反汇编框架 )

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )

Android 逆向使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 完整代码示例 ) ★★★

反汇编