都是自己編的VS2003代碼格式歡迎大家指點改正
本人介紹下注入VS2003代碼到PE,文件格式的Import Table(導入表,也有譯為“引入表”)技術,其也被稱為API重定向技術,這些都是通過平時的學習和實踐中得出的結果。
讓我們想像一下:如果我們可以通過操作導入表thunks將導入函數的入口點(thoroughfare)重定向到我們的指定的例程,用我們的例程過濾導入(消息)就成為可能。此外,我#t#們可以通過這個功能實現安排給我們適當的例程,VS2003代碼專業的Portable Executable (PE) Protectors正是這么來做的,另外一些種類的rootkits使用這個方法通過一個特洛伊木馬嵌入其惡意代碼到受害者。在反向工程世界里,我們稱之為:API重定向技術,然而我不準備通過源代碼描述這個領域的所有觀點,本文只是通過一個簡單代碼介紹一下這個技術的概況。我將描述這個源代碼中沒有的其他一些問題;我不能公開這些代碼,原因是其關系到一些商業項目或可能會被懷有惡意者利用,然而我想本文可以被用來作為一個關于該主題的入門。
進入導入表
PE文件格式包括:MS-DOS header、NT headers、Sections headers和Section images(譯注:正如很多技術讀物上一樣,其實header可以譯為“頭”,image可譯為“映像”,但本文正文在不影響理解的前提下盡量保留原文術語,以免誤解。)正如你在下圖中所看到的。MS-DOS header是自DOS時代到Windows時代在所有微軟可執行文件格式(executable file format)公有的。NT headers的思想來源于UNIX系統的Executable and Linkable Format (ELF),當然Portable Executable (PE)格式是Linux Executable and Linkable Format (ELF)的姐妹。PE 格式包括"PE" Signature、Common Object File Format (COFF) header、Portable Executable Optimal header和Section headers。
Portable Executable 文件格式結構
在Portable Executable Optional header,有一些數據目錄(data directories)描述了當前進程在虛擬內存中主信息表(the principal information tables)的相對位置和大小。這些表可以有關于VS2003代碼資源的信息、import(導入)、export(導出)、relocation(重定位)、Debug(調試)、thread local storage(線程本地存儲)和COM運行時。沒有導入表想要找到一個PE可執行文件是不可能的;
該表包含DLL的名稱和Functions(函數)名稱,這些是當程序意圖通過它們的虛地址來請求(調用)它們時所必需的。在Console executable files(控制臺可執行文件)中沒有發現資源表(resource table);然而它是擁有Graphic User Interface (GUI)的Windows可執行文件的至關重要的部分。導出表(export table)在一個動態鏈接庫想要導出它的函數到外界時是必需的,并且它也在OLE Active-X容器中。Dot NET虛擬機在沒有COM+ runtime header下時不能被執行。正如你看到的VS2003代碼,在PE格式中每個表都有特定的委派任務。
Data Directories(數據目錄)
- PIMAGE_NT_HEADERS pimage_nt_headers = ImageNtHeader(pImageBase);
- DWORD it_voffset = pimage_nt_headers->OptionalHeader.
- DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
- PIMAGE_DOS_HEADER pimage_dos_header = PIMAGE_DOS_HEADER(pImageBase);
- PIMAGE_NT_HEADERS pimage_nt_headers = (PIMAGE_NT_HEADERS)
- (pImageBase + pimage_dos_header->e_lfanew);
- DWORD it_voffset = pimage_nt_headers->OptionalHeader.
- DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress