是否有任何编译器选项可以阻止添加此信息?
是否可以完全删除编译器签名,以便难以检测使用的编译器?
评论
我好疼这不是这个问题的精确重复,但是有很多共同点,而且答案几乎是相同的。@IgorSkochinsky,如果我错了,请纠正我,但是您参考的问题中没有一个回答讨论如何删除或混淆编译器属性,而是讨论了它们的存在。
#include <stdio.h>
int main(void) {
puts("Hello World!");
return 0;
}
hexdump -C
。以下内容除了可以清楚地识别出编译器之外!00001020 47 43 43 3a 20 28 55 62 75 6e 74 75 2f 4c 69 6e |GCC: (Ubuntu/Lin|
00001030 61 72 6f 20 34 2e 36 2e 33 2d 31 75 62 75 6e 74 |aro 4.6.3-1ubunt|
00001040 75 35 29 20 34 2e 36 2e 33 00 00 2e 73 79 6d 74 |u5) 4.6.3...symt|
00001050 61 62 00 2e 73 74 72 74 61 62 00 2e 73 68 73 74 |ab..strtab..shst|
00001060 72 74 61 62 00 2e 69 6e 74 65 72 70 00 2e 6e 6f |rtab..interp..no|
00001070 74 65 2e 41 42 49 2d 74 61 67 00 2e 6e 6f 74 65 |te.ABI-tag..note|
00001080 2e 67 6e 75 2e 62 75 69 6c 64 2d 69 64 00 2e 67 |.gnu.build-id..g|
00001090 6e 75 2e 68 61 73 68 00 2e 64 79 6e 73 79 6d 00 |nu.hash..dynsym.|
000010a0 2e 64 79 6e 73 74 72 00 2e 67 6e 75 2e 76 65 72 |.dynstr..gnu.ver|
000010b0 73 69 6f 6e 00 2e 67 6e 75 2e 76 65 72 73 69 6f |sion..gnu.versio|
000010c0 6e 5f 72 00 2e 72 65 6c 61 2e 64 79 6e 00 2e 72 |n_r..rela.dyn..r|
000010d0 65 6c 61 2e 70 6c 74 00 2e 69 6e 69 74 00 2e 74 |ela.plt..init..t|
000010e0 65 78 74 00 2e 66 69 6e 69 00 2e 72 6f 64 61 74 |ext..fini..rodat|
000010f0 61 00 2e 65 68 5f 66 72 61 6d 65 5f 68 64 72 00 |a..eh_frame_hdr.|
00001100 2e 65 68 5f 66 72 61 6d 65 00 2e 63 74 6f 72 73 |.eh_frame..ctors|
00001110 00 2e 64 74 6f 72 73 00 2e 6a 63 72 00 2e 64 79 |..dtors..jcr..dy|
00001120 6e 61 6d 69 63 00 2e 67 6f 74 00 2e 67 6f 74 2e |namic..got..got.|
00001130 70 6c 74 00 2e 64 61 74 61 00 2e 62 73 73 00 2e |plt..data..bss..|
00001140 63 6f 6d 6d 65 6e 74 00 00 00 00 00 00 00 00 00 |comment.........|
strip -R .comment
可以部分帮助,并且完全删除了对GCC的明确提及,但是仍然有一些明显的迹象:00000260 47 4e 55 00 00 00 00 00 02 00 00 00 06 00 00 00 |GNU.............|
00000270 18 00 00 00 04 00 00 00 14 00 00 00 03 00 00 00 |................|
00000280 47 4e 55 00 5f 8a 1b 97 01 5a ac d7 93 fb 96 29 |GNU._....Z.....)|
* * *
00000310 00 00 00 00 00 00 00 00 00 5f 5f 67 6d 6f 6e 5f |.........__gmon_|
00000320 73 74 61 72 74 5f 5f 00 6c 69 62 63 2e 73 6f 2e |start__.libc.so.|
00000330 36 00 70 75 74 73 00 5f 5f 6c 69 62 63 5f 73 74 |6.puts.__libc_st|
00000340 61 72 74 5f 6d 61 69 6e 00 47 4c 49 42 43 5f 32 |art_main.GLIBC_2|
00000350 2e 32 2e 35 00 00 00 00 02 00 02 00 00 00 00 00 |.2.5............|
* * *
00001020 00 2e 73 68 73 74 72 74 61 62 00 2e 69 6e 74 65 |..shstrtab..inte|
00001030 72 70 00 2e 6e 6f 74 65 2e 41 42 49 2d 74 61 67 |rp..note.ABI-tag|
00001040 00 2e 6e 6f 74 65 2e 67 6e 75 2e 62 75 69 6c 64 |..note.gnu.build|
00001050 2d 69 64 00 2e 67 6e 75 2e 68 61 73 68 00 2e 64 |-id..gnu.hash..d|
00001060 79 6e 73 79 6d 00 2e 64 79 6e 73 74 72 00 2e 67 |ynsym..dynstr..g|
00001070 6e 75 2e 76 65 72 73 69 6f 6e 00 2e 67 6e 75 2e |nu.version..gnu.|
00001080 76 65 72 73 69 6f 6e 5f 72 00 2e 72 65 6c 61 2e |version_r..rela.|
00001090 64 79 6e 00 2e 72 65 6c 61 2e 70 6c 74 00 2e 69 |dyn..rela.plt..i|
000010a0 6e 69 74 00 2e 74 65 78 74 00 2e 66 69 6e 69 00 |nit..text..fini.|
000010b0 2e 72 6f 64 61 74 61 00 2e 65 68 5f 66 72 61 6d |.rodata..eh_fram|
000010c0 65 5f 68 64 72 00 2e 65 68 5f 66 72 61 6d 65 00 |e_hdr..eh_frame.|
000010d0 2e 63 74 6f 72 73 00 2e 64 74 6f 72 73 00 2e 6a |.ctors..dtors..j|
000010e0 63 72 00 2e 64 79 6e 61 6d 69 63 00 2e 67 6f 74 |cr..dynamic..got|
000010f0 00 2e 67 6f 74 2e 70 6c 74 00 2e 64 61 74 61 00 |..got.plt..data.|
00001100 2e 62 73 73 00 00 00 00 00 00 00 00 00 00 00 00 |.bss............|
GNU
的痕迹会发生什么... ./a.out: ./a.out: no version information available (required by ./a.out)
./a.out: relocation error: ./a.out: symbol , version not defined in file with link time reference
strip
和sstrip
命令删除一些痕迹。
评论
“工件”不仅仅包括字符串。即使删除所有字符串,代码也仍然保留,并且经常可以指向使用肯定的编译器。
–伊戈尔·斯科钦斯基♦
13年3月29日在19:29
尽管您自己的发现很有趣,但是Igor是正确的。这不仅涉及字符串,还涉及编译器在最终二进制文件中插入的部分代码。您应该对其进行反向工程,然后逐个指令重新定义指令,直到完全删除所有特征。尝试创建程序的另一个版本,但是您会注意到它们具有一些共同的特征,而不是puts()使用scanf()。
– jyz
13年7月16日在1:12