簡體   English   中英

C程序中的字符串文字,可以在二進制文件中找到嗎?

[英]String literal in C program, can it be found in binary?

例如:

int main(int argc, char *argv[]) {   
  if (strncmp(argv[1], "password")) {
    printf("Incorrect password\n");   
  }
  return 0; 
}

我可以反匯編此已編譯程序的二進制文件,並在二進制文件的某處看到字符串“ password”,還是僅在運行時可見?

通常,是的。 而且,您不需要“分解”任何東西。 在大多數情況下,您可以通過在文本或十六進制編輯器中打開它來在已編譯的二進制文件中正確查看它。

ASCII字符串不經過任何特殊的編碼/解碼,因此它們按字面意義出現在二進制文件中,並且在將二進制文件解釋為(看起來很垃圾的)ASCII文件時會出現。 如果您更深入地考慮,將它們存儲在二進制文件中的唯一系統的替代方法是在整個操作系統范圍內對所有程序的所有字符串進行可怕的中央注冊表。 如果它們存儲在單獨的文件中,則它們可能與二進制文件分開。

但是,OP似乎對代碼布局以及對諸如字符串之類的只讀數據執行的編譯提出了一個更大的問題。 “查找”字符串的一種更具教育意義的方法是查看人類可讀匯編的中間編譯階段,在該階段中,將對字符串進行布局並由標簽引用。 然后,鏈接器(下一個編譯階段)會將標簽解析為距二進制文件開頭的數字偏移量。 請注意下面的.rodata (“只讀數據段”)標簽。

從gcc聯機幫助頁中:-S在適當的編譯階段后停止; 不要組裝。 對於每個指定的非匯編程序輸入文件,輸出采用匯編程序代碼文件的形式。

結果:

    .file   "foo.c"
    .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "password"
.LC1:
    .string "Incorrect password"
    .section        .text.startup,"ax",@progbits
    .p2align 4,,15
    .globl  main
    .type   main, @function
main:

[遵循匯編語言說明]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM