2010-11-01 36 views
0

我一直在尋找最近創造一種新的母語。我理解PE格式的(非常)基礎知識,並且我從一個非常友好的界面中抓取了一個彙編程序,我已經成功地用它來實現一些簡單的功能。但是我遇到了一個使用函數庫的問題。我之前從動態編譯的函數中調用庫函數的唯一方法是手動傳入函數指針 - 這是我創建PE文件並在其自己的進程中執行它們時無法執行的操作。現在,我不打算使用CRT,但我需要訪問Win API來實現我自己的標準庫。如何生成對WinAPI函數的引用,以便PE加載程序將其修補?WinAPI函數在新的.exe

+0

也使用鏈接器* verboten *嗎? – 2010-11-01 15:22:39

+0

@Hans:我將使用鏈接器。 – Puppy 2010-11-01 16:26:26

回答

2

您需要編寫一個導入表。它基本上是您希望在您的應用程序中使用的函數名稱列表。它是由PE頭指向的。加載器將DLL文件加載到進程內存空間中,在其導出表中找到請求的函數,並將其地址留在導入表中。那你通常在那裏取消這個和jmp

查看Izelion's assembly tutorial瞭解詳細信息和asm示例。

+0

因此,基本上,我爲指針創建空間,然後通過PE加載器和格式完成剩下的魔法。 – Puppy 2010-11-01 14:51:50

+0

是的,只有指針必須是非常特定結構的一部分。 – kichik 2010-11-01 14:59:45

+0

對於調用常規函數指針,我還需要執行這個技巧嗎?而且 - call和jmp有什麼區別? – Puppy 2010-11-01 18:18:57

0

如何通過發射C而不是裝配來啓動?然後直接寫入ASM只是一個優化。

我並不是一個開玩笑的人:在最終的本地代碼通過之前,大多數編譯器都會生成某種中間代碼。

我意識到你正在試圖擺脫所有以null定義的rigmarole,但是你仍然需要WinAPI函數。

重新閱讀您的問題:您意識到可以通過調用LoadLibrary()來獲得WinAPI函數地址,然後調用GetProcAddress(),然後設置調用......對吧?

如果您想了解如何從純裝配中引導:舊的SDK有ASM示例代碼,可能新的代碼仍然可以。如果他們不這樣做,DDK會。

+0

我知道。我不放棄C的原因有一半是因爲我不想被束縛在CRT上,const char * strings和#include等類似。另一個原因是因爲我只有一個準時制彙編程序。現在,我絕對會生成一個AST和一箇中介代碼等等,但是我想確保我的系統在整個實施之前都可以工作。可行性研究,如果你願意的話。 – Puppy 2010-11-01 14:30:21

+0

LoadLibrary是WinAPI的一部分。我如何在不使用WinAPI的情況下使用它? – Puppy 2010-11-01 14:46:51

+0

它在KERNEL中,它從一開始就自動映射到您的流程中。如果不是,那麼您或系統將如何加載其他庫,包括KERNEL? – siride 2010-11-01 14:55:11