1.檢視pe檔案的idt,每乙個dll對應乙個iid(20個位元組,十六進製制下為14),如果原idt有足夠空間,則可以直接在原idt後面新增dll,如果沒有足夠空間,那麼需要將idt遷移至程式空白區域。乙個idt包含多個iid,最後是乙個20位元組的空白區域,所以說足夠空間的意思就是當你加入你自己的dll之後,還要保證idt後面有20位元組的空白區域。
2.檢視idt的檔案大小和對映大小,進行比較(檔案大小-對映大小),如果有足夠空間,則可以在idt後面放入你需要載入的dll,如果沒有足夠空間,則需要在最後乙個節區擴充套件相應空間。
3.(假設現在idt沒有足夠空間,那麼我們要將原來的idt遷移到新的空白位置),遷移新位置的時候一般是找相應節區,看該節區是否有空間放入idt,再判斷該節區是否有空間放入idt時,要檢視該節區頭資訊,確保該空白空間確實可用,具體是看該節區頭的檔案大小和對映大小的差是否足夠大,夠大就可以在該節區放入idt。
1.修改原idt的rva和size
在hxd中修改pe檔案的idt的rva和size,例如你要加入乙個dll,將size的十六進製制資料加上14(10進製的20個位元組,乙個iid),然後修改rva為新的空白區域。
2.刪除繫結匯入表
將bound import table的rva和size設定為0x0。
3.將原idt複製到新的空白區域
複製到新區域後,在idt的最後乙個dll和最後空白20位元組之間新增你的dll的資訊,包括乙個4位元組int的rva,2個空的4位元組,乙個4位元組的dll名稱的rva,乙個4位元組的iat的rva,(總共20個位元組,乙個iid),這3個資料都是相對記憶體位址rva。接著再在你剛才安排的int的rva處填寫乙個rva,這個rva才是真正的int的內容;然後在你剛才寫入的dll名稱的rva處寫入dll的名稱的機器碼(可以用ollydbg,xdbg將字串轉換為機器碼);最後在你剛才寫入的iat的rva處寫入iat的內容的rva,iat內容的rva可以跟int內容的rva相同。注:再寫int的內容時格式是:匯入函式的ordinal+匯入函式的名稱字串(也就是0x00 00+名稱字串)。
載入pe檔案到記憶體時,pe裝載器會修改iat,寫入函式的實際位址,所以相關節區一定要有write可寫屬性。檢視pe檔案的iat所在節區的屬性,如果不可寫,那麼我們手動更改屬性值,將可讀屬性值0x40000040與可寫屬性值0x80000000執行按位或運算(bit or),將屬性值最終變為c0000040即可。
第25章 通過修改PE載入DLL
前面的 沒有什麼特別的意義,了解即可.需要注意的是dummy這段 前面的 主要是為了執行想要的功能,在一載入dll時就能執行.而dummy 函式是為了保證此dll檔案能夠順利的新增到textview.exe檔案的匯入表中 然後由程式在執行時會載入此dll檔案 pe檔案中的idt image dire...
Dll注入 修改PE檔案頭
dll注入,除了常見的遠執行緒注入,掛鉤和修改登錄檔以外還可以通過修改pe檔案頭來達到注入目的,廢話少說先上菜。pe檔案經常會呼叫外部dll檔案,而需要呼叫的dll檔案都會在pe檔案說明,通過 nt頭 可選頭 匯入表 可以找到匯入表,而匯入表就是對需要匯入的每個dll的說明,它實際上是乙個20個位元...
通過修改PE檔案匯入DLL
圖1由上圖我們可以得到以下資訊 idt的rva資訊在檔案偏移160h處,值為84cc idt的大小資訊在檔案偏移164h處,值為64h 1.1轉到idt處檢視具體資訊 轉到84cc也就是檔案偏移76cc 共有5個iid結構體 每個iid20個位元組,對應乙個dll相關資訊 最後乙個iid為null ...