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

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

    • 分享

      【Hook技術(shù)】實現(xiàn)從"任務(wù)管理器"中保護(hù)進(jìn)程不被關(guān)閉 + 附帶源碼 + 進(jìn)程保護(hù)知識擴(kuò)展

       盛夏流年閃耀 2013-09-11

      公司有個監(jiān)控程序涉及到進(jìn)程的保護(hù)問題,需要避免用戶通過任務(wù)管理器結(jié)束掉監(jiān)控進(jìn)程,這里使用了HOOK技術(shù),通過Hook OperProcess來實現(xiàn)進(jìn)程的保護(hù).

      正常的結(jié)束進(jìn)程的流程是(應(yīng)用層)

       a.OpenProcess 打開進(jìn)程,獲取進(jìn)程的句柄.

       b.將a獲取的進(jìn)程句柄傳遞給TerminateProcess,最后由TermianteProcess來完成進(jìn)程的關(guān)閉.

      ps:TerminateProcess又會調(diào)用系統(tǒng)的NtTerminateProcess,然后逐步深入內(nèi)核層,最終調(diào)用內(nèi)核API完成進(jìn)程的關(guān)閉和進(jìn)程相關(guān)資源的釋放.

      (在應(yīng)用層大多數(shù)進(jìn)程的關(guān)閉都是走上面流程的,包括任務(wù)管理器,所以我們知道在Opernprocess和TerminateProcess間,我們只要Hook OpenProcess,讓程序無法打開進(jìn)程獲取到句柄就可以了,那樣TerminateProcess調(diào)用自然也就失敗了)

      HANDLE WINAPI OpenProcess(
        _In_  DWORD dwDesiredAccess,
        _In_  BOOL bInheritHandle,
        _In_  DWORD dwProcessId      //進(jìn)程ID,我們所關(guān)注的
      );

      由OpenProcess函數(shù)原型我們知道,第三個參數(shù)dwProcessId標(biāo)識要打開進(jìn)程的ID,而我們可以通過攔截OpenProcess,然后判斷dwProcess是否為保護(hù)的進(jìn)程ID.

      例如:我們自定義的Hook_OpenProcess

      復(fù)制代碼
      HANDLE WINAPI Hook_OpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId)
      {
          //判斷打開進(jìn)程的權(quán)限和PID,其中l(wèi)pData->dwProcessId存儲我們要保護(hù)的進(jìn)程ID
          if(dwDesiredAccess == PROCESS_TERMINATE && dwProcessId == lpData->dwProcessId)
          { 
                      //為保護(hù)的進(jìn)程直接返回NULL給TerminateProcess
              return NULL;
          }
              
             
          return OpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId);
      }
      復(fù)制代碼

      定制好了自己的OpenProcess的函數(shù),接下來我們要做的就是如何將原函數(shù)(OpenProcess)替換為我們自己的Hook_OpenProcess,只有程序在調(diào)用OpenProcess時候先走我們的Hook_OpenProcess那么保護(hù)才能順序的進(jìn)行. 而替換的主要方法主要有:

      1. 通過Patch  IAT表,要求對PE文件格式熟悉

      2. 通過修改原函數(shù)的入口處幾個字節(jié),實現(xiàn)跳轉(zhuǎn)到我們定制的函數(shù),這種技術(shù)我們稱為inline hook,主要是通過修改入口前5個字節(jié)或者7個字節(jié),或者patch函數(shù)的中部代碼,也可以patch尾部.

      我們這里用的是第一種方法,這里HOOK類,使用的《核心編程》中的CAPIHook,例如:

      復(fù)制代碼
      class QHookSrv
      {
      public:
         // Hook a function in all modules
         QHookSrv(PSTR pszCalleeModName, PSTR pszFuncName, PROC pfnHook, 
            BOOL fExcludeAPIHookMod);
      
         // Unhook a function from all modules
         ~QHookSrv();
      
         // Returns the original address of the hooked function
         operator PROC() { return(m_pfnOrig); }
      
      private:
         static PVOID sm_pvMaxAppAddr; // Maximum private memory address
         static QHookSrv* sm_pHead;    // Address of first object
         QHookSrv* m_pNext;            // Address of next  object
      
         PCSTR m_pszCalleeModName;     // Module containing the function (ANSI)
         PCSTR m_pszFuncName;          // Function name in callee (ANSI)
         PROC  m_pfnOrig;              // Original function address in callee
         PROC  m_pfnHook;              // Hook function address
         BOOL  m_fExcludeAPIHookMod;   // Hook module w/CAPIHook implementation?
      
      private:
         // Replaces a symbol's address in a module's import section
         static void WINAPI ReplaceIATEntryInAllMods(PCSTR pszCalleeModName, 
            PROC pfnOrig, PROC pfnHook, BOOL fExcludeAPIHookMod);
      
         // Replaces a symbol's address in all module's import sections
         static void WINAPI ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, 
            PROC pfnOrig, PROC pfnHook, HMODULE hmodCaller);
      };
      復(fù)制代碼

      QHookSrv實現(xiàn)代碼:

      View Code

      掛鉤OpenProcess :

      //Hook_OpenProcess為定制的攔截函數(shù)
      QHookSrv g_OpenProcess("kernel32.dll", "OpenProcess",(PROC)Hook_OpenProcess,TRUE);

      有了IAT hook類,也有了攔截函數(shù),接下來我們要做的就是如何patch所有的進(jìn)程中duiOpenProcess的調(diào)用了,這里我們通過安裝全局的WH_SHELL鉤子來實現(xiàn)

      應(yīng)用層消息鉤子安裝通過API:

      復(fù)制代碼
      HHOOK WINAPI SetWindowsHookEx(
        _In_  int idHook,             //鉤子的類型(消息鉤子)
        _In_  HOOKPROC lpfn,    //鉤子回調(diào),當(dāng)前響應(yīng)消息被觸發(fā)時候調(diào)用
        _In_  HINSTANCE hMod, //實例模塊句柄,一般是DLL句柄
        _In_  DWORD dwThreadId //0標(biāo)識全局鉤子,非0標(biāo)識局部鉤子
      );
      復(fù)制代碼

      消息鉤子的卸載:

      //只有一個參數(shù),通過SetWindowsHookEx返回的鉤子句柄
      BOOL WINAPI UnhookWindowsHookEx(
        _In_  HHOOK hhk
      );

      : 本Demo中鉤子的安裝和卸載過程

      復(fù)制代碼
      //安裝鉤子 ,由Dll導(dǎo)出
      //參數(shù)pid標(biāo)識保護(hù)進(jìn)程的ID
      BOOL InstallHook(DWORD pid)
      {    
          BOOL bResult=FALSE;
          if(!glhHook)
          {
              glhHook = SetWindowsHookEx(WH_SHELL,ShellHookProc,glhInstance, 0);
              if(glhHook!=NULL)
              {
                  //??????湲??
                  hMapping=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x100,"PCMONITOR."); 
                  if(hMapping != NULL) 
                  { 
                      lpData=(LPSHWP_STRUCT)MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0); 
                      lpData->dwProcessId = pid; 
                  }
                  bResult=TRUE;
              }
          }
          return bResult; 
      }
      
      //卸載鉤子,UninstallHook由Dll導(dǎo)出
      BOOL UninstallHook()
      {    
          BOOL bResult=FALSE;
          if(glhHook)
          {
              bResult= UnhookWindowsHookEx(glhHook);
              if(bResult)
              {
                  glhHook=NULL;
              }
          }
          return bResult;
      }
      復(fù)制代碼

      消息回調(diào)函數(shù),回調(diào)不進(jìn)行任何操作調(diào)用CallNextHookEx將消息傳遞下一個處理程序

      static LRESULT WINAPI ShellHookProc(int code, WPARAM wParam, LPARAM lParam) 
      {
          return ::CallNextHookEx(glhHook, code, wParam, lParam);
      }

      +

      NET(C#)中的調(diào)用:

      復(fù)制代碼
              // QomoHookSrv.dll 
              [DllImport("QomoHookSrv.dll", CallingConvention=CallingConvention.Cdecl)]
              private extern static bool InstallHook( int processID);
              [DllImport("QomoHookSrv.dll", CallingConvention=CallingConvention.Cdecl)]
              private extern static bool UninstallHook();
      
              private void install_hook_when_app_startup() {
                  //獲取進(jìn)程的ID
                  int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
                  //安裝鉤子
                  InstallHook(pid);
              }
      
              private void uninstall_hook_when_app_closed() {
                  UninstallHook();
              }
      復(fù)制代碼

      源碼僅包含HOOK DLL代碼(核心代碼), 測試工程請自行code,文章也已經(jīng)提及了,相對簡單
      我是Source

       

      【進(jìn)程保護(hù)知識擴(kuò)展】

      本文中提及是從應(yīng)用層的角度來保護(hù)進(jìn)程不被關(guān)閉,通過Hook OperProcess 和TerminateProcess并不是安全了,應(yīng)用程進(jìn)程的關(guān)閉有些不是走該流程的,比如說直接調(diào)用NtTerminateProcess或者通過NtSetSystemInformation等

      進(jìn)程關(guān)閉的流程大致為(系統(tǒng)API間的調(diào)用關(guān)系);

       

      通過上述流程相應(yīng)的進(jìn)程保護(hù)方法:

      1.應(yīng)用層Hook OpenProcess/TerminateProcess ,或者調(diào)用RtlSetprocessiscritical

      2.內(nèi)核層方式實現(xiàn)進(jìn)程保護(hù)相對方式比較多點:

        a. Hook NtTerminaterProcess/ZwTerminateProcess(兩個是一樣的,在R3是為NtTerminateProcess,內(nèi)核就有NtTerminateProcess轉(zhuǎn)為ZwTerminateProcess調(diào)用),這種攔截可以通過修改內(nèi)核表SSDT,或者InlineHook實現(xiàn)

        b.Hook ObReferenceObjectByHandle  ,網(wǎng)上有很多關(guān)于該API的HoOK源碼,也是進(jìn)程保護(hù)中常用的一種手段,因為后續(xù)的很多操作都是需要通過調(diào)用該函數(shù)返回的進(jìn)程對象體

        c. Hook PspTerminateThreadByPointer/PspTerminateProcess/PspExitThread ,pspXX函數(shù)是比較底層的API了,而未導(dǎo)出,獲取他們地址需要通過硬編碼的方式,所以不同的系統(tǒng)可能存在問題,所以這種方法是相對比較危險的,但是確實很有效的

       d. Hook 插APC函數(shù),例如:KeInitializeApc等這種方法也相對比較實用多,網(wǎng)上也有很多這方面的例子,不過大多數(shù)都是通過插APC的方式來強(qiáng)制結(jié)束進(jìn)程的.

       


       

      專注于: Net分布式技術(shù),移動服務(wù)端架構(gòu)及系統(tǒng)安全學(xué)習(xí)及研究  by Andy


       

       

       

       

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多