-
-
[原创] Arm静态分析引擎原理二 - 反汇编引擎实现
-
-
[原创] Arm静态分析引擎原理二 - 反汇编引擎实现
接上文。
经过 DSL 描述以后,引擎不会直接解析 DSL,而是会预先生成一张静态查找表。查找表中的每一个节点都会转换成 (mask, value) 的形式,运行时只需要进行按位与和比较即可完成匹配,因此解码过程不需要解释 DSL,也不需要字符串匹配。
还是以这个C4.1.92 Data Processing – Immediate里面的add为例,在解码的时候会为这棵树生成mask和value
指令查表的逻辑就是 :
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编辑
,原因: 改个名字