2012-10-10 38 views
0

相同的二進制文件的執行過程中我寫了一個程序,我想實現輸出每個像從「字符串中接收到我的輸出字符串的command`如何才達到strings命令輸出,並在Linux上

int my_print(char *fmt, ...) 
{ 
printf("%p\n",fmt); 
} 

int main() 
{ 
my_print("Hello1 [%d]\n", 1); 
my_print("Hello2 [%d]\n", 2); 
my_print("Hello [%d]\n", 3); 
my_print("Hello3 [%d]\n", 4); 

,它給了我輸出

0x4006ac 
0x4006b9 
0x4006c6 
0x4006d2 

現在我執行strings命令 「-tx A.OUT串」 起來,讓我輸出

200 /lib64/ld-linux-x86-64.so.2 
    2c1 __gmon_start__ 
    2d0 libc.so.6 
    2da printf 
    2e1 __libc_start_main 
    2f3 GLIBC_2.2.5 
    639 l$ L 
    63e t$(L 
    643 |$0H 
    6ac Hello1 [%d] 
    6b9 Hello2 [%d] 
    6c6 Hello [%d] 
    6d2 Hello3 [%d] 

我知道字符串給了我一個二進制文件a.out偏移字符串,但我想知道是否有可能從偏移量開始打印起始地址。 例如Hello1 strings command輸出說「6ac Hello1 [%d]」其中作爲程序的輸出說0x4006ac,我希望我的程序應該打印掩碼值,並可以說,6ac是我應該期望從字符串命令的輸出。

+2

可執行文件中的字符串(或其他)位置與執行過程中加載的虛擬地址之間沒有關係。不在普通的桌面操作系統上。如果您想知道可執行文件的外觀如何,請閱讀有關[ELF](http://en.wikipedia.org/wiki/Executable_and_Linkable_Format)的更多信息。 –

+0

我嘗試過不一樣,但一些如何與這個問題有關,但還沒有得到完美的解決方案。你可以檢查它。 > http://stackoverflow.com/questions/12512485/how-to-get-the-address-of-a-file我知道有一些方法來獲取存儲在內存中的文件的起始地址。我我正在搜索它。希望能幫助到你。 – pradipta

回答

0

如果這是C,那麼你正在使用可變參數不正確。

#include <stdarg.h> 

int my_print(char *fmt, ...) 
{ 
    va_list vl ; 
    va_start(vl, fmt) ; 
    vprintf(fmt, vl); 
} 

int main() 
{ 
    my_print("Hello1 [%d]\n", 1); 
    my_print("Hello2 [%d]\n", 2); 
    my_print("Hello [%d]\n", 3); 
    my_print("Hello3 [%d]\n", 4); 
} 

參見C書中的details

你做了什麼如下。你可以定義一個具有可變數量參數的函數,但是你從不使用這些參數。相反,您將它作爲指向字符串的指針傳遞,並將其作爲printf的參數,並使用與格式完全不同的內容。 printf,正確地,打印您傳遞的字符串的指針(這是打算作爲一種格式...)。

+1

#include 包含上述功能的定義。 – fayyazkl

+0

感謝您的迴應,但我正在尋找要打印的地址,因爲它是通過'strings'命令打印的。 – Vaibhav

+0

對不起,你的代碼很混亂 - 它看起來像你試圖實現別的東西。 – January

相關問題