九色成人免费视频_久久一区视频_视频一区国产精品_精品视频在线观看

始創(chuàng)于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊(cè)有禮 登錄
  • 掛牌上市企業(yè)
  • 60秒人工響應(yīng)
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補(bǔ)償
全部產(chǎn)品
您的位置: 網(wǎng)站首頁(yè) > 幫助中心>文章內(nèi)容

VC++消息鉤子編程

發(fā)布時(shí)間:  2012/9/11 16:55:31
一、消息鉤子的概念1、基本概念Windows應(yīng)用程序是基于消息驅(qū)動(dòng)的,任何線程只要注冊(cè)窗口類都會(huì)有一個(gè)消息隊(duì)列用于接收用戶輸入的消息和系統(tǒng)消息。為了攔截消息,Windows提出了鉤子的概念。鉤子(Hook)是Windows消息處理機(jī)制中的一個(gè)監(jiān)視點(diǎn),鉤子提供一個(gè)回調(diào)函數(shù)。當(dāng)在某個(gè)程序中安裝鉤子后,它將監(jiān)視該程序的消息,在指定消息還沒到達(dá)窗口之前鉤子程序先捕獲這個(gè)消息。這樣就有機(jī)會(huì)對(duì)此消息進(jìn)行過濾,或者對(duì)Windows消息實(shí)現(xiàn)監(jiān)控。

  2、分類消息鉤子分為局部鉤子和全局鉤子。局部鉤子是指僅攔截指定一個(gè)進(jìn)程的指定消息,全局鉤子將攔截系統(tǒng)中所有進(jìn)程的指定消息。

  3、實(shí)現(xiàn)步驟使用鉤子技術(shù)攔截消息通常分為如下幾個(gè)步驟:設(shè)置鉤子回調(diào)函數(shù);(攔截到消息后所調(diào)用的函數(shù))

  安裝鉤子;(使用SetWindowsHookEx函數(shù))

  卸載鉤子。(使用UnhookWindowsHookEx函數(shù))

  4、功能利用消息鉤子可以實(shí)現(xiàn)特效界面、同步消息、監(jiān)控消息、自啟動(dòng)等功效。

  二、病毒對(duì)消息鉤子技術(shù)的利用計(jì)算機(jī)病毒經(jīng)常利用消息鉤子實(shí)現(xiàn)兩種功能:1、監(jiān)控用戶按鍵,盜取用戶信息。

  這樣的病毒會(huì)啟動(dòng)一個(gè)常駐內(nèi)存的EXE病毒進(jìn)程,然后安裝一個(gè)全局鍵盤消息鉤子,鉤子回調(diào)函數(shù)位于病毒進(jìn)程中,這樣系統(tǒng)中任何有按鍵操作的進(jìn)程,其按鍵詳細(xì)信息都會(huì)被病毒進(jìn)程攔截記錄。

  2、自啟動(dòng)這樣的病毒會(huì)將鉤子回調(diào)函數(shù)放在一個(gè)DLL文件中,然后安裝一個(gè)全局消息(容易觸發(fā)的消息,如WH_CBT、WH_GETMESSAGE等)鉤子,這樣凡響應(yīng)該消息的進(jìn)程都會(huì)自動(dòng)加載病毒的DLL,病毒也就跟著自動(dòng)運(yùn)行了。

  三、消息鉤子病毒的對(duì)抗技術(shù)(重點(diǎn))

  1、對(duì)抗技術(shù)原理對(duì)付消息鉤子病毒方法很簡(jiǎn)單,只要將病毒安裝的鉤子卸載掉即可。(注意:對(duì)于系統(tǒng)中許多進(jìn)程已經(jīng)因?yàn)槿帚^子而加載了病毒DLL的情況,并不需要去卸載這些DLL,只要安裝的消息鉤子被卸載那么對(duì)應(yīng)的DLL也都會(huì)被在這些進(jìn)程中自動(dòng)卸載。)卸載鉤子有兩種方法:(1)、結(jié)束掉安裝鉤子的進(jìn)程將設(shè)置鉤子的進(jìn)程結(jié)束,進(jìn)程在退出之前會(huì)自行卸載掉該進(jìn)程安裝的所有消息鉤子。這種方法很適合對(duì)付監(jiān)控用戶按鍵的病毒。

  (2)、獲得消息鉤子句柄,然后調(diào)用UnhookWindowsHookEx函數(shù)即可將消息鉤子卸載。

  如果病毒單獨(dú)啟動(dòng)了一個(gè)病毒進(jìn)程安裝了一個(gè)全局消息鉤子,然后就常駐內(nèi)存。這時(shí)我們將這個(gè)病毒進(jìn)程結(jié)束掉即可。但是如果病毒在系統(tǒng)進(jìn)程中注入代碼而安裝的鉤子,這樣鉤子句柄就位于系統(tǒng)進(jìn)程中,我們不可以結(jié)束系統(tǒng)進(jìn)程,這時(shí)就只能獲取這個(gè)消息鉤子句柄,然后調(diào)用函數(shù)卸載。

  2、對(duì)抗技術(shù)實(shí)現(xiàn)細(xì)節(jié)對(duì)于結(jié)束掉安裝鉤子進(jìn)程從而卸載病毒消息鉤子的方法很容易實(shí)現(xiàn),只要找到病毒進(jìn)程結(jié)束即可。而對(duì)于獲取病毒消息鉤子句柄,然后調(diào)用函數(shù)卸載鉤子的方法比較復(fù)雜,也是本文重點(diǎn)討論的內(nèi)容,將在下一個(gè)標(biāo)題中詳細(xì)介紹。

  四、查找病毒消息鉤子句柄然后卸載的方法實(shí)現(xiàn)(重點(diǎn)、難點(diǎn))

  1、實(shí)現(xiàn)原理分析系統(tǒng)會(huì)將所有安裝的鉤子句柄保存在內(nèi)核中,要查找病毒安裝的消息鉤子句柄,我們要枚舉所有的消息鉤子句柄。如何枚舉稍后講解,還要解決一個(gè)問題,就是在枚舉過程中,我們?cè)趺粗滥膫(gè)句柄是病毒安裝的呢?

  通過分析病毒樣本我們通常可以得到病毒安裝鉤子就是為了令其他合法進(jìn)程加載病毒DLL,所以它會(huì)將鉤子回調(diào)函數(shù)寫在該DLL中。在枚舉消息鉤子句柄時(shí),同時(shí)也可以得到該句柄所對(duì)應(yīng)的回調(diào)函數(shù)所屬的DLL模塊,根據(jù)這個(gè)DLL模塊是不是病毒的DLL模塊即可找到病毒的消息鉤子句柄,最后將其卸載即可。

  關(guān)于如何枚舉系統(tǒng)消息鉤子句柄,對(duì)于不同的操作系統(tǒng)方法大不相同,這里介紹一種用戶層讀內(nèi)存的方法,此方法僅在2000/XP系統(tǒng)下可用。

  在2000/XP系統(tǒng)下有一個(gè)Windows用戶界面相關(guān)的應(yīng)用程序接口User32.dll.它用于包括Windows窗口處理,基本用戶界面等特性,如創(chuàng)建窗口和發(fā)送消息。當(dāng)它被加載到內(nèi)存后,它保存了所有Windows窗口、消息相關(guān)的句柄,其中就包括消息鉤子句柄。這些句柄被保存在一塊共享內(nèi)存段中,通常稱為R3層的GUI TABLE.所以只要我們找到GUI TABLE,然后在其中的句柄中篩選出消息鉤子句柄。GUI TABLE這塊內(nèi)存段可以被所有進(jìn)程空間訪問。GUI TABLE被定義成如下結(jié)構(gòu):typedef struct tagSHAREDINFO { struct tagSERVERINFO *pServerInfo;  //指向tagSERVERINFO結(jié)構(gòu)的指針struct _HANDLEENTRY *pHandleEntry;  // 指向句柄表struct tagDISPLAYINFO *pDispInfo;  //指向tagDISPLAYINFO結(jié)構(gòu)的指針ULONG ulSharedDelta;LPWSTR pszDllList;} SHAREDINFO, *PSHAREDINFO;tagSHAREDINFO結(jié)構(gòu)體的第一個(gè)成員pServerInfo所指向的tagSERVERINFO結(jié)構(gòu)體定義如下。

  typedef struct tagSERVERINFO { short wRIPFlags ;short wSRVIFlags ;short wRIPPID ;short wRIPError ;ULONG cHandleEntries;          //句柄表中句柄的個(gè)數(shù)}SERVERINFO,*PSERVERINFO;可以看出通過tagSERVERINFO結(jié)構(gòu)的cHandleEntries成員即可得到tagSHAREDINFO結(jié)構(gòu)的pHandleEntry成員所指向的句柄表中的句柄數(shù)。

  tagSHAREDINFO結(jié)構(gòu)體的第二個(gè)成員pHandleEntry是指向_HANDLEENTRY結(jié)構(gòu)體數(shù)組起始地址的指針,該數(shù)組的一個(gè)成員對(duì)應(yīng)一個(gè)句柄。句柄結(jié)構(gòu)體_HANDLEENTRY定義如下。

  typedef struct _HANDLEENTRY{ PVOID  pObject;            //指向句柄所對(duì)應(yīng)的內(nèi)核對(duì)象ULONG  pOwner;BYTE  bType;               //句柄的類型BYTE  bFlags;short  wUniq;}HANDLEENTRY,*PHANDLEENTRY;_HANDLEENTRY結(jié)構(gòu)體成員bType是句柄的類型,通過該變量的判斷可以篩選消息鉤子句柄。User32中保存的句柄類型通常有如下種類。

  typedef enum  _HANDLE_TYPE { TYPE_FREE = 0,TYPE_WINDOW = 1 ,TYPE_MENU = 2,                     //菜單句柄TYPE_CURSOR = 3,                   //光標(biāo)句柄TYPE_SETWINDOWPOS = 4,TYPE_HOOK = 5,                     //消息鉤子句柄TYPE_CLIPDATA = 6  ,TYPE_CALLPROC = 7,TYPE_ACCELTABLE = 8,TYPE_DDEACCESS = 9,TYPE_DDECONV = 10,TYPE_DDEXACT = 11,TYPE_MONITOR = 12,TYPE_KBDLAYOUT = 13   ,TYPE_KBDFILE = 14    ,TYPE_WINEVENTHOOK = 15  ,TYPE_TIMER = 16,TYPE_INPUTCONTEXT = 17  ,TYPE_CTYPES = 18         ,TYPE_GENERIC = 255 }HANDLE_TYPE;_HANDLEENTRY結(jié)構(gòu)體的成員pObject是指向句柄對(duì)應(yīng)的內(nèi)核對(duì)象的指針。

  這樣只要通過pObject就可以得到句柄的詳細(xì)信息(其中包括創(chuàng)建進(jìn)程,線程、回調(diào)函數(shù)等信息),通過bType就可以的值句柄的類型。

  _HANDLEENTRY結(jié)構(gòu)體的其他成員可以忽略不看。

  (知識(shí)要點(diǎn)補(bǔ)充:如何在用戶層程序中讀取內(nèi)核內(nèi)存)

  需要注意的是,pObject指針指向的是內(nèi)核內(nèi)存,不可以在用戶層直接訪問內(nèi)核內(nèi)存。后面還有些地方也同樣是內(nèi)核內(nèi)存,需要加以注意。應(yīng)該把內(nèi)核內(nèi)存的數(shù)據(jù)讀取到用戶層內(nèi)存才可以訪問。且不可以直接訪問,畢竟不是在驅(qū)動(dòng)中。

  在用戶層讀取內(nèi)核內(nèi)存使用ZwSystemDebugControl函數(shù),它是一個(gè)Native API.其原型如下。

  NTSYSAPI NTSTATUS NTAPI ZwSystemDebugControl(IN DEBUG_CONTROL_CODE ControlCode,//控制代碼IN PVOID InputBuffer OPTIONAL,    //輸入內(nèi)存IN ULONG InputBufferLength,    //輸入內(nèi)存長(zhǎng)度OUT PVOID OutputBuffer OPTIONAL,  //輸出內(nèi)存IN ULONG OutputBufferLength,    //輸出內(nèi)存長(zhǎng)度OUT PULONG ReturnLength OPTIONAL  //實(shí)際輸出的長(zhǎng)度);ZwSystemDebugControl函數(shù)可以用于讀/寫內(nèi)核空間、讀/寫MSR、讀/寫物理內(nèi)存、讀/寫IO端口、讀/寫總線數(shù)據(jù)、KdVersionBlock等。由第一個(gè)參數(shù)ControlCode控制其功能,可以取如下枚舉值。

  typedef enum _SYSDBG_COMMAND { //以下5個(gè)在Windows NT各個(gè)版本上都有SysDbgGetTraceInformation = 1,SysDbgSetInternalBreakpoint = 2,SysDbgSetSpecialCall = 3,SysDbgClearSpecialCalls = 4,SysDbgQuerySpecialCalls = 5,// 以下是NT 5.1 新增的SysDbgDbgBreakPointWithStatus = 6,//獲取KdVersionBlock SysDbgSysGetVersion = 7,//從內(nèi)核空間復(fù)制到用戶空間,或者從用戶空間復(fù)制到用戶空間//但是不能從用戶空間復(fù)制到內(nèi)核空間SysDbgCopyMemoryChunks_0 = 8,//SysDbgReadVirtualMemory = 8,//從用戶空間復(fù)制到內(nèi)核空間,或者從用戶空間復(fù)制到用戶空間//但是不能從內(nèi)核空間復(fù)制到用戶空間SysDbgCopyMemoryChunks_1 = 9,//SysDbgWriteVirtualMemory = 9,//從物理地址復(fù)制到用戶空間,不能寫到內(nèi)核空間SysDbgCopyMemoryChunks_2 = 10,//SysDbgReadVirtualMemory = 10,//從用戶空間復(fù)制到物理地址,不能讀取內(nèi)核空間SysDbgCopyMemoryChunks_3 = 11,//SysDbgWriteVirtualMemory = 11,//讀/寫處理器相關(guān)控制塊SysDbgSysReadControlSpace = 12,SysDbgSysWriteControlSpace = 13,//讀/寫端口SysDbgSysReadIoSpace = 14,SysDbgSysWriteIoSpace = 15,//分別調(diào)用RDMSR@4_WRMSR@12 SysDbgSysReadMsr = 16,SysDbgSysWriteMsr = 17,//讀/寫總線數(shù)據(jù)SysDbgSysReadBusData = 18,SysDbgSysWriteBusData = 19,SysDbgSysCheckLowMemory = 20,// 以下是NT 5.2 新增的//分別調(diào)用_KdEnableDebugger@0_KdDisableDebugger@0 SysDbgEnableDebugger = 21,SysDbgDisableDebugger = 22,//獲取和設(shè)置一些調(diào)試相關(guān)的變量SysDbgGetAutoEnableOnEvent = 23,SysDbgSetAutoEnableOnEvent = 24,SysDbgGetPitchDebugger = 25,SysDbgSetDbgPrintBufferSize = 26,SysDbgGetIgnoreUmExceptions = 27,SysDbgSetIgnoreUmExceptions = 28 } SYSDBG_COMMAND, *PSYSDBG_COMMAND;我們這里要讀取內(nèi)核內(nèi)存,所以參數(shù)ControlCode應(yīng)取值為SysDbgReadVirtualMemory.當(dāng)ControlCode取值為SysDbgReadVirtualMemory時(shí),ZwSystemDebugControl函數(shù)的第4個(gè)參數(shù)和第5個(gè)參數(shù)被忽略,使用時(shí)傳入0即可。第二個(gè)參數(shù)InputBuffer是一個(gè)指向結(jié)構(gòu)體_MEMORY_CHUNKS的指針,該結(jié)構(gòu)體定義如下。

  typedef struct _MEMORY_CHUNKS { ULONG Address;      //內(nèi)核內(nèi)存地址指針(要讀的數(shù)據(jù))

  PVOID Data;         //用戶層內(nèi)存地址指針(存放讀出的數(shù)據(jù))

  ULONG Length;      //讀取的長(zhǎng)度}MEMORY_CHUNKS, *PMEMORY_CHUNKS;第三個(gè)參數(shù)InputBufferLength是_MEMORY_CHUNKS結(jié)構(gòu)體的大小。使用sizeof運(yùn)算符得到即可。

  SysDbgReadVirtualMemory函數(shù)執(zhí)行成功將返回0.否則返回錯(cuò)誤代碼。

  為了方便使用,我們可以封裝一個(gè)讀取內(nèi)核內(nèi)存的函數(shù)GetKernelMemory,實(shí)現(xiàn)如下:#define SysDbgReadVirtualMemory 8 //定義ZwSystemDebugControl函數(shù)指針類型typedef DWORD (WINAPI *ZWSYSTEMDEBUGCONTROL)(DWORD,PVOID,DWORD,PVOID,DWORD,PVOID);BOOL GetKernelMemory(PVOID pKernelAddr, PBYTE pBuffer, ULONG uLength)

  { MEMORY_CHUNKS mc ;ULONG uReaded = 0;mc.Address=(ULONG)pKernelAddr;  //內(nèi)核內(nèi)存地址mc.pData = pBuffer;//用戶層內(nèi)存地址mc.Length = uLength;       //讀取內(nèi)存的長(zhǎng)度ULONG st  = -1 ;//獲得ZwSystemDebugControl函數(shù)地址ZWSYSTEMDEBUGCONTROL ZwSystemDebugControl = (ZWSYSTEMDEBUGCONTROL) GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwSystemDebugControl");//讀取內(nèi)核內(nèi)存數(shù)據(jù)到用戶層st = ZwSystemDebugControl(SysDbgReadVirtualMemory, &mc, sizeof(mc), 0, 0, &uReaded);return st == 0;}

  對(duì)于不同類型的句柄,其內(nèi)核對(duì)象所屬內(nèi)存對(duì)應(yīng)的結(jié)構(gòu)體不同,對(duì)于消息鉤子句柄,它的內(nèi)核對(duì)象所屬內(nèi)存對(duì)應(yīng)的結(jié)構(gòu)體實(shí)際上是_HOOK_INFO類型,其定義如下。

  typedef struct _HOOK_INFO { HANDLE hHandle; //鉤子的句柄DWORD Unknown1;PVOID Win32Thread; //一個(gè)指向 win32k!_W32THREAD 結(jié)構(gòu)體的指針PVOID Unknown2;PVOID SelfHook; //指向結(jié)構(gòu)體的首地址PVOID NextHook; //指向下一個(gè)鉤子結(jié)構(gòu)體int iHookType; //鉤子的類型。

  DWORD OffPfn; //鉤子函數(shù)的地址偏移,相對(duì)于所在模塊的偏移int iHookFlags; //鉤子標(biāo)志int iMod; //鉤子函數(shù)做在模塊的索引號(hào)碼,利用它可以得到模塊基址PVOID Win32ThreadHooked; //被鉤的線程結(jié)構(gòu)指針} HOOK_INFO,*PHOOK_INFO;由上可以看出,得到鉤子內(nèi)核對(duì)象數(shù)據(jù)后,該數(shù)據(jù)對(duì)應(yīng)HOOK_INFO結(jié)構(gòu)體信息。其中:hHandle是鉤子句柄,使用它就可以卸載鉤子。

  iHookType是鉤子的類型,消息鉤子類型定義如下。

  typedef enum  _HOOK_TYPE{ MY_WH_MSGFILTER = -1,MY_WH_JOURNALRECORD = 0,MY_WH_JOURNALPLAYBACK = 1,MY_WH_KEYBOARD = 2,MY_WH_GETMESSAGE = 3,MY_WH_CALLWNDPROC = 4,MY_WH_CBT = 5,MY_WH_SYSMSGFILTER = 6,MY_WH_MOUSE = 7,MY_WH_HARDWARE = 8,MY_WH_DEBUG = 9,MY_WH_SHELL = 10,MY_WH_FOREGROUNDIDLE = 11,MY_WH_CALLWNDPROCRET = 12,MY_WH_KEYBOARD_LL = 13,MY_WH_MOUSE_LL = 14 }HOOK_TYPE;OffPfn是鉤子回調(diào)函數(shù)的偏移地址,該偏移地址是相對(duì)于鉤子函數(shù)所在模塊基址的偏移。

  Win32Thread是指向_W32THREAD結(jié)構(gòu)體的指針,通過這個(gè)結(jié)構(gòu)體可以獲得鉤子所在進(jìn)程ID和線程ID.該結(jié)構(gòu)體定義如下。

  typedef struct _W32THREAD { PVOID    pEThread ;    //該指針用以獲得進(jìn)程ID和線程ID ULONG   RefCount ;ULONG  ptlW32 ;ULONG  pgdiDcattr ;ULONG   pgdiBrushAttr ;ULONG   pUMPDObjs ;ULONG    pUMPDHeap ;ULONG    dwEngAcquireCount ;ULONG    pSemTable ;ULONG    pUMPDObj ;PVOID ptl;PVOID ppi;            //該指針用以獲得模塊基址}W32THREAD, *PW32THREAD;_W32THREAD結(jié)構(gòu)體第一個(gè)參數(shù)pEThread指向的內(nèi)存偏移0x01EC處分別保存著進(jìn)程ID和線程ID.注意pEThread指針指向的內(nèi)存是內(nèi)核內(nèi)存。

  _W32THREAD結(jié)構(gòu)體最后一個(gè)參數(shù)ppi指向的內(nèi)存偏移0xA8處是所有模塊基址的地址表,   _HOOK_INFO結(jié)構(gòu)體的iMod成員就標(biāo)識(shí)了本鉤子所屬模塊基址在此地址表中的位置。(每個(gè)地址占4個(gè)字節(jié))所以通常使用ppi+0xa8+iMod*4定位模塊基址的地址。注意ppi指向的內(nèi)存是內(nèi)核內(nèi)存。

  2、實(shí)現(xiàn)細(xì)節(jié)首先編寫程序枚舉消息鉤子句柄,需要得到GUI TABLE,它的地址實(shí)際上存儲(chǔ)于User32.dll的一個(gè)全局變量中,該模塊導(dǎo)出的函數(shù)UserRegisterWowHandlers將返回該全局變量的值。所以我們只要調(diào)用這個(gè)函數(shù)就能夠得到GUI TABLE.然而UserRegisterWowHandlers是一個(gè)未公開的函數(shù),不確定它的函數(shù)原型,需要反匯編猜出它的原型。筆者反匯編后得到的原型如下。

  typedef PSHAREDINFO (__stdcall *USERREGISTERWOWHANDLERS) (PBYTE ,PBYTE );僅知道它兩個(gè)參數(shù)是兩個(gè)指針,但是不知道它的兩個(gè)參數(shù)的含義,所以我們無法構(gòu)造出合理的參數(shù)。如果隨便構(gòu)造參數(shù)傳進(jìn)去又會(huì)導(dǎo)致user32.dll模塊發(fā)生錯(cuò)誤。所以通過調(diào)用這個(gè)函數(shù)接收其返回值的方法就不能用了。再次反匯編該函數(shù)的實(shí)現(xiàn)可以看出,在不同操作系統(tǒng)下該函數(shù)的最后三行代碼如下。

  2K系統(tǒng):(5.0.2195.7032)

  :77E3565D B880D2E477 mov eax, 77E4D280:77E35662 C20800 ret 0008 XP系統(tǒng):(5.1.2600.2180)

  :77D535F5 B88000D777 mov eax, 77D70080:77D535FA 5D pop ebp:77D535FB C20800 ret 0008 2003系統(tǒng):(5.2.3790.1830)

  :77E514D9 B8C024E777 mov eax, 77E724C0:77E514DE C9 leave:77E514DF C2080000 ret 0008可以看到共同點(diǎn),該函數(shù)的倒數(shù)第三行代碼就是將保存GUI TABLE指針的全局變量值賦值給寄存器EAX,只要我們想辦法搜索到這個(gè)值即可。能夠看出無論是哪個(gè)版本的函數(shù)實(shí)現(xiàn)中,都有 C20800代碼,含義是ret 0008.我們可以自UserRegisterWowHandlers函數(shù)的入口地址開始一直搜索到C20800,找到它以后再向前搜索B8指令,搜到以后B8指令后面的四個(gè)字節(jié)數(shù)據(jù)就是我們需要的數(shù)據(jù)。代碼如下。

  //獲得UserRegisterWowHandlers函數(shù)的入口地址DWORD UserRegisterWowHandlers = (DWORD) GetProcAddress(LoadLibrary("user32.dll"), "UserRegisterWowHandlers");PSHAREDINFO pGUITable;  //保存GUITable地址的指針for(DWORD i=UserRegisterWowHandlers; i<UserRegisterWowHandlers+1000; i++)

  { if((*(USHORT*)i==0x08c2)&&*(BYTE *)(i+2)== 0x00)

  {     //已找到ret 0008指令,然后往回搜索B8 for (int j=i; j>UserRegisterWowHandlers; j——)

  {   //找到B8它后面四個(gè)字節(jié)保存的數(shù)值即為GUITable地址if (*(BYTE *)j == 0xB8)

  { pGUITable = (PSHAREDINFO)*(DWORD *)(j+1);break;} }break;}得到SHAREDINFO結(jié)構(gòu)指針后,它的成員pServerInfo的成員cHandleEntries就是句柄的總個(gè)數(shù),然后循環(huán)遍歷每一個(gè)句柄,找到屬于指定模塊的消息鉤子句柄。代碼如下。

  int iHandleCount = pGUITable->pServerInfo->cHandleEntries;HOOK_INFO HookInfo;DWORD dwModuleBase;struct TINFO { DWORD dwProcessID;DWORD dwThreadID;};char cModuleName[256] = {0};for (i=0; i<iHandleCount; i++)

  {              //判斷句柄類型是否為消息鉤子句柄if (pGUITable->pHandleEntry[i].bType == TYPE_HOOK)

  { DWORD dwValue = (DWORD)pGUITable->pHandleEntry[i].pObject;//獲得消息鉤子內(nèi)核對(duì)象數(shù)據(jù)GetKernelMemory(pGUITable->pHandleEntry[i].pObject, (BYTE *)&HookInfo, sizeof(HookInfo));W32THREAD w32thd;if( GetKernelMemory(HookInfo.pWin32Thread,(BYTE *)&w32thd , sizeof(w32thd)) )

  {  //獲取鉤子函數(shù)所在模塊的基址if (!GetKernelMemory((PVOID)((ULONG)w32thd.ppi+0xA8+4*HookInfo.iMod),(BYTE *)&dwModuleBase,   sizeof(dwModuleBase)))

  { continue;} TINFO tInfo;//獲取鉤子所屬進(jìn)程ID和線程ID if (!GetKernelMemory((PVOID)((ULONG)w32thd.pEThread+0x1ec),(BYTE *)&tInfo,   sizeof(tInfo)))

  { continue;} HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, tInfo.dwProcessID);if (hProcess == INVALID_HANDLE_VALUE)

  { continue;} //根據(jù)模塊基址,獲取鉤子函數(shù)所屬模塊的名稱if (GetModuleFileNameEx(hProcess, (HMODULE)dwModuleBase, cModuleName, 256))

  { OutputDebugString(cModuleName);OutputDebugString("\r\n");}

  利用上面的代碼就可以找到所屬病毒DLL的消息鉤子句柄,然后調(diào)用UnhookWindowsHookEx函數(shù)卸載這個(gè)消息鉤子就OK了。


本文出自:億恩科技【www.23lll.com】

服務(wù)器租用/服務(wù)器托管中國(guó)五強(qiáng)!虛擬主機(jī)域名注冊(cè)頂級(jí)提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經(jīng)營(yíng)性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經(jīng)營(yíng)性ICP/ISP/IDC證:豫B1.B2-20060070
  • 億恩南昌公司:
  • 經(jīng)營(yíng)性ICP/ISP證:贛B2-20080012
  • 服務(wù)器/云主機(jī) 24小時(shí)售后服務(wù)電話:0371-60135900
  • 虛擬主機(jī)/智能建站 24小時(shí)售后服務(wù)電話:0371-60135900
  • 專注服務(wù)器托管17年
    掃掃關(guān)注-微信公眾號(hào)
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權(quán)所有  地址:鄭州市高新區(qū)翠竹街1號(hào)總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務(wù)所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號(hào)
      0
     
     
     
     

    0371-60135900
    7*24小時(shí)客服服務(wù)熱線

     
     
    九色成人免费视频_久久一区视频_视频一区国产精品_精品视频在线观看
    国产亚洲欧洲| 一区二区三区视频免费在线观看| 欧美噜噜久久久xxx| 久色婷婷小香蕉久久| 欧美一区二区国产| 亚洲一区二区三区四区五区黄| 亚洲人成在线播放| 亚洲国产精品免费| 欧美一区综合| 亚洲免费一在线| 在线视频一区观看| 亚洲精品国产精品国产自| 亚洲大胆av| 在线精品在线| 好看的日韩av电影| 国产一区二区精品丝袜| 国产视频在线观看一区| 国产日韩免费| 国产一区二区三区精品久久久| 国产欧美欧美| 国产亚洲视频在线| 国产一区二区高清视频| 黄色综合网站| 精品成人一区二区| 在线观看欧美| 亚洲欧洲综合另类| 日韩视频免费观看| 这里只有视频精品| 亚洲欧美激情精品一区二区| 午夜国产精品视频免费体验区| 欧美一级理论性理论a| 久久爱www| 亚洲欧洲一区二区三区久久| 99v久久综合狠狠综合久久| 在线视频欧美一区| 亚洲免费中文字幕| 久久国产高清| 免费成人网www| 欧美日本韩国一区二区三区| 欧美视频在线观看 亚洲欧| 国产精品久久久久一区二区三区共| 国产精品女主播在线观看 | 久久久高清一区二区三区| 两个人的视频www国产精品| 欧美福利视频| 欧美日韩一区二区在线观看| 国产老肥熟一区二区三区| 国产主播精品在线| 91久久中文| 亚洲午夜精品网| 久久国内精品视频| 99精品视频一区二区三区| 亚洲综合视频1区| 久久免费黄色| 欧美精品一区二区三| 国产精品午夜国产小视频| 激情五月婷婷综合| 夜夜嗨av一区二区三区四季av| 亚洲欧美春色| 日韩视频在线播放| 欧美在线观看视频一区二区三区| 美女诱惑一区| 国产精品一区二区a| 亚洲高清123| 亚洲欧美久久| 日韩视频在线免费| 久久久久国产一区二区| 欧美日韩精品欧美日韩精品| 国产亚洲精品美女| 日韩一本二本av| 亚洲国产成人精品视频| 亚洲欧美国产高清| 欧美va天堂| 国产精品日本一区二区| 亚洲国产美女| 欧美一区中文字幕| 亚洲欧美国产精品va在线观看| 乱码第一页成人| 国产精品网红福利| 日韩亚洲在线观看| 亚洲黄色av一区| 性色av一区二区三区在线观看| 欧美国产日产韩国视频| 国产视频综合在线| 99精品99| 亚洲精品国产精品国产自| 久久精品盗摄| 国产精品国产自产拍高清av王其| 在线看日韩av| 欧美在线啊v一区| 午夜精品久久久| 欧美日韩精品免费观看视频完整| 精品动漫一区二区| 午夜国产精品视频| 亚洲欧美高清| 欧美视频在线观看一区| 亚洲精品久久在线| 亚洲高清在线观看| 久久精品三级| 欧美视频中文字幕| 亚洲啪啪91| 亚洲精品乱码久久久久久蜜桃91| 久久久噜噜噜久噜久久| 国产毛片久久| 亚洲愉拍自拍另类高清精品| 一区二区三区日韩欧美精品| 欧美成人一区二区| 在线播放日韩欧美| 久久精品国产999大香线蕉| 久久国产精品久久久| 国产精品区一区二区三| 一本久道久久久| 宅男噜噜噜66国产日韩在线观看| 欧美成人中文字幕| 亚洲电影av在线| 亚洲日韩欧美视频一区| 欧美成人嫩草网站| 亚洲国产日韩欧美在线动漫| 亚洲国产午夜| 欧美成人免费全部| 亚洲经典在线看| 亚洲美女免费精品视频在线观看| 母乳一区在线观看| 极品尤物久久久av免费看| 久久精品国产第一区二区三区最新章节 | 欧美高清在线一区二区| 在线观看一区视频| 亚洲国产视频a| 欧美gay视频激情| 91久久在线| 在线亚洲一区观看| 欧美午夜视频| 欧美日韩国产探花| 亚洲日本免费电影| 一区二区三区毛片| 欧美午夜电影网| 亚洲视频999| 欧美一区二区三区在线观看| 国产欧美日韩一级| 久久激情视频| 欧美国产日韩视频| 99精品黄色片免费大全| 亚洲欧美日本精品| 国产九色精品成人porny| 亚洲大片免费看| 欧美精品91| 一区二区三区免费看| 欧美专区在线| 伊人久久婷婷| 一区二区免费看| 国产精品日韩欧美一区二区三区 | 亚洲激情另类| 亚洲一区二区三| 国产久一道中文一区| 亚洲电影下载| 欧美区在线播放| 亚洲影视在线播放| 久久亚洲精品一区二区| 亚洲精品国产精品国自产观看浪潮| 这里是久久伊人| 国产欧美日韩综合| 亚洲国产日韩欧美一区二区三区| 欧美喷水视频| 欧美一区二区大片| 欧美大片在线观看一区| 一区二区不卡在线视频 午夜欧美不卡在| 午夜精品久久久久久久久久久久| 国外成人性视频| 一区二区三区不卡视频在线观看| 国产精品入口夜色视频大尺度 | 亚洲美女精品成人在线视频| 国产精品麻豆成人av电影艾秋| 欧美综合77777色婷婷| 欧美日本乱大交xxxxx| 亚洲男人的天堂在线观看| 免费成人黄色av| 亚洲男人影院| 欧美日韩国产色视频| 欧美一区日本一区韩国一区| 欧美日本一区| 欧美在线一区二区| 欧美日韩国产综合网| 欧美在线免费视频| 欧美涩涩视频| 亚洲国产毛片完整版| 国产精品日韩久久久久| 亚洲美女av电影| 国产拍揄自揄精品视频麻豆| 99国产精品久久久| 国产一区二区三区在线观看免费视频 | 99re热精品| 国产一区亚洲一区| 一区二区三区国产盗摄| 极品尤物久久久av免费看| 亚洲一区二区三区午夜| 在线观看欧美精品| 欧美自拍丝袜亚洲| 亚洲美女免费视频| 每日更新成人在线视频| 亚洲免费视频网站|