首页
社区
课程
招聘
[原创] Arm静态分析引擎原理二 - 反汇编引擎实现
发表于: 6天前 379

[原创] Arm静态分析引擎原理二 - 反汇编引擎实现

6天前
379

上文

经过 DSL 描述以后,引擎不会直接解析 DSL,而是会预先生成一张静态查找表。查找表中的每一个节点都会转换成 (mask, value) 的形式,运行时只需要进行按位与和比较即可完成匹配,因此解码过程不需要解释 DSL,也不需要字符串匹配。

还是以这个C4.1.92 Data Processing – Immediate里面的add为例,在解码的时候会为这棵树生成maskvalue

指令查表的逻辑就是 :


C4.1.92 Data Processing – Immediate:xxx100xxxxxxxxxxxxxxxxxxxxxxxxxx的mask和value分别是:

    mask: 469762048,二进制:00011100000000000000000000000000

    value: 268435456,  二进制:00010000000000000000000000000000


C4.1.92.3 Add/subtract (immediate): xxx100010xxxxxxxxxxxxxxxxxxxxxxx的mask和value分别是:

    mask:528482304,二进制:00011111100000000000000000000000

    value:285212672,二进制:00010001000000000000000000000000


ADD <Wd|WSP>, <Wn|WSP>, #<imm>{, <shift>} 指令的mask和value分别是:

    mask:4286578688,二进制:11111111100000000000000000000000

    value:285212672,二进制:00010001000000000000000000000000

拿一条add指令举例:

那么伪代码的逻辑就是这样的:


以add指令的操作数为例:

第一个操作数是从0开始,5位

第二个操作数是从5开始,5位

第三个操作数是从10开始,12位,这个操作数有shift,shift的逻辑就是f:f1

这里的f:f1表示一个函数,也就是父节点上的fshift,fshift里面就是一个字符串描述的函数,直接可以求出shift的值即可


这里还是以

为例

指令的二进制是:0001000100000000001100 01000 01000

第一个操作数0:5 -> 01000 -> 8 -> 寄存器是16位w -> w8


冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 5天前 被neocanable编辑 ,原因: 改个名字
收藏
免费 20
打赏
分享
最新回复 (7)
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
666
6天前
0
雪    币: 6
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
感谢分享
5天前
0
雪    币: 1560
活跃值: (5508)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
4
1
5天前
0
雪    币: 176
活跃值: (1222)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
1
5天前
0
雪    币: 57
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
666
5天前
0
雪    币: 57
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
666
5天前
0
雪    币: 95
活跃值: (3412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
6666666
4天前
0
游客
登录 | 注册 方可回帖
返回