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语言为例:
{
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'}}
],
},
{...},
{...},
]
}
{
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'}}
],
},
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!