2013-07-17 26 views
1

我有興趣使用靜態方法從x86-64可執行文件構建CFG。包含「main」函數時遇到問題,因爲沒有預先計算的主函數跳轉;在程序實際運行之前,似乎不能計算跳轉。因此,我的CFG缺少最重要的功能之一 - 主要功能!我如何靜態確定_main的位置?如何確定_main在x86-64可執行文件中的位置?

+2

從文件頭。它的可執行格式是什麼? – harold

+0

它是ELF64格式。 – RouteMapper

+2

這取決於,但C程序的入口點通常是CRT初始化函數。然後調用由鏈接器定位的main()。聽起來像你需要生成一個地圖文件。 –

回答

2

欲瞭解更多信息,請閱讀Microsoft PE specification

獲取入口點地址的實際PE可執行文件的

基地(長期image在文檔參訪)位於老的DOS .exe MZ可執行文件。每個可執行文件的前兩個字節是ASCII'M'和'Z'。 如今,DOS標頭被跳過。它用來包含數值,如起始CS,IP,SSSP

  1. 獲得文件中偏移量爲0x3C的值。它是PE頭的開始。

PE頭存儲像目標機器,段數等字段。這些東西對你來說並不重要。

  1. 您可以簡單地跳過整個PE標頭。 (將0x14添加到您的指針 - sizeof(PE_HEADER_S)==20

  2. 20字節添加到指針後,即指向PE可選標頭標準字段的起始位置。在抵消0x10,有DWORD其中包含入口點相對於圖像基地址。

獲取文件入口點

獲取文件的入口點偏移的偏移量是有點難度。該過程如下所示:

  1. 查找包含入口點的部分。通常它是.code部分,但如果比較具有代碼基的部分的開始(代碼基值位於PE可選標頭標準字段中),則會更好。
  2. 部分的虛擬子地址(當加載可執行文件時,簡單地說就是在內存中啓動部分)=>您將獲得入口點的偏移量(偏移量相對於部分的開始處是相對的)。
  3. 我們已經抵消了,所以只需將.code部分的文件偏移量添加到上一步的結果中,即可完成。

所有這些步驟通常不會導致您尋址main,而是尋址CRT入口點,它調用_main函數。

如果你不想得到main的地址,你必須通過PE目標文件並在符號表中找到符號_main

+0

是的,但OP說的格式是ELF64的評論.. – harold

+0

哦,我雖然他需要PE32 + ...嗯。 – user35443

相關問題