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

分享

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

 盛夏流年閃耀 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ù)知識擴展】

本文中提及是從應(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的方式來強制結(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ā)表

    請遵守用戶 評論公約

    類似文章 更多