遠(yuǎn)程線程 注入、、
崆峒網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,崆峒網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為崆峒上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站制作要多少錢,請找那個售后服務(wù)好的崆峒做網(wǎng)站的公司定做!注入有幾個核心的API函數(shù)、、
OpenProcess - 打開目標(biāo)進(jìn)程。
VirtualAllocEx/VirtualFreeEx - 在目標(biāo)進(jìn)程中分配/釋放內(nèi)存空間。
WriteProcessMemory - 在目標(biāo)進(jìn)程中寫入要加載的DLL路徑。
CreateRemoteThread - 遠(yuǎn)程加載DLL的關(guān)鍵函數(shù),用于控制目標(biāo)進(jìn)程調(diào)用API函數(shù)。
//在這里調(diào)LoadLibrary(地址不用傳因為同一機(jī)器加載它所在的Kerner32.dll是相同的、、)
//且LoadLibrary正好只有一個參數(shù)符合遠(yuǎn)程線程規(guī)則、、
LoadLibrary - 目標(biāo)進(jìn)程通過調(diào)用此函數(shù)來加載我們自己編寫的DLL。
思路已經(jīng)有了看細(xì)節(jié)實(shí)現(xiàn)吧、、
void CMyDllInjectDlg::OnInject() //界面按鈕(向它注入本地DLL)
{
if (bMouseDown) //用于判斷是否有進(jìn)程選中的變量前邊已經(jīng)說過、、
{
enableDebugPriv(); //提權(quán) 此函數(shù)在后邊會記錄、有了它就可以O(shè)penProcess任何進(jìn)程、、
//下邊是彈出查找對話框 使用MFC封裝的類:CFileDialog、
CString filter;
CString PathDll;
filter=("(*.dll)|*.dll|All files (*.*)|*.*||"); //過濾這里只要顯示DLL文件就好、、
CFileDialog FindDll(true,NULL,NULL,OFN_HIDEREADONLY,filter); //隱藏只讀復(fù)選框
if(FindDll.DoModal()==IDOK)
{
PathDll = FindDll.GetPathName(); //獲取DLL完整路徑名字、、
}
char* Path = PathDll.GetBuffer(PathDll.GetLength()); //Cstring 轉(zhuǎn)char*
GetBuffer 這個函數(shù)是為一個CString對象重新獲取其內(nèi)部字符緩沖區(qū)的指針、、返回非const故可以修改
//現(xiàn)在得到了注入目標(biāo)進(jìn)程的 DLL的完整路徑名、、存放于Path、、
//打開目標(biāo)進(jìn)程
hkernel32=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION,1,iID);
原型 HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance option
DWORD dwProcessId // process identifier ); 這里說一下第一個參數(shù)、、
OpenProcess第一個參數(shù)指定了三種權(quán)限。在Win32系統(tǒng)下,每個進(jìn)程都擁有自己的4G虛擬地址空間,各個進(jìn)程之間都相互獨(dú)立。如果一個進(jìn)程需要完成跨進(jìn)程的工作的話,那么它必須擁有目標(biāo)進(jìn)程的相應(yīng)操作權(quán)限。
PROCESS_CREATE_THREAD表示我可以通過返回的進(jìn)程句柄在該進(jìn)程中創(chuàng)建新的線程,也就是調(diào)用CreateRemoteThread的權(quán)限;
同理,PROCESS_VM_OPERATION則表示在該進(jìn)程中分配/釋放內(nèi)存的權(quán)限,也就是調(diào)用VirtualAllocEx/VirtualFreeEx的權(quán)限;
PROCESS_VM_WRITE表示可以向該進(jìn)程的地址空間寫入數(shù)據(jù),也就是調(diào)用WriteProcessMemory的權(quán)限。
//申請空間將我們的DLL路徑寫到目標(biāo)進(jìn)程地址空間里、、(進(jìn)程是獨(dú)立的哦)、、
//之前的IAT HOOK是更改內(nèi)存信息VirtualQuery VirtualProtect、、現(xiàn)在是申請內(nèi)存空間、、VirtualAllocEx
LPVOID pDllAddr=VirtualAllocEx(hkernel32,NULL,strlen(Path),MEM_COMMIT,PAGE_READWRITE);
//將DLL路徑Path寫到申請的pDllAddr地址空間去、、、
WriteProcessMemory(hkernel32, pDllAddr,LPVOID(Path),strlen(Path),NULL);
//得到LoadLibraryA函數(shù)的地址因為kernel32.dll加載時候的基地址對于一個機(jī)器是固定的、、
//如果是一個不固定需要將函數(shù)地址也向DLL路徑那樣寫到目標(biāo)進(jìn)程的地址空間中、、
DWORD pLoadAddr=(DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
//通過CreateRemoteThread將LoadLibrary作為目標(biāo)進(jìn)程的一個線程來啟動、、
//這樣就可以可以做到使目標(biāo)進(jìn)程調(diào)用LoadLibrary加載咱得DLL文件了、、
Handle hThread = CreateRemoteThread(hkernel32,NULL,0,(LPTHREAD_START_ROUTINE) pLoadAddr, pDllAddr,NULL,0);
//等待LoadLibrary加載完畢即這個遠(yuǎn)程線程執(zhí)行完畢、、
WaitForSingleObject( hThread, INFINITE ); //返回0核心對象已被激活
//第二個參數(shù)dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。
//若為0,則該函數(shù)立即返回;
//若為INFINITE,則線程一直被掛起,直到hHandle所指向的對象變?yōu)橛行盘枲顟B(tài)時為止。
CloseHandle(hkernel32);
CloseHandle(Thread);
//釋放目標(biāo)進(jìn)程中申請的空間
VirtualFreeEx(hThread , pDllAddr, strlen(Path), MEM_DECOMMIT );
CloseHandle( hThread );
CloseHandle( hProcess ); //關(guān)閉句柄釋放申請的內(nèi)存空間、、、
}
else
{
MessageBox("當(dāng)前沒有進(jìn)程被選中、無法操作!","進(jìn)程小軟!",MB_OK);
}
}
//至此結(jié)束、、測試程序可以隨便寫一個調(diào)MessageBox的、、
#include "stdio.h"
#include "windows.h"
int main()
{
Printf(“輸入一個字符 啟動 MessageBox 以便測試、、”);
getchar(); //此時打開注入工具向此進(jìn)程注入DLL、、
MessageBoxA(NULL, "HOOK失敗", "源程序的MessageBox", MB_OK);
return 0;
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。