37、Windows API 其它相關原理和注意點

來源:互聯網
上載者:User

1、64位作業系統與32位作業系統最大的不同在於定址空間的大小,32位作業系統使用32位元據來表示記憶體位址,因此有232 (4GB)的可用空間,而64位作業系統可以使用16TB的記憶體位址空間。在64位作業系統下,指標和基礎資料型別 (Elementary Data Type)(int)所引用的空間是64位的。

Windows系統中包括的物件類型有很多種。核心對象、GDI繪圖物件、使用者物件等。核心對象是與作業系統對系統的管理相關的對象,比如檔案、進程、事件,網路通訊的Socket等。而GDI對象是指在圖形輸出的相關對象。USER對象是指使用者控制項、菜單、輸入裝置等。

程式進行相關的操作時,都以這些對象作為操作對象,通常以控制代碼作為參數。

在VS的Debug版本中,很多情況下,通過跳轉表調用函數。調用函數時,會使用call指令調用一個跳轉表中的位置,這個位置上通常是一個jmp強制跳轉指令,跳轉到真實的函數程式段處。在Release版本中,不採用函數跳轉表,直接調用函數代碼所在的地址。

在函數調用過程中棧的結構所示:

   

    函數每調用一次,ebp變化一次。棧中依次儲存著參數、返回地址、調用者的ebp、局部變數等。

每一次函數調用都會產生一個這樣的結構,隨著調用的深入在棧中依次增長,因此又稱為棧幀,每一幀對應著一個函數調用。ebp在棧幀中起著關鍵作用,參數的定址、局部變數的定址和函數返回都依賴於ebp。

調用方式影響函數調用時參數的傳遞方式和函數返回後棧的恢複方式。如果為“_cdecl”和“_stdcall”方式則參數均為從右往左入棧,而“_fastcall”使用ECX和EDX寄存器傳遞,餘下部分的參數從右向左儲存在棧中。

在函數返回後,如果函數是“_cdecl”調用方式,則是調用者將esp和ebp指令恢複到調用前的態;而如果是“_stdcall”方式,則由被調用函數將棧恢複到調用前,以便調用函數可以繼續執行。

使用memcpy、strcpy等函數將資料複製到緩衝區(從低記憶體位址到高記憶體位址)。

2、Windows系統的可執行程式結構稱作PE, EXE檔案、DLL檔案、SYS檔案、OCX檔案等都是PE格式的檔案。

具體結構可以參見[1,P565]中介紹。

3、在進行調用函數時,需要知道函數的地址,調用指令(call)以函數地址或儲存函數地址的指標作為參數。在同一模組中的函數,代碼的相對位置都是固定的,call語句的參數在編譯時間都已經計算好,並嵌入到指令中(稱作靜態連結)。但是位於不同模組的函數要相互調用時,被調用函數的地址並不確定。

    系統使用動態連結機制來保證不同模組中函數的正確調用。匯入表和匯出表是兩個在動態連結中需要使用到的重要結構。

匯入表中儲存了一個模組所需調用的外部模組的函數,包括函數所在的DLL函數名等。匯出表儲存了一個模組可被其他模組調用的函數,包括函數名。

在進程建立、模組載入時,系統會從可執行檔的匯入表中擷取資訊,知道需要載入哪些DLL,然後再載入這些需要調用的DLL,從載入的被調用DLL中根據函數名找到需要調用的函數地址,然後將匯入表指定的各函數的地址指標數組的值全部賦值為真實的DLL匯入函數地址。

因此一個模組的匯入表的位置是相對固定的,但是匯入表中的函數指標的值是在動態連結時賦值的。在完成動態串連後,程式就可以通過匯入表中的函數指標調用外部函數了。

4、NTDLL.DLL所匯入的API函數稱作本機API (NativeAPI)。

核心中處理系統調用的結構稱作SSDT,SSDT的全稱是System Service Descriptor Table,也就是系統服務描述符表。

    由ntdll.dll匯出的函數介面就是NativeAPI,由ntdll.dll匯出的Native API的實質是一系列的stub函數,實現了從使用者態向核心態的跳轉,調用系統服務實現API的最終功能。

當從Native API進入核心態以後,系統會根據服務號在SSDT中尋找對應的表項,尋找所調用系統服務函數的真正地址。之後,系統會根據這個地址調用相應的系統服務函數,並返回函數的執行結果。

5、HOOK(掛勾)是一種比較進階的應用。HOOK技術是指修改API的地址或修改API中的代碼,使得程式在調用API函數時,可以監視到調用,或者可以修改參數或傳回值等。

通常有兩種方法可以實現API HOOK,一是遍曆進程中各個模組的匯入表,如果匯入表中調用了所需HOOK的目標函數,則將跳轉地址修改到自訂的函數中;另一種是在目標函數的地址後,在函數的代碼處寫入跳轉指令,一旦API被調用,則會跳轉到自訂的函數中。

因此進行API HOOK,需要進行兩個步驟的工作:一是編寫用於HOOK的函數,使用這些函數去“替換”正常的API函數,HOOK函數中,需要調用原API函數;二是HOOK程式,使用系統原有API的地址或代碼。

6、lib檔案中包括連結時所需的資訊,指明了連結器應該如何處理這些外部函數等(通常是將函數調用加入匯入表中)。

如果為第三方應用程式提供者設計介面,那麼就需要有lib檔案,lib檔案指明了在鏈按時,連結器如何處理這些外部變數、外部函數等。如果需要通過匯入表調用DLL中的函數,就需要在連結時將lib檔案作為連結輸入。

為第三方開發人員提供標頭檔,lib檔案,DLL檔案等。

參考

[1] 精通Windows API 函數、介面、編程執行個體

[2] http://msdn.microsoft.com/en-us/library/aa966039%28VS.85%29.aspx

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.