自从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; |
| } |
| |
|==================================================================|
这样的操作码数据库已经在编译为本机代码的各种编译器中实现。你知道吗
例如,LLVM以TableGen语言文件的形式拥有这样的数据库。后端反汇编程序大多是根据这些描述自动生成的。例如,看看Sparc backend。你知道吗
像Capstone Disassembler这样的项目使用LLVM为各种cpu反汇编代码。你知道吗
相关问题 更多 >
编程相关推荐