我一直在尋找最近創造一種新的母語。我理解PE格式的(非常)基礎知識,並且我從一個非常友好的界面中抓取了一個彙編程序,我已經成功地用它來實現一些簡單的功能。但是我遇到了一個使用函數庫的問題。我之前從動態編譯的函數中調用庫函數的唯一方法是手動傳入函數指針 - 這是我創建PE文件並在其自己的進程中執行它們時無法執行的操作。現在,我不打算使用CRT,但我需要訪問Win API來實現我自己的標準庫。如何生成對WinAPI函數的引用,以便PE加載程序將其修補?WinAPI函數在新的.exe
回答
您需要編寫一個導入表。它基本上是您希望在您的應用程序中使用的函數名稱列表。它是由PE頭指向的。加載器將DLL文件加載到進程內存空間中,在其導出表中找到請求的函數,並將其地址留在導入表中。那你通常在那裏取消這個和jmp
。
查看Izelion's assembly tutorial瞭解詳細信息和asm示例。
如何通過發射C而不是裝配來啓動?然後直接寫入ASM只是一個優化。
我並不是一個開玩笑的人:在最終的本地代碼通過之前,大多數編譯器都會生成某種中間代碼。
我意識到你正在試圖擺脫所有以null定義的rigmarole,但是你仍然需要WinAPI函數。
重新閱讀您的問題:您意識到可以通過調用LoadLibrary()來獲得WinAPI函數地址,然後調用GetProcAddress(),然後設置調用......對吧?
如果您想了解如何從純裝配中引導:舊的SDK有ASM示例代碼,可能新的代碼仍然可以。如果他們不這樣做,DDK會。
我知道。我不放棄C的原因有一半是因爲我不想被束縛在CRT上,const char * strings和#include等類似。另一個原因是因爲我只有一個準時制彙編程序。現在,我絕對會生成一個AST和一箇中介代碼等等,但是我想確保我的系統在整個實施之前都可以工作。可行性研究,如果你願意的話。 – Puppy 2010-11-01 14:30:21
LoadLibrary是WinAPI的一部分。我如何在不使用WinAPI的情況下使用它? – Puppy 2010-11-01 14:46:51
它在KERNEL中,它從一開始就自動映射到您的流程中。如果不是,那麼您或系統將如何加載其他庫,包括KERNEL? – siride 2010-11-01 14:55:11
- 1. WinAPI的FindWindow函數
- 2. WinAPI的CreateFile函數
- 3. 搜索winapi函數
- 4. 幫助GetGlyphOutline函數(WinAPI)
- 5. 是否有WinAPI函數'ExistFile'?
- 6. CryptDecrypt winapi函數出錯?
- 7. 如何在java中使用winapi函數?
- 8. 在* .VBS文件中導入WinAPI函數
- 9. C#,Powershell,未編號的WinApi函數GetFontResourceInfoW
- 10. WinAPI的createfile文件函數2
- 11. 如何通過此函數的指針調用winapi函數?
- 12. WinAPI函數啓動幫助文件
- 13. 「APIENTRY _tWinMain」 和 「WINAPI WinMain函數」 差異
- 14. 掛鉤WinAPI函數調用DLL
- 15. 如何從C++調用WinApi函數?
- 16. 如何從PHP調用winapi函數?
- 17. 什麼是winapi函數聲明約定?
- 18. QtConcurrent :: run()不接受__stdcall/WINAPI函數
- 19. PathIsRelative函數是WinAPI錯誤嗎?
- 20. 函數EXE到DLL(Delphi)
- 21. 使用winapi在笛卡爾座標系中的函數
- 22. 在WINAPI
- 23. 在WINAPI
- 24. C++ WINAPI窗口不刷新
- 25. C++ WinAPI TextOut()更新文本
- 26. 更新標題欄WINAPI
- 27. 調用DLL中的EXE函數
- 28. 如何回調exe中的函數? (linux)
- 29. WinAPI:鉤子函數中的非dll數據
- 30. 如何獲得hooked winapi函數的通話後參數?
也使用鏈接器* verboten *嗎? – 2010-11-01 15:22:39
@Hans:我將使用鏈接器。 – Puppy 2010-11-01 16:26:26