我需要编写一个程序(在 C++ 中),其中需要知道给定 PE 文件的所有功能。基本上,它相当于用“r2 -A binary_name”打开一个二进制文件,然后输入 afl 命令。
有没有办法使用radare2 c\c++ API(libr)来做到这一点?如果是,如何?
我需要编写一个程序(在 C++ 中),其中需要知道给定 PE 文件的所有功能。基本上,它相当于用“r2 -A binary_name”打开一个二进制文件,然后输入 afl 命令。
有没有办法使用radare2 c\c++ API(libr)来做到这一点?如果是,如何?
radare2 的最佳编程接口称为r2pipe。
引用该项目的 Github 页面:
r2pipe API 基于单个 r2 原语,
r_core_cmd_str()该原语后面 是一个函数,该函数接受描述要运行的 r2 命令的字符串参数并返回带有结果的字符串。
r2pipe 支持多种编程语言,包括Python、NodeJS、Rust、C等。
要使用 r2pipe,您应该首先确保安装了radare2。始终建议使用来自 git 的最新版本。
按照以下步骤安装或更新radare2:
$ git clone https://github.com/radare/radare2.git # clone radare2 if you didn't do it yet for some reason.
$ cd radare2
$ ./sys/install.sh
现在在安装和更新radare2 之后,让我们开始编写C 程序来列出二进制文件的所有功能。正如您在问题中提到的,它应该等同于使用radare2 打开二进制文件,执行aaa以分析二进制文件(实际上是r2 -A binary_name),然后执行afl以列出所有函数。
首先我们应该定义一个接受 r2 实例和命令的函数。该函数将执行命令,打印结果并释放结果字符串。
#include <r_socket.h>
static void r2cmd(R2Pipe *r2, const char *cmd) {
char *msg = r2p_cmd (r2, cmd);
if (msg) {
printf ("%s\n", msg);
free (msg);
}
}
之后,编写main()函数应该是直观的:
int main() {
R2Pipe *r2 = r2p_open ("r2 -q0 /bin/echo");
if (r2) {
r2cmd (r2, "aaa");
r2cmd (r2, "afl");
r2p_close (r2);
return 0;
}
return 1;
}
我们用我们要检查的程序定义一个r2的实例,然后使用我们刚刚创建的函数通过radare2的接口执行命令。首先,我们使用 分析程序aaa,然后使用打印函数afl。
要使用编译程序,gcc我们应该执行以下命令:
gcc list_functions.c -o list_functions $(pkg-config --cflags r_socket --libs r_socket)