首页
社区
课程
招聘
[原创]如何手搓反汇编引擎-原理(ARM)
发表于: 2026-1-3 22:27 1035

[原创]如何手搓反汇编引擎-原理(ARM)

2026-1-3 22:27
1035

elf的格式网上有一大堆的介绍,最简单的就是拿010editor,对照着elf.h的每个struct一一对应就ok了。

假定elf的代码都在.text这个section里,抽取dynamic_symbols里面的汇编代码。

elf解析有N多坑,比如各种size被strip掉,.text段穿插了各种数据等等。

举例:

DDI0487L_b_a-profile_architecture_reference_manual.pdf

C4.1.92.3 Add/subtract (immediate)中的add(immediate) -- 32bit

用自己熟悉的脚本语言定义一套DSL,我比较熟悉ruby。

步骤:

所有的指令解析完成后会得到一颗树

在树上做**(code & mask) == value**的递归操作就是反汇编的过程。

到这里一个基于ruby的反汇编引擎就可以工作了。

生成静态语言(c/c++/java/go/rust)需要的静态数据,以c语言为例:

/*
 * +-----------------------------------------------------------------------------------------------+
 * |31|30|29|28 27 26 25 24 23|22|21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
 * -------------------------------------------------------------------------------------------------
 * |sf|op| s| 1  0  0 0   1  0|sh|            imm12                  |       rn     |       rd     |
 * +-----------------------------------------------------------------------------------------------+
 * 指令格式:xxx100010xxxxxxxxxxxxxxxxxxxxxxx
 * 参数位置:31: sf, 30: op, 29: S
 * 31位:0
 * 30位:0
 * 29位:0
 * 对应的就是add--32bit
 */
/*
 * +-----------------------------------------------------------------------------------------------+
 * |31|30|29|28 27 26 25 24 23|22|21|20|19|18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 1| 0|
 * -------------------------------------------------------------------------------------------------
 * |sf|op| s| 1  0  0 0   1  0|sh|            imm12                  |       rn     |       rd     |
 * +-----------------------------------------------------------------------------------------------+
 * 指令格式:xxx100010xxxxxxxxxxxxxxxxxxxxxxx
 * 参数位置:31: sf, 30: op, 29: S
 * 31位:0
 * 30位:0
 * 29位:0
 * 对应的就是add--32bit
 */
{
    patterns: 'xxx100010xxxxxxxxxxxxxxxxxxxxxxx',
  list: [
      {
      mnemonic: 'add',
      fill: {31 => 0, 30 => 0, 29 => 0},
      operands: [
        {t: :r_w, v: '0:5', wsp: true}, # 目的寄存器
        {t: :r_w, v: '5:5', wsp: true},
        {t: :imm, v: '10:12', shift: {t: :lsl, v: '0:1'}}
      ],
    },
    {...}, # others
    {...}, # add-64bit
  ]
}
{
    patterns: 'xxx100010xxxxxxxxxxxxxxxxxxxxxxx',
  list: [
      {
      mnemonic: 'add',
      fill: {31 => 0, 30 => 0, 29 => 0},
      operands: [
        {t: :r_w, v: '0:5', wsp: true}, # 目的寄存器
        {t: :r_w, v: '5:5', wsp: true},
        {t: :imm, v: '10:12', shift: {t: :lsl, v: '0:1'}}
      ],
    },

传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 36
支持
分享
最新回复 (7)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2026-1-4 09:30
0
雪    币: 232
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
学习
2026-1-4 20:28
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
666
2026-1-4 20:45
0
雪    币: 8721
活跃值: (6507)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享
4天前
0
雪    币: 155
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
mark
4天前
0
雪    币: 13
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
666
3天前
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
29o
8
感谢分享
3天前
0
游客
登录 | 注册 方可回帖
返回