创建操作码数据库

2024-05-13 19:07:47 发布

您现在位置:Python中文网/ 问答频道 /正文

自从NSA发布Ghidra以来,我对二进制代码的反汇编就更感兴趣了,Ghidra有一个内置的特性,可以从二进制代码的反汇编中生成伪C代码。你知道吗

我的想法是用相应的汇编代码和C代码构建一个操作码数据库。我想写一个工具,可以转储一个二进制文件,比如readelf和objdump,从一个C源文件中提取符号和函数,并将它们组合在一起

所以,更清楚地说,让我们举一个例子。你知道吗

我们在ubuntu系统上下载vim源代码。我们使用./configure和./make编译它。当二进制文件准备好后,我们启动工具,提取符号的操作码,从代码中创建汇编代码,提取.c文件的函数和函数体,将它们放在一起,并将其写入数据库。你知道吗

所以数据库应该包含以下内容:

c函数源代码

int main()
{ 
  return 0; 
}

汇编程序可能看起来像:

push rbp
mov rbp, rsp
...
ret

操作码部分如下:

55 48 89 e5 89 7d ec 89 75 ...

所以我的问题是。。。把这些数据编入目录作为反汇编程序中的一个插件有意义吗?这个想法是一个插件可以将操作码发布到一个web服务,并获得可能的c源代码。因此反编译器可以使用它来清除伪代码,并用现实世界的代码示例来替换它。你知道吗

我知道这不是那么容易,因为我们有不同的编译器、架构、版本、endian等等。但总而言之,有了一个包含每个体系结构/版本/编译器的操作码的大型数据库,应该可以更容易地对未知二进制文件进行反向工程。你知道吗

我昨天把代码放在一起,但我不确定这是否有助于扩展反汇编程序。你知道吗

为了了解它,下面是一个我用c编写的小型计算工具的示例,以及我的工具的输出:

|==================================================================|
| Adress             | Function                       | Size       |
|====================|================================|============|
| 0x0000000000000679 | add                            | 33         |
|==================================================================|
| OPCode                                                           |
|==================================================================|
| 55 48 89 e5 89 7d ec 89 75 e8 c7 45 fc 00 00 00 00 8b 55 ec 8b   |
| 45 e8 01 d0 89 45 fc 8b 45 fc 5d c3                              |
|==================================================================|
| Assembler                                                        |
|==================================================================|
| 0x1000  : push        rbp                                |
| 0x1001  : mov         rbp, rsp                           |
| 0x1004  : mov         dword ptr [rbp - 0x14], edi        |
| 0x1007  : mov         dword ptr [rbp - 0x18], esi        |
| 0x100a  : mov         dword ptr [rbp - 4], 0             |
| 0x1011  : mov         edx, dword ptr [rbp - 0x14]        |
| 0x1014  : mov         eax, dword ptr [rbp - 0x18]        |
| 0x1017  : add         eax, edx                           |
| 0x1019  : mov         dword ptr [rbp - 4], eax           |
| 0x101c  : mov         eax, dword ptr [rbp - 4]           |
| 0x101f  : pop         rbp                                |
| 0x1020  : ret                                            |
|==================================================================|
| Source                                                           |
|==================================================================|
| int add(int a, int b)                                            |
| {                                                                |
|   int c = 0;                                                      |
|   c = a + b;                                                      |
|   return c;                                                       |
| }                                                                |
|                                                                  |
|==================================================================|

Tags: 文件工具函数代码数据库源代码二进制int
1条回答
网友
1楼 · 发布于 2024-05-13 19:07:47

这样的操作码数据库已经在编译为本机代码的各种编译器中实现。你知道吗

例如,LLVM以TableGen语言文件的形式拥有这样的数据库。后端反汇编程序大多是根据这些描述自动生成的。例如,看看Sparc backend。你知道吗

Capstone Disassembler这样的项目使用LLVM为各种cpu反汇编代码。你知道吗

相关问题 更多 >