如何使用radare2 c/c++ API打印二进制文件的所有函数

逆向工程 C++ 雷达2 接口
2021-07-02 10:48:50

我需要编写一个程序(在 C++ 中),其中需要知道给定 PE 文件的所有功能。基本上,它相当于用“r2 -A binary_name”打开一个二进制文件,然后输入 afl 命令。

有没有办法使用radare2 c\c++ API(libr)来做到这一点?如果是,如何?

1个回答

r2pipe

radare2 的最佳编程接口称为r2pipe

引用该项目的 Github 页面:

r2pipe API 基于单个 r2 原语,r_core_cmd_str()原语后面 是一个函数,该函数接受描述要运行的 r2 命令的字符串参数并返回带有结果的字符串。

r2pipe 支持多种编程语言,包括PythonNodeJSRustC等。


编写程序

要使用 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)

参考