是否可以使用gcc
无法对其源代码进行逆向工程的对象文件来创建?
我可以使用无法逆向工程的 gcc 创建目标文件吗?
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