程式開始執行時,引導程式根據匯入表的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 即使編寫了也不敢公然發 故在此一筆帶過了。本文的重點是修改輸入表,故我們...