封包的技術是實現

2021-04-13 03:00:03 字數 4346 閱讀 9983

圖三:pe格式大致結構圖(003.jpg)

pe格式檔案一開始是一段dos程式,當你的程式在不支援windows的環境中執行時,它就會顯示「this program cannot be run in dos mode」這樣的警告語句,接著這個dos檔案頭,就開始真正的pe檔案內容了。首先是一段稱為「image_nt_header」的資料,其中是許多關 於整個pe檔案的訊息,在這段資料的尾端是乙個稱為data directory的資料表,通過它能快速定位一些pe檔案中段(section)的位址。在這段資料之後,則是乙個 「image_section_header」的列表,其中的每一項都詳細描述了後面乙個段的相關資訊。接著它就是pe檔案中最主要的段資料了,執行代 碼、資料和資源等等資訊就分別存放在這些段中。

在所有的這些段裡,有乙個被稱為「.idata」的段(輸入資料段)值得我們去注意,該段中包含著一些被稱為輸入位址表(iat,import address table)的資料列表。每個用隱式方式載入的api所在的dll都有乙個iat與之對應,同時乙個api的位址也與iat中一項相對應。當乙個應用程式 載入到記憶體中後,針對每乙個api函式呼叫,相應的產生如下的彙編指令:

jmp dword ptr [******xx]

或call dword ptr [******xx]

其中,[******xx]表示指向了輸入位址表中乙個項,其內容是乙個dword,而正是這個dword才是api函式在記憶體中的真正位址。因此我們要想攔截乙個api的呼叫,只要簡單的把那個dword改為我們自己的函式的位址。

(2) 、修改呼叫api函式**

從上面對pe檔案格式的分析可知,修改呼叫api函式**其實是修改被呼叫api函式在輸入位址表中iat項內容。由於windows系統對應用程式 指令**位址空間的嚴密保護機制,使得修改程式指令**非常困難,以至於許多高手為之編寫vxd進入ring0。在這裡,我為大家介紹一種較為方便的方法 修改程序記憶體,它僅需要呼叫幾個windows核心api函式,下面我首先來學會一下這幾個api函式:

dword virtualquery(

lpcvoid lpaddress, // address of region

pmemory_basic_information lpbuffer, // information buffer

dword dwlength // size of buffer

); 該函式用於查詢關於本程序內虛擬位址頁的資訊。其中,lpaddress表示被查詢頁的區域位址;lpbuffer表示用於儲存查詢頁資訊的緩衝;dwlength表示緩衝區大小。返回值為實際緩衝大小。

bool virtualprotect(

lpvoid lpaddress, // region of committed pages

size_t dwsize, // size of the region

dword flnewprotect, // desired access protection

pdword lpfloldprotect // old protection

); 該函式用於改變本程序內虛擬位址頁的保護屬性。其中,lpaddress表示被改變保護屬性頁區域位址;dwsize表示頁區域大小; flnewprotect表示新的保護屬性,可取值為page_readonly、page_readwrite、page_execute等; lpfloldprotect表示用於儲存改變前的保護屬性。如果函式呼叫成功返回「t」,否則返回「f」。

有了這兩個api函式,我們就可以隨心所欲的修改程序記憶體了。首先,呼叫virtualquery()函式查詢被修改記憶體的頁資訊,再根據此資訊呼叫 virtualprotect()函式改變這些頁的保護屬性為page_readwrite,有了這個許可權您就可以任意修改程序記憶體資料了。下面一段** 演示了如何將程序虛擬位址為0x0040106c處的位元組清零。

byte* pdata = 0x0040106c;

memory_basic_information mbi_thunk;

//查詢頁資訊。

virtualquery(pdata, &mbi_thunk, sizeof(memory_basic_information));

//改變頁保護屬性為讀寫。

virtualprotect(mbi_thunk.baseaddress,mbi_thunk.regionsize,

page_readwrite, &mbi_thunk.protect);

//清零。

*pdata = 0x00;

//恢復頁的原保護屬性。

dword dwoldprotect;

virtualprotect(mbi_thunk.baseaddress,mbi_thunk.regionsize,

mbi_thunk.protect, &dwoldprotect);

(3)、注入外掛程式**進入被掛遊戲程序中

完成了定位和修改程式中呼叫api函式**後,我們就可以隨意設計自定義的api函式的替代函式了。做完這一切後,還需要將這些**注入到被外掛程式遊戲 程式程序記憶體空間中,不然遊戲程序根本不會訪問到替代函式**。注入方法有很多,如利用全域性鉤子注入、利用登錄檔注入擋截user32庫中的api函式、 利用createremotethread注入(僅限於nt/2000)、利用bho注入等。因為我們在動作模擬技術一節已經接觸過全域性鉤子,我相信聰明 的讀者已經完全掌握了全域性鉤子的製作過程,所以我們在後面的例項中,將繼續利用這個全域性鉤子。至於其它幾種注入方法,如果感興趣可參閱msdn有關內容。

有了以上理論基礎,我們下面就開始製作乙個擋截messageboxa和recv函式的例項,在開發遊戲外掛程式 時,可以此例項為框架,加入相應的替代函式和處理**即可。此例項的開發過程如下:

(1) 開啟前面建立的activekey專案。

(2) 在activekey.h檔案中加入hookapi結構,此結構用來儲存被擋截api函式名稱、原api函式位址和替代函式位址。

typedef struct tag_hookapi

hookapi, *lphookapi;

(3) 開啟activekey.cpp檔案,首先加入乙個函式,用於定位輸入庫在輸入資料段中的iat位址。**如下:

extern "c" __declspec(dllexport)pimage_import_descriptor

locationiat(hmodule hmodule, lpcstr szimportmod)

//其中,hmodule為程序模組控制代碼;szimportmod為輸入庫名稱。

if(pimportdesc->name == null) return null;

return pimportdesc;

} 再加入乙個函式,用來定位被擋截api函式的iat項並修改其內容為替代函式位址。**如下:

extern "c" __declspec(dllexport)

hookapibyname( hmodule hmodule, lpcstr szimportmod, lphookapi phookapi)

//其中,hmodule為程序模組控制代碼;szimportmod為輸入庫名稱;phookapi為hookapi結構指標。 }

porigthunk++;

prealthunk++;

} setlasterror(error_success); //設定錯誤為error_success,表示成功。

return true;

} (4) 定義替代函式,此例項中只給messageboxa和recv兩個api進行擋截。**如下:

static int winapi messageboxa1 (hwnd hwnd , lpctstr lptext, lpctstr lpcaption, uint utype)

static int winapi recv1(socket s, char far *buf, int len, int flags )

(5) 在keyboardproc函式中加入啟用擋截api**,在if( wparam == 0x79 )語句中後面加入如下else if語句:

......

//當啟用f11鍵時,啟動擋截api函式功能。

else if( wparam == 0x7a )

......

(6) 在activekey.cpp中加入標頭檔案宣告 "#include "wsock32.h"。 從「工程」選單中選擇「設定」,彈出project setting對話方塊,選擇link標籤,在「物件/庫模組」中輸入ws2_32..lib。

(7) 重新編譯activekey專案,產生activekey.dll檔案,將其拷貝到simulate.exe目錄下。執行simulate.exe並啟動 全域性鉤子。啟用任意應用程式,按f11鍵後,執行此程式中可能呼叫messageboxa函式的操作,看看資訊框是不是有所變化。同樣,如此程式正在接收 網路資料報,就可以實現封包功能了。

python元祖封包 python的封包與解包

python的封包與解包 1.python 封包 將多個值賦值給乙個變數時,python會自動將這些值封裝成元組,這個特性稱之為封包 a 1,2,3 print a,type a 1,2,3 當函式返回多個數值時,也會進行封包 def test return 1,2,3 a test print a...

用Visual C 實現網路封包監視

本文向大家介紹windows sockets的一些關於用c 實現的原始套接字 raw socket 的程式設計,以及在此基礎上實現的網路封包監視技術。同winsock1相比,winsock2最明顯的就是支援了raw socket套接字型別,使用raw socket,可把網絡卡設定成混雜模式,在這種模...

EJB是基於哪些技術實現的

size small ejb包括session bean entity bean message driven bean,基於jndi rmi jta等技術實現。sessionbean在j2ee應用程式中被用來完成一些伺服器端的業務操作,例如訪問資料庫 呼叫其他ejb元件。entitybean被用來...