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