DLL的11種注入方法_第1頁(yè)
DLL的11種注入方法_第2頁(yè)
DLL的11種注入方法_第3頁(yè)
DLL的11種注入方法_第4頁(yè)
DLL的11種注入方法_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論