Analysis 插件

在实现反汇编插件后,可能会注意到输出的效果并不是很好 - 没有合适的代码高亮,没有引用线等等。这是因为radare2要求每个架构插件提供对每个opcode的分析信息。目前反汇编和opcode分析是被划分为两个模块的 - RAsm和RAnal,因此我们还需要编写一个分析插件。编写分析插件的过程和编写反汇编插件很像 - 只需要创建一个C文件并提供对应的Makefile,

RAnal插件结构体如下:

RAnalPlugin r_anal_plugin_v810 = {
    .name = "mycpu",
    .desc = "MYCPU code analysis plugin",
    .license = "LGPL3",
    .arch = "mycpu",
    .bits = 32,
    .op = mycpu_op,
    .esil = true,
    .set_reg_profile = set_reg_profile,
};

同disassembly一样,需要为分析插件编写一个关键函数 - mycpu_op,该函数的功能是扫描opcode并构建RAnalOp结构体。 此外,本例中的分析插件还兼有提炼ESIL的功能(可以通过..esil = true语句启用之)。因此mycpu_op还需要完成opcode对应的RAnalOp中ESIL字段的填充工作。 若要完成ESIL的提炼和模拟,还需要进行寄存器的配置,得在set_reg_profile函数内进行设置,就像debugger中做的那样。

Makefile

NAME=anal_snes
R2_PLUGIN_PATH=$(shell r2 -H R2_USER_PLUGINS)
LIBEXT=$(shell r2 -H LIBEXT)
CFLAGS=-g -fPIC $(shell pkg-config --cflags r_anal)
LDFLAGS=-shared $(shell pkg-config --libs r_anal)
OBJS=$(NAME).o
LIB=$(NAME).$(LIBEXT)

all: $(LIB)

clean:
    rm -f $(LIB) $(OBJS)

$(LIB): $(OBJS)
    $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $(LIB)

install:
    cp -f anal_snes.$(SO_EXT) $(R2_PLUGIN_PATH)

uninstall:
    rm -f $(R2_PLUGIN_PATH)/anal_snes.$(SO_EXT)

anal_snes.c:

After compiling radare2 will list this plugin in the output:

snes_op_table.h: https://github.com/radareorg/radare2/blob/master/libr/asm/arch/snes/snes_op_table.h

Example:

最后更新于

这有帮助吗?