免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

DLL注入方法小結

 SamBookshelf 2013-12-24

遠程注入的源碼:

http://files.cnblogs.com/shadow-lei/Injector1.1.zip

//DLL注入到進程中,是當前游戲外掛常使用的一種作弊方式,因此在這里先和大家交流一下DLL的注入方法,在以后的文章中還會和大家討論一下如何攔截:
DLL的注入方法總結:
1.使用遠程線程
2.hook的方式
一、 遠程線程注入
1. 想要把自己的DLL注入到目標進程中,需要獲取目標進程的句柄,因此,我們就需要提高我們自己注入工具的權限,否則獲取不到目標進程的句柄,下面是提高權限的方法:

復制代碼
 1 bool enableDebugPriv() 
 2 { 
 3     HANDLE hToken; 
 4     LUID sedebugnameValue; 
 5     TOKEN_PRIVILEGES tkp; 
 6 
 7     if (!OpenProcessToken(GetCurrentProcess(), 
 8         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
 9     { 
10         return false; 
11     } 
12     if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME,  &sedebugnameValue)) 
13     { 
14         CloseHandle(hToken); 
15         return false; 
16     } 
17     tkp.PrivilegeCount = 1; 
18     tkp.Privileges[0].Luid = sedebugnameValue; 
19     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
20     if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) 
21    { 
22         CloseHandle(hToken); 
23         return false; 
24     } 
25     return true; 
26 }    
復制代碼

2. 獲取目標進程句柄
OpenProcess(權限類型,是否可被持續(xù),過程ID):功能:返回目標過程句柄
OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID);

3. 在目標進程中分配內存,來存儲我們要注入的DLL路徑:
  VirtualAllocEx(hProcess, NULL, strlen(Path), PAGE_READWRITE);

  //VirtualAllocEx()函數(shù)功能:為制訂的過程分派虛擬地址
  //參1:要分派的過程句柄
  //參2:要分派的虛擬地址的地位,0默示,主動分派地位
  //參3:分派的大小
  //參4:MEM_COMMIT默示,分派物理內存或者頁面內存,并且初始化內存為0
  //參5:存儲選項:PAGE_READWRITE默示可以在頁面內存中 “讀寫”
  //返回值:若是分派內存成功,則返回分派內存的地址,若是分派失敗則返回NULL,調用GetLastError()查看錯誤原因

4. 在目標進程中上面分配的內存中,寫入DLL的路徑:
  4.1 WriteProcessMemory(hProcess, pszLibFileRemote, (PVOID)pszLibFile, strlen(Path), NULL)

  //WriteProcessMemory()函數(shù)功能:在制訂過程中寫入內存
  //參1:寫入過程的句柄
  //參2:寫入內存的,必須是已經(jīng)創(chuàng)建的地址,比如上方用VirtualAllocEx()在過程中創(chuàng)建的內存地址
  //參3:寫入內存中的數(shù)據(jù)內容的緩存
  //參4:寫入數(shù)據(jù)大小
  //參5:一個選項,0默示忽視
  //返回值: 非0值默示成功, 返回0則默示寫入錯誤。調用GetLastError()查看錯誤原因

  有時會讀寫失敗,有可能是因為內存塊的保護權限,因此需要修改內存塊的保護權限,在寫入成功之后,要還原剛才修改的權限
  VirtualProtectEx(hProcess, pszLibFileRemote, strlen(Path), PAGE_EXECUTE_READWRITE, &dwOld);
  WriteProcessMemory(hProcess,  pszLibFileRemote, Path, strlen(Path), NULL);
  VirtualProtectEx(hProcess, pszLibFileRemote, strlen(Path), dwOld, &dwOld);
  VirtualFreeEx(hProcess, pszLibFileRemote, strlen(Path), MEM_RELEASE);

5. 獲取LoadLibrary()函數(shù)地址,因為要用他來動態(tài)加載DLL,該函數(shù)在kernel32.dll文件中
  PROC AdrMyDllDir=(PROC)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW");
  //W代表UNICODE版本,說實話,A代表多字節(jié)字符集

6. 創(chuàng)建遠程線程
CreateRemoteThread(hProcess,NULL, NULL, (LPTHREAD_START_ROUTINE)AdrMyDllDir(LPVOID)LoadString, NULL, NULL);
這里的AdrMyDllDir存放LoadLibraryW ,也就是說把LoadLibraryW當做線程處理懲罰函數(shù),傳入的參數(shù)bufRemote存放的是目標DLL文件的地址。

二、下面講解一下如何用hook既鉤子注入DLL文件。
所謂hook,既鉤子。hook會在應用程序接到消息之前,阻礙應用程序的信息,比如鼠標鍵盤鉤子會阻礙一個應用程序的鼠標鍵盤信息。要做盜號木馬?用WH_KEYBOARD類型的hook
1.我們要跨過程應用鉤子,要把hook函數(shù)寫在DLL文件中。
2.在DLL文件中 設置鉤子.
  這里須要調用線程ID,threadId,我們會在面調用DLL的調用端中寫入
  hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
  //參數(shù)1:鉤子類型
  //參數(shù)2:鉤子處理函數(shù)
  //參數(shù)3:鉤子地點的模塊
  //參數(shù)4:鉤子要阻礙的線程ID,若是要設置全局鉤子,這里給0。
  把這個SetWindowsHookEx()函數(shù)寫在一個導出函數(shù)中:
  _declspec(dllexport) void SetHook(DWORD threadId)
  {
    hhookGetMsg=::SetWindowsHookEx(WH_GETMESSAGE,GetMessageHookProc,::GetModuleHandle(TEXT("dll.dll")),threadId);
  }
  SetHook()就是本dll的導出函數(shù)
3.在鉤子處理函數(shù)中寫入功能,當鉤子截取到WM_NULL消息的,注入DLL文件。因為WM_NULL消息,是個沒用的消息,應用程序一般不會收到這個消息,除非我們本身發(fā)送一個這個消息,所以我們在注入DLL的時,只要給要注入的應用程序發(fā)一個WM_NULL消息,當鉤子截取到WM_NULL的時就注入鉤子,就可以了。
LRESULT CALLBACK GetMessageHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
  MSG* pMsg=(MSG*)lParam;
  if(WM_NULL==pMsg->message)
  ::LoadLibraryW(TEXT("D://MyDLL.dll"));
}
編譯DLL項目,產(chǎn)生DLL文件。

4.編寫調用端,調用鉤子
  首先獲取窗口句柄
  HWND FindWindow( LPCTSTR lpClassName,LPCTSTR lpWindowName);
  返回窗體句柄。hWnd.
  hWnd=FindWindow(0,要注入dll的窗體的名稱(例如:記事本))
  通過hWnd,查找窗體線程ID
  threadId=GetWindowThreadProcessId(hWnd,0);
  有了線程ID了,可以調用鉤子了。
  SetHook(threadId);
  這時鉤子已經(jīng)加載到目標線程中了。
  向目標窗體發(fā)送WM_NULL消息
  SendMessage(hWnd,WM_NULL,0,0);
  鉤子會在目標窗體受到消息前受到WM_NULL消息。因為鉤子處理函數(shù)中做了判斷,當受到WM_NULL消息時,加載DLL文件。所以DLL文件就注入到目標線程中了。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多