我可以使用无法逆向工程的 gcc 创建目标文件吗?

逆向工程 C 目标代码
2021-06-26 01:43:08

是否可以使用gcc无法对其源代码进行逆向工程的对象文件来创建

4个回答

AFAIK 那是不可能的。但是,您还可以记住其他一些事项:

使用 GCC 优化标志将有助于使代码看起来对人类的可读性大大降低。当您使用最高级别的优化gcc -O3进行编译时,编译器会移动一些东西,这样“流程”可能根本不是您所期望的。

您还可以使用-static强制 gcc 使用小函数并使它们内联的标志这会将它们嵌入到您的代码中,而不是显示为函数调用......这会使它们更难区分。

要记住的一件事是摆脱任何不需要的符号也很重要。Gcc 提供-fvisibility=hidden-fvisibility-inlines-hidden帮助解决这个问题。您还可以将-s标志传递给 gcc 以去除符号。

我认为这就是你可以用gcc做的所有事情来帮助防止逆向工程。此外,您可以使用代码混淆,但除非您自己实现,否则也存在问题,如果您使用现成的方法或工具来防止逆向工程,则可能已经有一个工具可以解决它。

请记住,最终的可执行文件中还将包含信息,例如编译时使用的 gcc 版本。这也可以通过strip命令删除

如果我有一个可执行文件 ( myprog),我可以运行objdump它来检查一些信息:

mike@mike-VirtualBox:~/C$ objdump --full-contents --section=.comment myprog | head
myprog:     file format elf64-x86-64

Contents of section .comment:
 0000 4743433a 20285562 756e7475 2f4c696e  GCC: (Ubuntu/Lin
 0010 61726f20 342e362e 332d3175 62756e74  aro 4.6.3-1ubunt
 0020 75352920 342e362e 3300               u5) 4.6.3.   

哎呀,你可以看到我使用的版本/编译器。好吧,我们可以解决这个问题:

mike@mike-VirtualBox:~/C$ strip -R .comment -R .note myprog
mike@mike-VirtualBox:~/C$ objdump --full-contents --section=.comment myprog | head
objdump: 
section '.comment' mentioned in a -j option, but not found in any input file
myprog:     file format elf64-x86-64

您也可以剥离其他部分,例如.note.ABI-tag但您确实失去了便携性

简短回答:不。

长答案Boaz Barak、Oded Goldreich、Rusell Impagliazzo、Steven Rudich、Amit Sahai、Salil Vadhan 和 Ke Yang 撰写的关于混淆程序的(Im)可能性

中等答案:如果您将程序提供给控制程序执行平台的用户,则无法防止对其进行逆向工程。您唯一能希望的是强迫用户对您的软件进行黑盒分析(这意味着用户只能在选定的输入上观察您的程序的输出)。

但是,即使这种黑盒分析在没有额外硬件(例如智能卡)的情况下也极难执行,因为用户应该能够在程序执行期间拍摄内存的中间快照。

好吧,可能无法将文件重新转换为准确的原始源代码(例如,无法恢复注释或预处理器宏),但这可能不是您想问的。

生成等效的源代码绝对总是可能的(尽管有时很困难),其行为与编译后的代码相同。通过一些额外的工作,甚至有可能生成编译为完全相同的字节码的代码(只要没有对编译后的二进制文件进行额外的后处理)。本演示文稿描述了一些用于此的方法,但我找不到幻灯片。

虽然无法混淆目标文件,但可以混淆底层程序集文件。C++ 中没有名称混淆这样的事情,因为引用是按地址而不是按名称。使用完全优化 (-O3 -Ob2 -flto) 还可以使逆向工程您的代码变得困难。此外,您还可以使用 VMProtect/Denuvo 来加密和混淆您的可执行文件。

你可能会发现这些帖子很有用

https://stackoverflow.com/questions/137038/how-do-you-get-assembler-output-from-cc-source-in-gcc

https://reverseengineering.stackexchange.com/a/22052/33533