匯入表注入

2021-09-06 03:38:50 字數 2938 閱讀 8161

程式開始執行時,引導程式根據匯入表的dll名字載入dll。首先在執行目錄下查詢dll,如果找到,則把他載入程序式空間。如果沒找到則在系統目錄下繼續尋找。可以通過這乙個特點,在原有的匯入表後面增加乙個匯入表結構(int和iat表至少有乙個函式的名字)。

這就是匯入表注入。

自定義的要寫入的結構

typedef struct _new_import_table

new_import_table, *pnewimporttable;

image_import_descriptor;

*/ //遍歷匯入表得到匯入表的大小

dword index = 0;

pimage_import_descriptor piid=(pimage_import_descriptor)((pchar)pimage+ importtable_foa);

while (piid->firstthunk&&piid->originalfirstthunk)

//獲取新增加節的foa

pvoid psectiontable = null;

getpesectiontable(pimage, &psectiontable, getnumberofsections(pimage));

dword writeaddr_foa =((pimage_section_header)psectiontable)->pointertorawdata;

//複製原來的匯入表

memcpy_s((char*)pimage+ writeaddr_foa, index*sizeof(image_import_descriptor), (pchar)pimage + importtable_foa, index * sizeof(image_import_descriptor));

//修改匯入表的virtualaddress

((pimage_optional_header32)poptionheader)->datadirectory[image_directory_entry_import].virtualaddress = foa_to_rva(pimage, writeaddr_foa);

//構建兩個image_import_descriptor結構 第二個全0結構。

//得到新加入的匯入表的foa

dword newimprttable_foa = writeaddr_foa + index * sizeof(image_import_descriptor);

//新寫入開始的指標

pnewimporttable pnewimporttable =(pnewimporttable)((char*)pimage + writeaddr_foa + index * sizeof(image_import_descriptor));

//需要找到的foa值: dll名字的foa 匯入函式名字的foa

// iat 表的foa int表的foa 寫入 iid originalfitstthunk fitstthunk

//注意 iat表存放的是匯入函式名前兩個位元組的rva hint

//iid 的originalfitstthunk存放int表的rva

//iid 的fitstthunk存放iat表的rva

//先寫入函式名字和 dll名字 先寫入 函式名 再寫入dll名

char lpszfuncname = "show";

char lpszdllname = "inject.dll";

//獲得函式名的長度 strlen 返回的長度不包括0結尾

dword sizoffuncname = strlen(lpszfuncname);

//獲得dll名字的長度

dword sizeofdllname = strlen(lpszdllname);

// 先寫入 函式名

memcpy_s((pchar)pnewimporttable+sizeof(new_import_table)-2,

sizoffuncname,

lpszfuncname,

sizoffuncname);

//再寫入dll名

memcpy_s((pchar)pnewimporttable + sizeof(new_import_table)+ sizoffuncname+1-2,

sizeofdllname,

lpszdllname,

sizeofdllname);

//需要找到的foa值: 匯入函式名字的foa dll名字的foa

dword funcname_foa = newimprttable_foa + 56;

dword dllname_foa = funcname_foa + sizoffuncname + 3;//這裡加3的原因是因為funcname_foa的位置是在hint索引的兩位元組位置+上函式的0結尾就是3位元組

dword int_foa = newimprttable_foa + 40;

dword iat_foa = newimprttable_foa + 48;

pnewimporttable->int=foa_to_rva(pimage, funcname_foa);

pnewimporttable->iat = foa_to_rva(pimage, funcname_foa);

pnewimporttable->iid.originalfirstthunk = foa_to_rva(pimage, int_foa);

pnewimporttable->iid.firstthunk = foa_to_rva(pimage, iat_foa);

pnewimporttable->iid.name= foa_to_rva(pimage, dllname_foa);

imagebuffertofile(pimage,"c:/injectover.exe");

}

關於匯入表

寫一篇關於匯入表的文章。逆向脫殼,找到入口點之後,dump。一般都會遇到要修復匯入表的問題,因而了解匯入表就有必要。import address table 由於匯入函式就是被程式呼叫但其執行 又不在程式中的函式,這些函式的 位於乙個或者多個dll 中.當pe 檔案被裝入記憶體的時候,windows...

Dll注入技術之登錄檔注入

黑客反病毒論壇 dll注入技術之reg注入 dll注入技術指的是將乙個dll檔案強行載入到exe檔案中,並成為exe檔案中的一部分,這樣做的目的在於方便我們通過這個dll讀寫exe檔案記憶體資料,例如 hook exe檔案中的api 或以被注入exe的身份去執行一些操作等等。reg注入原理是利用在w...

注入技術 修改輸入表完成DLL注入

參考自 加密與解密 第4版 第12章 注入技術 dll檔案 細節省略,通過使用messagebox函式來顯示訊息框,僅此而已。關於dll檔案的編寫,也是日後要好好學習的點。dll檔案也有自己的主函式,博主未編寫用於攻擊的dll 即使編寫了也不敢公然發 故在此一筆帶過了。本文的重點是修改輸入表,故我們...