我有興趣使用靜態方法從x86-64可執行文件構建CFG。包含「main」函數時遇到問題,因爲沒有預先計算的主函數跳轉;在程序實際運行之前,似乎不能計算跳轉。因此,我的CFG缺少最重要的功能之一 - 主要功能!我如何靜態確定_main的位置?如何確定_main在x86-64可執行文件中的位置?
1
A
回答
2
欲瞭解更多信息,請閱讀Microsoft PE specification。
獲取入口點地址的實際PE可執行文件的
基地(長期image
在文檔參訪)位於老的DOS .exe
MZ可執行文件。每個可執行文件的前兩個字節是ASCII'M'和'Z'。 如今,DOS標頭被跳過。它用來包含數值,如起始CS
,IP
,SS
或SP
。
- 獲得文件中偏移量爲
0x3C
的值。它是PE頭的開始。
PE頭存儲像目標機器,段數等字段。這些東西對你來說並不重要。
您可以簡單地跳過整個PE標頭。 (將
0x14
添加到您的指針 -sizeof(PE_HEADER_S)==20
)將
20
字節添加到指針後,即指向PE可選標頭標準字段的起始位置。在抵消0x10
,有DWORD
其中包含入口點相對於圖像基地址。
獲取文件入口點
獲取文件的入口點偏移的偏移量是有點難度。該過程如下所示:
- 查找包含入口點的部分。通常它是
.code
部分,但如果比較具有代碼基的部分的開始(代碼基值位於PE可選標頭標準字段中),則會更好。 - 部分的虛擬子地址(當加載可執行文件時,簡單地說就是在內存中啓動部分)=>您將獲得入口點的偏移量(偏移量相對於部分的開始處是相對的)。
- 我們已經抵消了,所以只需將
.code
部分的文件偏移量添加到上一步的結果中,即可完成。
所有這些步驟通常不會導致您尋址main,而是尋址CRT入口點,它調用_main
函數。
如果你不想得到main的地址,你必須通過PE目標文件並在符號表中找到符號_main
。
相關問題
- 1. 在運行時確定JVM可執行文件的位置
- 2. Inno Setup:確定實際安裝可執行文件的位置
- 3. 如何指定在Cabal文件中輸出可執行文件的位置?
- 4. 如何在C中找到可執行文件的位置?
- 5. 如何在Chrome中調試時確定element.style的執行位置?
- 6. CMake的可執行文件的位置
- 7. 如何找到macosx中可執行文件的位置?
- 8. 確定可執行文件(或庫)是32位還是64位
- 9. 如何確定已安裝的可執行文件在哪裏?
- 10. UNIX cc可執行文件位置
- 11. Quartz .NET Config可執行文件位置
- 12. 確定函數的執行位置?
- 13. 確定從腳本執行的位置
- 14. 確定C#中的可執行文件是64位還是32位
- 15. 如何告訴ANT-exec,git可執行文件的位置
- 16. svn:如何設置文件上的可執行位?
- 17. 如何使用Fortran獲取可執行文件的位置?
- 18. 如何確定列表中的哪個可執行文件正在運行
- 19. 如何在Info.plist中指定32位和64位可執行文件
- 20. 如何確定使用Qt的可執行文件的目錄?
- 21. 在virtualenv中創建可執行主機文件的位置?
- 22. 在MinGW中管理可執行文件的位置
- 23. 如何在Linux rpath中對可執行文件位置進行編碼?
- 24. 如何找到函數所在的可執行文件中的位置?
- 25. 指定的任務可執行文件位置...無效
- 26. 如何確定可執行文件編譯的平臺?
- 27. 確定可執行文件(或庫)是32位還是64位(在Windows上)
- 28. 二進制可執行文件如何知道它在內存中的位置?
- 29. 如何確定文本文件中字符的位置(C++)
- 30. Emacs:確定文件中的位置
從文件頭。它的可執行格式是什麼? – harold
它是ELF64格式。 – RouteMapper
這取決於,但C程序的入口點通常是CRT初始化函數。然後調用由鏈接器定位的main()。聽起來像你需要生成一個地圖文件。 –