複製鏈接
請複製以下鏈接發送給好友

動態嵌入技術

鎖定
動態嵌入技術指的是將自己的代碼嵌入正在運行的進程中的技術。理論上説,在Windows中的每個進程都有自己的私有內存空間,別的進程不允許對這個私有空間進行操作,但是實際上可以利用種種方法進入並操作進程的私有內存。
中文名
動態嵌入技術
特    點
遠程線程技
定    義
將自己的代碼嵌入正在運行
用    途
軟件開發

目錄

動態嵌入技術簡介

動態嵌入技術 動態嵌入技術
在多種動態嵌入技術中(窗口Hook、掛接API、遠程線程),遠程線程技術技術非常簡單,只要有基本的進線程和動態鏈接庫的知識就可以很輕鬆地完成嵌入,下面就為大家介紹一下遠程線程技術。遠程線程技術指的是通過在另一個進程中創建遠程線程的方法進入那個進程的內存地址空間。我們知道,在進程中,可以通過CreateThread函數創建線程,被創建的新線程與主線程(就是進程啓動時被同時自動建立的那個線程)共享地址空間以及其他的資源。但是很少有人知道,通過CreateRemoteThread也同樣可以在另一個進程內創建新線程,被創建的遠程線程同樣可以共享遠程進程(是遠程進程耶!)的地址空間,所以,實際上,我們通過一個遠程線程,進入了遠程進程的內存地址空間,也就擁有了那個遠程進程相當的權限。例如在遠程進程內部啓動一個DLL(與進入進程內部相比,啓動一個DLL是小意思,實際上我們可以隨意篡改那個遠程進程的數據)。

動態嵌入技術操作步驟

首先,我們通過OpenProcess 來打開我們試圖嵌入的進程(如果遠程進程不允許打開,那麼嵌入就無法進行了,這往往是由於權限不足引起的,解決方法是通過種種途徑提升本地進程的權限)
hRemoteProcess = OpenProcess( PROCESS_CREATE_THREAD | //允許遠程創建線程
PROCESS_VM_OPERATION | //允許遠程VM操作
PROCESS_VM_WRITE,//允許遠程VM寫
FALSE, dwRemoteProcessId )
由於我們後面需要寫入遠程進程的內存地址空間並建立遠程線程,所以需要申請足夠的權限(PROCESS_CREATE_THREAD、VM_OPERATION、VM_WRITE)。
然後,我們可以建立LoadLibraryW函數這個線程來啓動我們的DLL,LoadLibraryW函數是在kernel32.dll中定義的,用來加載DLL文件,它只有一個參數,就是DLL文件的絕對路徑名pszLibFileName,(也就是DLL的全路徑文件名),但是由於DLL是在遠程進程內調用的,所以我們首先還需要將這個文件名複製到遠程地址空間:(否則遠程線程是無法讀到這個參數的)
//計算DLL路徑名需要的內存空間
int cb = (1 + lstrlenW(pszLibFileName)) * sizeof(WCHAR);
//使用VirtualAllocEx函數在遠程進程的內存地址空間分配DLL文件名緩衝區
pszLibFileRemote = (PWSTR) VirtualAllocEx( hRemoteProcess, NULL, cb,
MEM_COMMIT, PAGE_READWRITE);
//使用WriteProcessMemory函數將DLL的路徑名複製到遠程進程的內存空間
iReturnCode = WriteProcessMemory(hRemoteProcess,
pszLibFileRemote, (PVOID) pszLibFileName, cb, NULL);
//計算LoadLibraryW的入口地址
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryW");
OK,萬事俱備,我們通過建立遠程線程時的地址pfnStartAddr(實際上就是LoadLibraryW的入口地址)和傳遞的參數pszLibFileRemote(實際上是我們複製過去的DLL的全路徑文件名)在遠程進程內啓動我們的DLL:
//啓動遠程線程LoadLibraryW,通過遠程線程調用用户的DLL文件
hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0,
pfnStartAddr, pszLibFileRemote, 0, NULL);
至此,遠程嵌入順利完成,為了試驗我們的DLL是不是已經正常的在遠程線程運行,我編寫了以下的測試DLL:
BOOL APIENTRY DllMain(HANDLE hModule, DWORD reason, LPVOID lpReserved)
{
char szProcessId[64] ;
switch ( reason )
{
case DLL_PROCESS_ATTACH:
{
//獲取當前進程ID
_itoa ( GetCurrentProcessId(), szProcessId, 10 );
MessageBox ( NULL, szProcessId, "RemoteDLL", MB_OK );
}
default:
return TRUE;
}
}
當我使用RmtDll.exe程序將這個TestDLL.dll嵌入Explorer.exe進程後(PID=1208),該測試DLL彈出了1208字樣的確認框,同時使用PS工具也能看到
Process ID: 1208
C:\WINNT\Explorer.exe (0x00400000)
……
C:\TestDLL.dll (0x100000000)
……
這證明TestDLL.dll已經在Explorer.exe進程內正確地運行了。