乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      DLL注入方法小結(jié)

       SamBookshelf 2013-12-24

      遠(yuǎn)程注入的源碼:

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

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

      復(fù)制代碼
       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 }    
      復(fù)制代碼

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

      3. 在目標(biāo)進(jìn)程中分配內(nèi)存,來存儲(chǔ)我們要注入的DLL路徑:
        VirtualAllocEx(hProcess, NULL, strlen(Path), PAGE_READWRITE);

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

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

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

        有時(shí)會(huì)讀寫失敗,有可能是因?yàn)閮?nèi)存塊的保護(hù)權(quán)限,因此需要修改內(nèi)存塊的保護(hù)權(quán)限,在寫入成功之后,要還原剛才修改的權(quán)限
        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ù)地址,因?yàn)橐盟麃韯?dòng)態(tài)加載DLL,該函數(shù)在kernel32.dll文件中
        PROC AdrMyDllDir=(PROC)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryW");
        //W代表UNICODE版本,說實(shí)話,A代表多字節(jié)字符集

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

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

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多