我需要编写一个程序(用c ++编写),除其他事项外,还需要了解给定PE文件的所有功能。基本上,这等效于使用“ r2 -A binary_name”打开二进制文件,然后输入afl命令。

是否可以使用radare2 c \ c ++ API(libr)做到这一点?如果是,怎么办?

评论

在Windows程序包中似乎总是缺少lib文件,这里有一个小测试文件显示了如何使用api,但我无法构建它,因为r2程序包中没有任何lrbr.so或libr.a文件github。 com / radare / radare2-bindings / tree / master / c(如果您将ln6中的代码粘贴到“ r2 \ include \ libr”中的文本文件中并使用mingw gcc -I)。 foo.c然后mingw ld抛出未引用的r_bin_new()错误,因为它找不到lib文件,看看是否可以在某些操作系统中获取它们

我实际上在Linux下遇到了相同的问题。我在/ usr / lib下有所有的rade库文件。但是,它们是符号链接,并且链接到的文件不存在。

#1 楼

r2pipe

radar2的最佳编程接口称为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)



参考文献


r2pipe项目页面
r2pipe C绑定