編譯器將系統信息添加到在編譯時創建的輸出/目標文件中。
- 是否有任何編譯器選項可以阻止添加此信息?
- 是否可以完全刪除編譯器簽名,以便難以檢測使用的編譯器?
編譯器將系統信息添加到在編譯時創建的輸出/目標文件中。
我在這裡的答案是特定於常見的C / C ++編譯器的,但是答案的原理仍適用於其他情況。
編譯器的差異以多種方式體現出來,其中有些非常微妙。如果嚴格來說是可執行標頭中的屬性問題,那麼我們可以輕鬆地想像重寫該標頭。但是,每個編譯器都有自己獨特的生成代碼風格(並且取決於優化級別)。每個編譯器都有其自己的默認標準庫(通常包含Telltale字符串),並且在可執行文件的入口點具有不同的默認樣板代碼。還有其他區別,例如:在一個編譯器中使用的優化未在另一編譯器中使用;默認的調用約定可能有所不同;在gcc和MSVC上,為函數序言生成的代碼明顯不同(例如);不同的編譯器具有不同的代碼序列和用於異常處理的數據結構;還有更多示例。我會說,幾乎不可能掩蓋哪個編譯器生成了給定的可執行文件。
要回答第一個問題:不,我認為流行的編譯器沒有任何編譯器選項可讓您避免添加其編譯器工件。
其中的部分問題是@Syzygy的答案對此進行了探討:編譯器生成的指令有時會非常不同。
此外,了解不同編譯器留下的工件可以使您難以區分使用了哪種編譯器。例如,假設使用mingw編譯Windows可執行文件,然後向其中添加RICH標頭。這是一個人為的示例,但是通過將MSVC編譯器的工件添加到mingw輸出中,可能會混淆一些自動化工具。
許多先前的答案都指出,這是不可能的,因為編譯器將始終留下工件。我決定使用Linux上的程序進行一些案例研究,儘管這個想法是可以移植的。
例如,我創建了一個小的“ Hello World!”。 C中的文件:
#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 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 ..gnuver | 000010b0 73 69 6f 6e 00 2e 67 6e 75 2e 76 65 72 73 69 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.pl t.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 |註釋......... |
運行 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 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 | nuversion.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 | .bss ............ |
我決定看看會發生什麼如果我用空字節替換了這段代碼的最後一部分,就會發生這種情況。該程序仍然可以正常運行,但是會降低到其他操作系統的可移植性。
如果您嘗試用另一個編譯器(例如 clang
)替換 GNU
,它仍然可以正常工作。儘管這可能會使逆向工程師感到困惑,但是注意起來並不難。
最後,我嘗試查看如果刪除了 GLIBC
...
./ a.out:./ a.out:沒有可用的版本信息(../a.out要求)。/a.out:重定位錯誤:./ a.out:symbol,版本未在文件中定義,帶有鏈接時間參考
簡短答案:否。我不知道任何具有“隱形模式”開關的編譯器,如果最終結果,IMO只會是同一編譯器的另一個簽名。
@ omghai2u建議您可以手動修改二進製文件並針對自動化工具進行測試,但我認為它不會有太大幫助。
更好的方法可能是使用exe 打包程序/保護程序。儘管經驗豐富的RE可能可以解壓縮它,但這仍然意味著大量的工作和知識。所以至少這是第一道防線。
您可以嘗試:
strip
和 sstrip
命令刪除一些痕跡。但是沒有靈丹妙藥。也許您應該問自己關於問題的為什麼方面的問題,而不是如何