版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、推薦精選閑著沒(méi)事整理了一下DLL的N種注入方法,對(duì)學(xué)習(xí)外掛的朋友,應(yīng)該有用!第一種方法:利用 CreateRemoteThread 遠(yuǎn)程建立線程的方式注入DLL首先,我們要提升自己的權(quán)限,因?yàn)檫h(yuǎn)程注入必不可免的要訪問(wèn)到目標(biāo)進(jìn)程的內(nèi)存空間,如果沒(méi)有足夠的系統(tǒng)權(quán)限,將無(wú)法作任何事下面是這個(gè)函數(shù)是用來(lái)提升我們想要的權(quán)限用的function EnableDebugPriv : Boolean;var hToken : THANDLE; tp : TTokenPrivileges; rl : Cardinal;begin
2、60;result := false; /打開(kāi)進(jìn)程令牌環(huán) OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken); /獲得進(jìn)程本地唯一ID if LookupPrivilegeValue(nil, 'SeDebugPrivilege', tp.Privileges0.Luid) then begin tp.PrivilegeCou
3、nt := 1; tp.Privileges0.Attributes := SE_PRIVILEGE_ENABLED; /調(diào)整權(quán)限 result := AdjustTokenPrivileges(hToken, False, tp, sizeof(tp), nil, rl); end;end;關(guān)于 OpenProcessToken() 和 AdjustTokenPrivileges() 兩個(gè) API 的簡(jiǎn)單介紹:OpenProcessToken():獲得進(jìn)程訪問(wèn)令牌的句柄
4、function OpenProcessToken( ProcessHandle: THandle; /要修改訪問(wèn)權(quán)限的進(jìn)程句柄 DesiredAccess: DWORD; /指定你要進(jìn)行的操作類型 var TokenHandle: THandle ): BOOL; /返回的訪問(wèn)令牌指針AdjustTokenPrivileges() :調(diào)整進(jìn)程的權(quán)限 function AdjustTokenPrivileges( TokenHandle: THan
5、dle; / 訪問(wèn)令牌的句柄 DisableAllPrivileges: BOOL; / 決定是進(jìn)行權(quán)限修改還是除能(Disable)所有權(quán)限 const NewState: TTokenPrivileges; / 指明要修改的權(quán)限,是一個(gè)指向TOKEN_PRIVILEGES結(jié)構(gòu)的指針,該結(jié)構(gòu)包含一個(gè)數(shù)組,數(shù)據(jù)組的每個(gè)項(xiàng)指明了權(quán)限的類型和要進(jìn)行的操作; BufferLength: DWORD; /結(jié)構(gòu)PreviousState的長(zhǎng)度,如果Previou
6、sState為空,該參數(shù)應(yīng)為 0 var PreviousState: TTokenPrivileges; / 指向TOKEN_PRIVILEGES結(jié)構(gòu)的指針,存放修改前的訪問(wèn)權(quán)限的信息 var ReturnLength: DWORD /實(shí)際PreviousState結(jié)構(gòu)返回的大小 ) : BOOL;遠(yuǎn)程注入DLL其實(shí)是通過(guò) CreateRemoteThread 建立一個(gè)遠(yuǎn)程線程調(diào)用 LoadLibrary 函數(shù)來(lái)加載我們指定的DLL,可是如何能讓遠(yuǎn)程線程知道我要加載DLL呢,要知道在Win32系統(tǒng)下,每個(gè)進(jìn)程都擁有自己
7、的4G虛擬地址空間,各個(gè)進(jìn)程之間都是相互獨(dú)立的。所我們需要在遠(yuǎn)程進(jìn)程的內(nèi)存空間里申請(qǐng)一塊內(nèi)存空間,寫入我們的需要注入的 DLL 的路徑 需要用到的 API 函數(shù)有:OpenProcess():打開(kāi)目標(biāo)進(jìn)程,得到目標(biāo)進(jìn)程的操作權(quán)限,詳細(xì)參看MSDN function OpenProcess( dwDesiredAccess: DWORD; / 希望獲得的訪問(wèn)權(quán)限 bInheritHandle: BOOL; / 指明是否希望所獲得的句柄可以繼承 dwPro
8、cessId: DWORD / 要訪問(wèn)的進(jìn)程ID ): THandle; VirtualAllocEx():用于在目標(biāo)進(jìn)程內(nèi)存空間中申請(qǐng)內(nèi)存空間以寫入DLL的文件名 function VirtualAllocEx( hProcess: THandle; / 申請(qǐng)內(nèi)存所在的進(jìn)程句柄 lpAddress: Pointer; / 保留頁(yè)面的內(nèi)存地址;一般用nil自動(dòng)分配 dwSize, / 欲分配的內(nèi)存大小,字節(jié)單
9、位;注意實(shí)際分 配的內(nèi)存大小是頁(yè)內(nèi)存大小的整數(shù)倍 flAllocationType: DWORD; flProtect: DWORD ): Pointer; WriteProcessMemory():往申請(qǐng)到的空間中寫入DLL的文件名 function WriteProcessMemory( hProcess: THandle; /要寫入內(nèi)存數(shù)據(jù)的目標(biāo)進(jìn)程句柄 const lpBaseAddress: Pointer; /要
10、寫入的目標(biāo)進(jìn)程的內(nèi)存指針, 需以 VirtualAllocEx() 來(lái)申請(qǐng) lpBuffer: Pointer; /要寫入的數(shù)據(jù) nSize: DWORD; /寫入數(shù)據(jù)的大小 var lpNumberOfBytesWritten: DWORD /實(shí)際寫入的大小 ): BOOL; 然后就可以調(diào)用 CreateRemoteThread 建立遠(yuǎn)程線程調(diào)用 LoadLibrary 函數(shù)來(lái)加載我們指定的DLLCreateRemoteThread()/在一個(gè)遠(yuǎn)程進(jìn)程中建立線程 func
11、tion CreateRemoteThread( hProcess: THandle; /遠(yuǎn)程進(jìn)程的句柄 lpThreadAttributes: Pointer; /線程安全描述字,指向SECURITY_ATTRIBUTES結(jié)構(gòu)的指針 dwStackSize: DWORD; /線程棧大小,以字節(jié)表示 lpStartAddress: TFNThreadStartRoutine; / 一個(gè)TFNThreadStartRoutine
12、類型的指針,指向在遠(yuǎn)程進(jìn)程中執(zhí)行的函數(shù)地址 lpParameter: Pointer; /傳入?yún)?shù)的指針 dwCreationFlags: DWORD; /創(chuàng)建線程的其它標(biāo)志 var lpThreadId: DWORD /線程身份標(biāo)志,如果為0, 則不返回 ): THandle; 整個(gè)遠(yuǎn)程注入DLL的具體實(shí)現(xiàn)代碼如下:function InjectDll(const DllFullPath : string; const dwRemoteProcessId : Cardin
13、al): boolean;var hRemoteProcess, hRemoteThread: THANDLE; pszLibFileRemote : Pointer; pszLibAFilename: PwideChar; pfnStartAddr : TFNThreadStartRoutine; memSize, WriteSize, lpThreadId : Cardinal;begin result := FALSE; / 調(diào)整權(quán)限,
14、使程序可以訪問(wèn)其他進(jìn)程的內(nèi)存空間 if EnableDebugPriv then begin /打開(kāi)遠(yuǎn)程線程 PROCESS_ALL_ACCESS 參數(shù)表示打開(kāi)所有的權(quán)限 hRemoteProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId ); try / 為注入的dll文件路徑分配內(nèi)存大小,由于為WideChar,故要乘2
15、60; GetMem(pszLibAFilename, Length(DllFullPath) * 2 + 1); / 之所以要轉(zhuǎn)換成 WideChar, 是因?yàn)楫?dāng)DLL位于有中文字符的路徑下時(shí)不會(huì)出錯(cuò) StringToWideChar(DllFullPath, pszLibAFilename, Length(DllFullPath) * 2 + 1); / 計(jì)算 pszLibAFilename 的長(zhǎng)度,注意,是以字節(jié)為單
16、元的長(zhǎng)度 memSize := (1 + lstrlenW(pszLibAFilename) * sizeof(WCHAR); /使用VirtualAllocEx函數(shù)在遠(yuǎn)程進(jìn)程的內(nèi)存地址空間分配DLL文件名空間 pszLibFileRemote := VirtualAllocEx( hRemoteProcess, nil, memSize, MEM_COMMIT, PAGE_READWRITE);
17、;if Assigned(pszLibFileRemote) then begin /使用WriteProcessMemory函數(shù)將DLL的路徑名寫入到遠(yuǎn)程進(jìn)程的內(nèi)存空間 if WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, memSize, WriteSize) and (WriteSize = memSi
18、ze) then begin lpThreadId := 0; / 計(jì)算LoadLibraryW的入口地址 pfnStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'LoadLibraryW');
19、 / 啟動(dòng)遠(yuǎn)程線程LoadLbraryW,通過(guò)遠(yuǎn)程線程調(diào)用創(chuàng)建新的線程 hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, lpThreadId); / 如果執(zhí)行成功返回True;
20、0; if (hRemoteThread <> 0) then result := TRUE; / 釋放句柄 CloseHandle(hRemoteThread); end; en
21、d; finally / 釋放句柄 CloseHandle(hRemoteProcess); end; end; end;接下來(lái)要說(shuō)的是如何卸載注入目標(biāo)進(jìn)程中的DLL,其實(shí)原理和注入DLL是完全相同的,只是遠(yuǎn)程調(diào)用調(diào)用的函數(shù)不同而已,這里要調(diào)用的是FreeLibrary代碼如下:function UnInjectDll(const DllFull
22、Path : string; const dwRemoteProcessId : Cardinal) : Boolean;/ 進(jìn)程注入和取消注入其實(shí)都差不多,只是運(yùn)行的函數(shù)不同而已var hRemoteProcess, hRemoteThread : THANDLE; pszLibFileRemote : pchar; pszLibAFilename: PwideChar; pfnStartAddr : TFNThreadStartRoutine; memSize
23、, WriteSize, lpThreadId, dwHandle : Cardinal;begin result := FALSE; / 調(diào)整權(quán)限,使程序可以訪問(wèn)其他進(jìn)程的內(nèi)存空間 if EnableDebugPriv then begin /打開(kāi)遠(yuǎn)程線程 PROCESS_ALL_ACCESS 參數(shù)表示打開(kāi)所有的權(quán)限 hRemoteProcess := OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwRemoteProc
24、essId ); try / 為注入的dll文件路徑分配內(nèi)存大小,由于為WideChar,故要乘2 GetMem(pszLibAFilename, Length(DllFullPath) * 2 + 1); / 之所以要轉(zhuǎn)換成 WideChar, 是因?yàn)楫?dāng)DLL位于有中文字符的路徑下時(shí)不會(huì)出錯(cuò) StringToWideChar(DllFullPath, pszLibAFi
25、lename, Length(DllFullPath) * 2 + 1); / 計(jì)算 pszLibAFilename 的長(zhǎng)度,注意,是以字節(jié)為單元的長(zhǎng)度 memSize := (1 + lstrlenW(pszLibAFilename) * sizeof(WCHAR); /使用VirtualAllocEx函數(shù)在遠(yuǎn)程進(jìn)程的內(nèi)存地址空間分配DLL文件名空間 pszLibFileRemote := Vi
26、rtualAllocEx( hRemoteProcess, nil, memSize, MEM_COMMIT, PAGE_READWRITE); if Assigned(pszLibFileRemote) then begin /使用WriteProcessMemory函數(shù)將DLL的路徑名寫入到遠(yuǎn)程進(jìn)程的內(nèi)存空間 if Writ
27、eProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, memSize, WriteSize) and (WriteSize = memSize) then begin / 計(jì)算GetModuleHandleW的入口地址 pfnStartAddr := GetProcAddress(LoadL
28、ibrary('Kernel32.dll'), 'GetModuleHandleW'); /使目標(biāo)進(jìn)程調(diào)用GetModuleHandleW,獲得DLL在目標(biāo)進(jìn)程中的句柄 hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAd
29、dr, pszLibFileRemote, 0, lpThreadId); / 等待GetModuleHandle運(yùn)行完畢 WaitForSingleObject(hRemoteThread,INFINITE); / 獲得GetModuleHandle的返回值,存在dwHandle變量中
30、 GetExitCodeThread(hRemoteThread, dwHandle); / 計(jì)算FreeLibrary的入口地址 pfnStartAddr := GetProcAddress(LoadLibrary('Kernel32.dll'), 'FreeLibrary'); / 使目標(biāo)進(jìn)程調(diào)用FreeLibrary,卸載DL
31、L hRemoteThread := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, Pointer(dwHandle), 0, lpThreadId); / 等待FreeLibrary卸載完畢 W
32、aitForSingleObject( hRemoteThread, INFINITE ); / 如果執(zhí)行成功返回True; if hRemoteProcess<>0 then result := TRUE; / 釋放目標(biāo)進(jìn)程中申請(qǐng)的空間
33、 VirtualFreeEx(hRemoteProcess, pszLibFileRemote, Length(DllFullPath)+1, MEM_DECOMMIT); / 釋放句柄 CloseHandle(hRemoteThread); end; e
34、nd; finally / 釋放句柄 CloseHandle(hRemoteProcess); end; end;end;第二種方法:采用CreateProcess的方法,實(shí)現(xiàn)起來(lái)比較復(fù)雜,但沒(méi)有上面幾種方法的局限性。且可以用其他工具(VC等)調(diào)試注入的DLL。下面進(jìn)行介紹。原理如下:1 用CreateProcess(CREATE_SUSPENDED)啟動(dòng)目標(biāo)進(jìn)程。2 找到目標(biāo)進(jìn)
35、程的入口,用ImageHlp中的函數(shù)可以實(shí)現(xiàn)。3 將目標(biāo)進(jìn)程入口的代碼保存起來(lái)。4 在目標(biāo)進(jìn)程的入口寫入LoadLibrary(MyDll)實(shí)現(xiàn)Dll的注入。5 用ResumeThread運(yùn)行目標(biāo)進(jìn)程。6 目標(biāo)進(jìn)程就運(yùn)行了LoadLibrary(MyDll),實(shí)現(xiàn)DLL的注入。7 目標(biāo)進(jìn)程運(yùn)行完LoadLibrary(MyDll)后,將原來(lái)的代碼寫回目標(biāo)進(jìn)程的入口。8 目標(biāo)進(jìn)程Jmp至原來(lái)的入口,繼續(xù)運(yùn)行程序。從原理上可以看出,DLL的注入在目標(biāo)進(jìn)程的開(kāi)始就運(yùn)行了
36、,而且不是用Debug的方案,這樣,就沒(méi)有上面方案的局限性了。該方案的關(guān)鍵在6,7,8三步,實(shí)現(xiàn)方法需要監(jiān)視進(jìn)程和DLL合作。下面,結(jié)合代碼進(jìn)行分析。在監(jiān)視進(jìn)程中,創(chuàng)建FileMapping,用來(lái)保存目標(biāo)進(jìn)程的入口代碼,同時(shí)保證DLL中可以訪問(wèn)。在第7步實(shí)現(xiàn)將原目標(biāo)代碼寫回目標(biāo)進(jìn)程的入口。 監(jiān)視程序和DLL共用的結(jié)構(gòu)體#pragma pack (push ,1) 保證下面的結(jié)構(gòu)體采用BYTE對(duì)齊(必須)typedef struct BYTE int_PUSHAD;
37、160; / pushad 0x60 BYTE int_PUSH; / push &szDLL 0x68 &
38、#160; DWORD push_Value; / &szDLL = "ApiSpy.dll"的path BYTE int_MOVEAX; /
39、 move eax &LoadLibrary 0xB8 DWORD eax_Value; / &LoadLibrary WORD call_eax; /
40、160; call eax 0xD0FF(FF D0) (LoadLibrary("ApiSpy.dll"); BYTE jmp_MOVEAX; / move eax &ReplaceOldCode 0xB8
41、 DWORD jmp_Value; / JMP的參數(shù) WORD jmp_eax; / jmp eax 0xE0FF(FF E0) jmp ReplaceOldCode;&
42、#160; char szDLLMAX_PATH; / "ApiSpy.dll"的FullPathINJECT_LOADLIBRARY_CODE, *LPINJECT_CODE;#pragma pack (pop , 1)上面結(jié)構(gòu)體的代碼為匯編代碼,對(duì)應(yīng)的匯編為:pushadpush szDllmov eax, &LoadLibraryAcall eax / 實(shí)現(xiàn)調(diào)用LoadLibrary(szDll)的代碼mov eax, oldentryjmp eax / 實(shí)現(xiàn)在LoadLibr
43、ary運(yùn)行完后, 跳至目標(biāo)進(jìn)程的入口繼續(xù)運(yùn)行/ FileMaping的結(jié)構(gòu)體typedef struct LPBYTE lpEntryPoint; / 目標(biāo)進(jìn)程的入口地址 BYTE oldcodesizeof(INJECT_CODE); / 目標(biāo)進(jìn)程的代碼保存SPY_MEM_SHARE, * LPSPY_MEM_SHARE
44、;準(zhǔn)備工作:第一步:用CreateProcess(CREATE_SUSPENDED)啟動(dòng)目標(biāo)進(jìn)程。CreateProcessA(0, szRunFile, 0, 0, FALSE, CREATE_SUSPENDED 0, NULL, &stInfo,
45、160; &m_proInfo) ;/ 用CreateProcess啟動(dòng)一個(gè)暫停的目標(biāo)進(jìn)程/ 找到目標(biāo)進(jìn)程的入口點(diǎn),函數(shù)如下第二步:找到目標(biāo)進(jìn)程的入口,用ImageHlp中的函數(shù)可以實(shí)現(xiàn)。pEntryPoint = GetExeEntryPoint(szRunFile);LPBYTE GetExeEntryPoint(char *filename) PIMAGE_NT_HEADERS
46、 pNTHeader; DWORD pEntryPoint; PLOADED_IMAGE pImage; pImage = ImageLoad(filename, NULL); if(pImage = NULL)
47、 return NULL; pNTHeader = pImage->FileHeader; pEntryPoint = pNTHeader->OptionalHeader.AddressOfEntryPoint + pNTHeader->OptionalHeader.ImageBase; ImageUnload(pImage); retu
48、rn (LPBYTE)pEntryPoint;/ 創(chuàng)建FileMappinghMap = CreateFileMapping(HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(SPY_MEM_SHARE), “MyDllMapView”);/ 保存目標(biāo)進(jìn)程的代碼第三步:將目標(biāo)進(jìn)程入口的代碼保存起來(lái)。LPSPY_MEM_SHARE lpMap = pMapViewOfFile(hMap,
49、160; FILE_MAP_ALL_ACCESS, &
50、#160; 0, 0, 0)
51、;ReadProcessMemory(m_proInfo.hProcess, pEntryPoint, &lpMap->oldcode, sizeof(INJECT_CODE), &cBytesMoved);
52、 lpMap->lpEntryPoint = pEntryPoint;/ 第四步:在目標(biāo)進(jìn)程的入口寫入LoadLibrary(MyDll)實(shí)現(xiàn)Dll的注入。/ 準(zhǔn)備注入DLL的代碼 INJECT_CODE newCode;/ 寫入MyDll用全路徑 lstrcpy(newCode.szDLL, szMyDll);/ 準(zhǔn)備硬代碼(匯編代碼) newC
53、_PUSHAD = 0x60; newC_PUSH = 0x68; newC_MOVEAX = 0xB8; newCode.call_eax = 0xD0FF; newCode.jmp_MOVEAX = 0xB8; newCode.jmp_eax = 0xE0FF;
54、160; newCode.eax_Value = (DWORD)LoadLibrary; newCode.push_Value=(pEntryPoint + offsetof(INJECT_CODE,szDLL);/ 將硬代碼寫入目標(biāo)進(jìn)程的入口/ 修改內(nèi)存屬性DWORD dwNewFlg, dwOldFlg;dwNewFlg = PAGE_READWRITE;VirtualProtectEx(m_proInfo.hProcess, (LPVOID)pEntryPoint, sizeof(DWORD),
55、dwNewFlg, &dwOldFlg);WriteProcessMemory(m_proInfo.hProcess, pEntryPoint, &newCode, sizeof(newCode), NULL);/&
56、;dwWrited); VirtualProtectEx(proInfo.hProcess, (LPVOID)pEntryPoint, sizeof(DWORD), dwOldFlg, &dwNewFlg);/ 釋放FileMaping 注意,不是Closehandle(hMap)UnmapViewOfFile(lpMap);/ 繼續(xù)目標(biāo)進(jìn)程的運(yùn)行第五步:用ResumeThread運(yùn)行目標(biāo)進(jìn)程。ResumeThread(m_proInfo.
57、hThread);在監(jiān)視進(jìn)程中就結(jié)束了自己的任務(wù),剩下的第6,7,8步就需要在Dll的DllMain中進(jìn)行配合。DLL中用來(lái)保存數(shù)據(jù)的結(jié)構(gòu)體typedef struct DWORD lpEntryPoint; DWORD OldAddr; DWORD OldCode4;JMP_CODE,* L
58、PJMP_CODE;static JMP_CODE _lpCode;/ 在DllMain的DLL_PROCESS_ATTACH中調(diào)用InitApiSpy函數(shù)/ 在該函數(shù)中實(shí)現(xiàn)第6,7,8步第六步:目標(biāo)進(jìn)程就運(yùn)行了LoadLibrary(MyDll),實(shí)現(xiàn)DLL的注入。int WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) switch(dwReason)
59、160; case DLL_PROCESS_ATTACH: return InitApiSpy();/ InitApiSpy函數(shù)的實(shí)現(xiàn)BOOL WINAPI InitApiSpy() HANDLE hMap; LPSPY_MEM_SHARE lpMem;
60、 DWORD dwSize; BOOL rc; BYTE* lpByte; / 取得FileMapping的句柄 hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, “MyDllMapView”); if(hMap)
61、0; lpMem = (LPSPY_MEM_SHARE)MapViewOfFile(hMap,
62、 FILE_MAP_ALL_ACCESS,
63、 0, 0, 0); if(lpMem) 第七步
64、:目標(biāo)進(jìn)程運(yùn)行完LoadLibrary(MyDll)后,將原來(lái)的代碼寫回目標(biāo)進(jìn)程的入口。 / 恢復(fù)目標(biāo)進(jìn)程的入口代碼/ 得到mov eax, value代碼的地址 _lpCode.OldAddr = (DWORD)(BYTE*)lpMem-
65、>lpEntryPoint + offsetof(INJECT_CODE, jmp_MOVEAX); _lpCode.lpEntryPoint = (DWORD)lpMem->lpEntryPoint; / 保存LoadLibr
66、ary()后面的代碼 memcpy(&_lpCode.OldCode, (BYTE*)lpMem->oldcode + offsetof(INJECT_CODE, jmp_MOVEAX), 2*sizeof(DWORD); /
67、 恢復(fù)目標(biāo)進(jìn)程的入口代碼 rc = WriteProcessMemory(GetCurrentProcess(), lpMem->lpEntryPoint, lpMem->oldcode, sizeof(INJECT_CODE), &dwSize);
68、60; lpByte = (BYTE*)lpMem->lpEntryPoint + offsetof(INJECT_CODE, jmp_MOVEAX); UnmapViewOfFile(lpMem);
69、; CloseHandle(hMap); / 實(shí)現(xiàn)自己Dll的其他功能,如導(dǎo)入表的替換/ / 將LoadLibrary后面的代碼寫為轉(zhuǎn)入處理程序中/ 指令為:mov eax, objAddress/ jmp eax &
70、#160; BYTE* lpMovEax; DWORD* lpMovEaxValu; WORD* lpJmp; &
71、#160;DWORD fNew, fOld; fNew = PAGE_READWRITE; lpMovEax = lpByte; VirtualProtect(lpMovEax, 2*sizeof(DWORD), fNew
72、, &fOld); *lpMovEax = 0xB8; lpMovEaxValu = (DWORD*)(lpMovEax + 1); *lpMovEaxValu = (DWORD)&DoJmpEntryPo
73、int; lpJmp = (WORD*)(lpMovEax + 5); *lpJmp = 0xE0FF; / (FF E0) VirtualProtect(lpMovEax, 2*sizeof(DWO
74、RD), fOld, &fNew); return TRUE;/ 轉(zhuǎn)入處理程序DWORD* lpMovEax;DWORD fNew, fOld;void _declspec(naked) DoJmpEntryPoint () / 恢復(fù)LoadLibrary后面的代碼 _gfNew = PAGE_READWRITE;
75、60; _glpMovEax = (DWORD*)_lpCode.OldAddr; VirtualProtect(_glpMovEax, 2*sizeof(DWORD), _gfNew, &_gfOld); *_glpMovEax = _lpCode.OldCode0; *(_glpMovEax + 1) = _lpCode.OldCode1; VirtualProtect(_gl
76、pMovEax, 2*sizeof(DWORD), _gfOld, &_gfNew);第八步:目標(biāo)進(jìn)程Jmp至原來(lái)的入口,繼續(xù)運(yùn)行程序。/ 跳至目標(biāo)代碼的入口 _asm popad _asm jmp _lpCode.lpEntryPoint這樣就實(shí)現(xiàn)了原來(lái)的目標(biāo),將DLL的注入放在目標(biāo)進(jìn)程的入口運(yùn)行,實(shí)現(xiàn)了目標(biāo)進(jìn)程運(yùn)行之前運(yùn)行我們的注入Dll的功能。第三種方法:利用注冊(cè)表注入
77、60; 在Windows NT/2000/XP/2003中,有一個(gè)注冊(cè)表鍵值HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsHKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWindowsAppInit_DLLs。當(dāng)某個(gè)進(jìn)程加載User32.dll時(shí),這里面列出的所有的DLL都將User32.dll利用LoadLibrary函數(shù)加載到該進(jìn)程空間中。我們可以把自己的代碼放在一個(gè)DLL中,并加入該鍵值,這樣就可以注入到所有使用User32.dll的進(jìn)程中了。
78、; 當(dāng)DLL以LoadLibrary的方式加載時(shí),DllMain會(huì)被以DLL_PROCESS_ATTACH為原因調(diào)用,實(shí)際上我們也只需要關(guān)心DLL_PROCESS_ATTACHBOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for
79、_call, LPVOID lpReserved ) if (ul_reason_for_call = DLL_PROCESS_ATTACH) HANDLE f = CreateFile(L"D:InjectSuccess.txt", FILE_ADD_FILE, FILE_SHARE_WRIT
80、E, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); CloseHandle(f); return TRUE;第四種方法: 利用Windows Hooks注入 Windows系統(tǒng)給我們提供了一些掛鉤函數(shù),使得被掛鉤的進(jìn)程可以在自己處理接收到的消息之前,先執(zhí)行我們的消息處理函數(shù),而這個(gè)消息處理函數(shù)一般會(huì)放在DLL中,來(lái)讓
81、目標(biāo)進(jìn)程加載,這實(shí)際上已經(jīng)達(dá)到了注入代碼的效果。 一般情況下,我們把掛鉤函數(shù)和消息處理函數(shù)都放在dll中:HHOOK g_hHook = NULL;HINSTANCE hInst;BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,
82、0; LPVOID lpReserved ) hInst = (HINSTANCE)hModule; return TRUE;LRESULT myKeyBrdFuncAd (int code, WPARAM wParam, LPARAM lParam) /
83、To be nice, your rootkit should call the next-lower / hook, but you never know what this hook may be. /:MessageBoxA(NULL, "Hello Injection", "Injection", MB_OK); return CallNextHookEx(g_hHook, code, wParam, lParam);#ifdef _cplusplus
84、160; / If used by C+ code, extern "C" / we need to export the C interface#endif_declspec(dllexport) bool SetHook(DWORD dwThreadId)g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)myKeyBrdFuncAd, hInst, dwThreadId);if (g_hHook = NULL) return false;return true;#ifdef _cplusplus#endif 注入進(jìn)程要加載這個(gè)DLL,然后執(zhí)行里面的Se
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度曹瑞與張麗離婚協(xié)議中公司股權(quán)分割及轉(zhuǎn)讓協(xié)議3篇
- 2024美食盛宴商業(yè)合作伙伴合同版B版
- 2025年度漁業(yè)資源承包與可持續(xù)發(fā)展合同4篇
- 2025年度體育場(chǎng)館食堂承包合同范本3篇
- 2025年度生物科技研發(fā)公司部分股權(quán)出售合同3篇
- 2025年度智慧社區(qū)建設(shè)承包合同股東內(nèi)部經(jīng)營(yíng)協(xié)議4篇
- 2025年度潯購(gòu)F000353632生鮮產(chǎn)品展示冰柜采購(gòu)合同3篇
- 2025年度水產(chǎn)養(yǎng)殖蟲(chóng)害綜合防控技術(shù)合同4篇
- 職業(yè)教育培訓(xùn)需求分析課件
- 2025年幼兒園食堂承包及幼兒營(yíng)養(yǎng)餐服務(wù)合同4篇
- 火災(zāi)安全教育觀后感
- 農(nóng)村自建房屋安全協(xié)議書(shū)
- 快速康復(fù)在骨科護(hù)理中的應(yīng)用
- 國(guó)民經(jīng)濟(jì)行業(yè)分類和代碼表(電子版)
- ICU患者外出檢查的護(hù)理
- 公司收購(gòu)設(shè)備合同范例
- 廣東省潮州市2023-2024學(xué)年高二上學(xué)期語(yǔ)文期末考試試卷(含答案)
- 2024年光伏發(fā)電項(xiàng)目EPC總包合同
- 子女放棄房產(chǎn)繼承協(xié)議書(shū)
- 氧化還原反應(yīng)配平專項(xiàng)訓(xùn)練
- 試卷(完整版)python考試復(fù)習(xí)題庫(kù)復(fù)習(xí)知識(shí)點(diǎn)試卷試題
評(píng)論
0/150
提交評(píng)論