我想了解更多关于它是否可能以及如何编写将可执行二进制文件(目标文件)反编译为 C 源代码的程序。我不是在问“如何”,而是在问如何实现。
给定以下hello.c
文件(例如):
#include <stdio.h>
int main() {
printf("Hello World!");
}
然后在编译(gcc hello.c
)之后,我得到了如下二进制文件:
$ hexdump -C a.out | head
00000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00 |................|
00000010 0f 00 00 00 b0 04 00 00 85 00 20 00 00 00 00 00 |.......... .....|
00000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45 |....H...__PAGEZE|
00000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |RO..............|
00000040 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000060 00 00 00 00 00 00 00 00 19 00 00 00 d8 01 00 00 |................|
00000070 5f 5f 54 45 58 54 00 00 00 00 00 00 00 00 00 00 |__TEXT..........|
$ wc -c hello.c a.out
60 hello.c
8432 a.out
对于学习数据集,我假设我必须拥有数千个源代码文件及其二进制表示,因此算法可以了解某些更改的移动部分。
你将如何解决这个问题?
我的担忧(和子问题)是:
我的算法是否需要知道头文件,或者它足够“聪明”才能弄清楚?
如果它需要知道头文件,我如何告诉我的算法“这是头文件”?
什么应该是输入/输出映射(无论是部分到部分还是文件到文件)?
我需要将我的源代码分成几个部分吗?
我是否需要确切地知道反编译器是如何工作的,或者 AI 可以帮我弄清楚?
我是否应该有两个神经网络,一个用于标头,另一个用于主体本身?
或多个单独的神经网络,每个用于每个逻辑组件(例如字节->C 标记等)