Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
HOOK API£¨ËÄ£©¡ª¡ª½ø³Ì·ÀÖÕÖ¹
 
À´×ÔÓÚ£º¹¤½³ÈôË® ·¢²¼ÓÚ 2016-2-19
  3797  次浏览      27
 

0x00 ǰÑÔ

ÕâËãÊÇÒ»¸öʵս°É£¬×öµÄÒ»¸öÓ¦ÓÃÐèҪʵÏÖ½ø³ÌµÄ·ÀÖÕÖ¹±£»¤£¬²éÁËÏà¹Ø×ÊÁϺó¾ö¶¨ÓÃHOOK APIµÄ·½Ê½ÊµÏÖ¡£Æð³õѧϰHOOK APIµÄÆðÒòÊÇÒòΪҪʵÏÖ¶Ô¼ôÇаåµÄ¼à¿Ø£¬ºóÀ´Ãæ¶Ô½ø³Ì±£»¤ÕâÑùÒ»¸öÐèÇóʱ£¬×ۺϸ÷·½×ÊÁϲ¢×Ô¼º¶¯ÊÖʵÏÖHOOK OpenProcess() ºÍ TerminateProcess() À´´Óµ÷ÓòãʵÏÖ½ø³ÌµÄ·ÀÖÕÖ¹¡£ÏÂÃæ½«½øÒ»²½½éÉÜʵÏֵĹý³Ì£¬Ò²ËãÊǶÔѧϰµÄÒ»¸ö×ܽáÓëʵս

0x01 ʵÏÖ˼·

´óÌåµÄHOOK APIµÄʵÏÖ˼·ÔÚÇ°Ãæ¼¸ÆªÏà¹ØÎÄÕÂÖÐÒѾ­½²¹ý¡£´óÖ¿ɷÖΪÒÔϲ½Ö裺1.È·¶¨ÒªHOOKµÄAPIÔ­ÐÍ£¬²¢²ÎÕÕÔ­ÐͶ¨Òå×Ô¼ºµÄAPI¡£2.ÔÚDLLÖÐʵÏÖ×Ô¼ºµÄAPI£¬²¢Ê¹ÓÃеÄAPIÈë¿ÚµØÖ·Ìæ»»Ô­APIµØÖ·ÊµÏÖHOOK£¬ÀûÓÃjmp xxxx Ö¸ÁîʵÏÖÖØ¶¨Ïò¡£ÆäÖпÉÒÔÀûÓÃGetProcAddress()»ñȡϵͳµÄAPIµØÖ·£¬Í¨¹ýWriteProcessMemory½«×Ô¼ºÐ´µÄAPIµØÖ·Ìæ»»µôÔ­APIµØÖ·¡£3.ÀûÓÃÊó±ê¹³×Ó½«×Ô¼ºµÄDLL×¢È뵽Ŀ±ê½ø³ÌÖС£

ÎÒÃÇÕâÀïҪʵÏÖ½ø³ÌµÄ·ÀÖÕÖ¹£¬Éè¼Æµ½µÄAPIÓÐÁ½¸ö£¬·Ö±ðÊÇOpenProcess() ºÍ TerminateProcess()£¬ÕâÁ½¸öAPIÔÚKernel32.dllÖС£Èç¹ûÖ»HOOK ÆäÖÐÒ»¸öAPIÊDz»¿ÉÐеģ¬ÈôÖ»HOOK OpenProcess()£¬ÄÇôÈÎÎñ¹ÜÀíÆ÷½«ÎÞ·¨»ñÈ¡µ½Êܱ£»¤½ø³ÌµÄÐÅÏ¢£¬½ø¶ø»á³ö´í¡£ÈôÖ»HOOK TerminateProcessÒ²ÊDz»¿ÉÐеģ¬ÒòΪһ¸ö½ø³ÌµÄ¾ä±úÔÚ±¾½ø³ÌÓëÆäËû½ø³ÌÖÐÊDz»Ò»ÑùµÄ£¬Òò´ËÈôÊÇÄã²»ÖªµÀ×Ô¼º½ø³ÌÔÚÆäËû½ø³ÌÖеľä±úÄǽ«ÎÞ·¨HOOK TerminateProcess¡£

±¾ÊÂÀý²ÉÓõķ½°¸ÊÇ£¬Í¬Ê±HOOK OpenProcess()ºÍTerminateProcess()£¬ÔÚOpenProcessÖлñÈ¡×Ô¼ºµÄÊܱ£»¤½ø³ÌÔÚÆäËû½ø³ÌÖеĵ÷Óþä±ú£¬È»ºóÔÙTerminateProcess½ø³Ì¼à¿Ø£¬Èç¹û·¢ÏÖÓнø³Ìµ÷ÓÃTerminateProcess²¢ÇÒËù½èË޵ĶÔÏóÊÇ×Ô¼ºÒª±£»¤µÄ½ø³Ì£¬ÄÇô¾Í¸ø³ö½ûÖ¹¹Ø±ÕµÄÌáʾ´°¿Ú¡£

OpenProcess()ÊÇ´ò¿ª½ø³Ì£¬¶øTerminateProcess()ÊǽáÊø½ø³Ì£¬ÔÚµ÷ÓÃTerminateProcess()½áÊø½ø³Ìʱ£¬±ØÈ»»áÏȵ÷ÓÃOpenProcess()½ø³Ì´ò¿ª½ø³Ì¾ä±ú¡£ÒÔÏÂÊÇÕâÁ½¸öAPIµÄÔ­ÐÍ£º

HANDLE OpenProcess(

DWORD dwDesiredAccess, //¿ÊÍûµÃµ½µÄ·ÃÎÊȨÏÞ£¨±êÖ¾£©

BOOL bInheritHandle, // ÊÇ·ñ¼Ì³Ð¾ä±ú

DWORD dwProcessId // ½ø³Ì±êʾ·û

);

BOOL TerminateProcess(

HANDLE hProcess, //½ø³Ì¾ä±ú

UINT uExitCode //½ø³ÌÖÕÖ¹Âë

);

0x02 HOOL DLLµÄʵÏÖ

MonitorDllÖеÄMonitorDll.hÔ´Â룺

// MonitorDll.h : MonitorDll DLL µÄÖ÷Í·Îļþ

//

#pragma once

#ifndef __AFXWIN_H__

#error "ÔÚ°üº¬´ËÎļþ֮ǰ°üº¬"stdafx.h"ÒÔÉú³É PCH Îļþ"

#endif

#include "resource.h" // Ö÷·ûºÅ

// CMonitorDllApp

// ÓйشËÀàʵÏÖµÄÐÅÏ¢£¬Çë²ÎÔÄ MonitorDll.cpp

//

class CMonitorDllApp : public CWinApp

{

public:

CMonitorDllApp();

// ÖØÐ´

public:

virtual BOOL InitInstance();

int ExitInstance();

DECLARE_MESSAGE_MAP()

};

MonitorDllÖеÄMonitorDll.cppÔ´Â룺

// MonitorDll.cpp : ¶¨Òå DLL µÄ³õʼ»¯Àý³Ì¡£

//

#include "stdafx.h"

#include "MonitorDll.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

/*

È«¾Ö±äÁ¿

*/

// ¹²Ïí±äÁ¿

#pragma data_seg("Share")

HWND g_hwnd = NULL; // Ö÷´°¿Ú¾ä±ú£¬¼ÓÔØHOOKʱ´«Èë

HINSTANCE hInstance = NULL; // ±¾DLLµÄʵÀý¾ä±ú

HHOOK hhook = NULL; // Êó±ê¹³×Ó¾ä±ú

DWORD g_dwProcessId; // ½ø³Ìid

HANDLE g_hProcess = NULL; // ±£´æ±¾½ø³ÌÔÚÔ¶½ø³ÌÖеľä±ú

#pragma data_seg()

#pragma comment(linker,"/section:Share,rws")

// ÆäËû±äÁ¿¶¨Òå

HANDLE hProcess = NULL; // µ±Ç°½ø³Ì¾ä±ú

bool bIsInjected = false; // ±£Ö¤Ö»×¢ÈëÒ»´Î

#define CODE_LENGTH 5 // Èë¿ÚÖ¸Á¶È

// TerminateProcess

typedef BOOL (WINAPI *TypeTerminateProcess)(_In_ HANDLE hProcess, _In_ UINT uExitCode); //Kernel32.dll

TypeTerminateProcess oldTerminateProcess = NULL;

FARPROC pfOldTerminateProcess = NULL;

BOOL WINAPI MyTerminateProcess(_In_ HANDLE hProcess, _In_ UINT uExitCode);

BYTE oldCodeTermPro[CODE_LENGTH]; // Ô­APIÈë¿Ú

BYTE newCodeTermpro[CODE_LENGTH]; // ÐÂAPIÈë¿Ú

// OpenProcess

typedef HANDLE(WINAPI *TypeOpenProcess)( _In_ DWORD dwDesiredAccess,_In_ BOOL bInheritHandle,_In_ DWORD dwProcessId);

TypeOpenProcess oldOpenProcess = NULL;

FARPROC pfOldOpenProcess = NULL;

HANDLE WINAPI MyOpenProcess(_In_ DWORD dwDesiredAccess,_In_ BOOL bInheritHandle,_In_ DWORD dwProcessId);

BYTE oldCodeOpenPro[CODE_LENGTH];

BYTE newCodeOpenPro[CODE_LENGTH];

BOOL WINAPI HookLoad(HWND hwnd,DWORD dwProcessId); // ¹ØÓÚdll hook ²Ù×÷

VOID WINAPI HookUnload();

VOID Inject();

VOID HookOn();

VOID HookOff();

BOOL SetPrivilege(

HANDLE hToken, // access token handle

LPCTSTR lpszPrivilege, // name of privilege to enable/disable

BOOL bEnablePrivilege // to enable or disable privilege

) ;

LRESULT CALLBACK MouseProc( // Êó±ê¹³×Ó×Ó¹ý³Ìµ÷ÓÃ

int nCode, // hook code

WPARAM wParam,// message identifier

LPARAM lParam // mouse coordinates

);

BOOL WriteMemory(LPVOID lpAddress,BYTE* pcode,size_t length); //½«³¤¶ÈΪ length µÄ pcode дÈëµØÖ· lpAddress µÄ½ø³ÌÄÚ´æÖÐ

//

//TODO: Èç¹û´Ë DLL Ïà¶ÔÓÚ MFC DLL ÊǶ¯Ì¬Á´½ÓµÄ£¬

// Ôò´Ó´Ë DLL µ¼³öµÄÈκε÷Èë

// MFC µÄº¯Êý±ØÐ뽫 AFX_MANAGE_STATE ºêÌí¼Óµ½

// ¸Ãº¯ÊýµÄ×îÇ°Ãæ¡£

//

// ÀýÈç:

//

// extern "C" BOOL PASCAL EXPORT ExportedFunction()

// {

// AFX_MANAGE_STATE(AfxGetStaticModuleState());

// // ´Ë´¦ÎªÆÕͨº¯ÊýÌå

// }

//

// ´ËºêÏÈÓÚÈκΠMFC µ÷ÓÃ

// ³öÏÖÔÚÿ¸öº¯ÊýÖÐÊ®·ÖÖØÒª¡£ÕâÒâζ×Å

// Ëü±ØÐë×÷Ϊº¯ÊýÖеĵÚÒ»¸öÓï¾ä

// ³öÏÖ£¬ÉõÖÁÏÈÓÚËùÓжÔÏó±äÁ¿ÉùÃ÷£¬

// ÕâÊÇÒòΪËüÃǵĹ¹Ô캯Êý¿ÉÄÜÉú³É MFC

// DLL µ÷Óá£

//

// ÓÐ¹ØÆäËûÏêϸÐÅÏ¢£¬

// Çë²ÎÔÄ MFC ¼¼Êõ˵Ã÷ 33 ºÍ 58¡£

//

// CMonitorDllApp

BEGIN_MESSAGE_MAP(CMonitorDllApp, CWinApp)

END_MESSAGE_MAP()

// CMonitorDllApp ¹¹Ôì

CMonitorDllApp::CMonitorDllApp()

{

// TODO: ÔÚ´Ë´¦Ìí¼Ó¹¹Ôì´úÂ룬

// ½«ËùÓÐÖØÒªµÄ³õʼ»¯·ÅÖÃÔÚ InitInstance ÖÐ

}

// ΨһµÄÒ»¸ö CMonitorDllApp ¶ÔÏó

CMonitorDllApp theApp;

// CMonitorDllApp ³õʼ»¯

BOOL CMonitorDllApp::InitInstance()

{

CWinApp::InitInstance();

hInstance = AfxGetInstanceHandle(); // »ñÈ¡±¾dll¾ä±ú

/*

ÏÈÌá¸ßȨÏÞ£¬ÔÙ»ñÈ¡½ø³Ì¾ä±ú¡£

ÒòΪֻÓÐȨÏÞ×ã¹»£¬²ÅÄÜ»ñÈ¡µ½µ±Ç°½ø³ÌµÄ¾ä±ú¡£

*/

HANDLE hToken;

BOOL bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);

if (bRet == FALSE)

{

AfxMessageBox(_T("ȨÏÞÌáÉýʧ°Ü"));

}

SetPrivilege(hToken,SE_DEBUG_NAME,TRUE);

DWORD dwPid = ::GetCurrentProcessId();

hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);

if (hProcess == NULL)

{

CString str;

str.Format(_T("OpenProcess fail!!, error code = [%d]"),GetLastError());

AfxMessageBox(str);

return FALSE;

}

Inject(); // ¿ªÊ¼×¢Èë

return TRUE;

}

//

// ʵÀýÍ˳öº¯Êý¡£Í˳öʱ£¬Ò»¶¨Òª¼ÇµÃ»Ö¸´Ô­º¯ÊýµØÖ·£¡£¡£¡

//

int CMonitorDllApp::ExitInstance()

{

HookOff(); //Òª¼ÇµÃ»Ö¸´Ô­º¯ÊýµØÖ·

return CWinApp::ExitInstance();

}

/*

Êó±ê¹³×Ó×Ó¹ý³Ì£¬Ä¿µÄÊǼÓÔØ±¾dllµ½Ê¹ÓÃÊó±êµÄ³ÌÐò.

Êó±ê¹³×ÓµÄ×÷Ó㺵±Êó±êÔÚij³ÌÐò´°¿ÚÖÐʱ£¬¾Í»á¼ÓÔØÎÒÃÇÕâ¸ödll¡£

¼´Ê¹±¾DLLËæ×ÅÊó±ê¹³×Ó×¢È뵽Ŀ±ê½ø³ÌÖС£

*/

LRESULT CALLBACK MouseProc(

int nCode, // hook code

WPARAM wParam, // message identifier

LPARAM lParam // mouse coordinates

)

{

return CallNextHookEx(hhook,nCode,wParam,lParam);

}

/*

°²×°¹³×Ó¡£

Ö÷µ÷³ÌÐò´«Èë´°¿Ú¾ä±úºÍ½ø³Ìid¡£

*/

BOOL WINAPI HookLoad(HWND hwnd,DWORD dwProcessId)

{

BOOL ret = FALSE;

g_hwnd = hwnd;

g_dwProcessId = dwProcessId;

hhook = ::SetWindowsHookEx(WH_MOUSE,MouseProc,hInstance,0);

if (hhook == NULL)

{

return FALSE;

}

else

{

return TRUE;

}

}

/*

Ð¶ÔØ¹³×Ó¡£

×¢£ºÐ¶Ôع³×Ó֮ǰ£¬Ò»¶¨Òª¼ÇµÃ»Ö¸´Ô­º¯ÊýµØÖ·£¡£¡£¡

*/

VOID WINAPI HookUnload()

{

HookOff(); // »Ö¸´Ô­º¯ÊýµØÖ·

if (hhook != NULL)

{

UnhookWindowsHookEx(hhook);

}

if (hInstance != NULL)

{

FreeLibrary(hInstance);

}

}

/*

×¢È뺯Êý¡£

Ö÷ÒªÍê³ÉÔ­º¯ÊýµØÖ·µÄ±£´æ£¬±£´æµ½ oldCode_[]ÖУ»

ÐÂÈë¿ÚµØÖ·µÄ¼ÆË㣬±£´æµ½newCode_[]ÖУ¬¼´ jmp xxxx Ö¸Áî¡£

ÐÂÈë¿ÚµØÖ· = к¯ÊýµØÖ· - Ô­º¯ÊýµØÖ· - Ö¸Á¶È

×îºóÒ»¶¨Òª¼ÇµÃHookOn£¡£¡

*/

VOID Inject()

{

if (bIsInjected == TRUE)

{

return;

}

bIsInjected = TRUE;// ±£Ö¤Ö»×¢ÈëÒ»´Î

// TerminateProcess

HMODULE hmodleKernel32;

hmodleKernel32 = ::LoadLibrary(_T("Kernel32.dll"));

if (NULL == hmodleKernel32)

{

AfxMessageBox(_T("¼ÓÔØKernel32.dllʧ°Ü"));

return;

}

// »ñȡԭº¯ÊýµØÖ·

oldTerminateProcess = (TypeTerminateProcess)GetProcAddress(hmodleKernel32,"TerminateProcess");

if (NULL == oldTerminateProcess)

{

AfxMessageBox(_T("»ñÈ¡TerminateProcessº¯Êýʧ°Ü"));

return;

}

pfOldTerminateProcess = (FARPROC)oldTerminateProcess;

// ±£´æÔ­º¯ÊýÈë¿Ú

_asm

{

lea edi,oldCodeTermPro

mov esi,pfOldTerminateProcess

cld

mov ecx,CODE_LENGTH

rep movsb

}

// Ìæ»»Ðº¯ÊýÈë¿Ú

newCodeTermpro[0] = 0xe9;

_asm

{

lea eax,MyTerminateProcess

mov ebx,pfOldTerminateProcess

sub eax,ebx

sub eax,CODE_LENGTH

mov dword ptr [newCodeTermpro+1],eax

}

// OpenProcess

oldOpenProcess = (TypeOpenProcess)GetProcAddress(hmodleKernel32,"OpenProcess");

if (NULL == oldOpenProcess)

{

AfxMessageBox(_T("»ñÈ¡OpenProcessµØÖ·Ê§°Ü"));

return;

}

pfOldOpenProcess = (FARPROC)oldOpenProcess;

_asm

{

lea edi,oldCodeOpenPro

mov esi,pfOldOpenProcess

cld

mov ecx,CODE_LENGTH

rep movsb

}

newCodeOpenPro[0] = 0xe9;

_asm

{

lea eax,MyOpenProcess

mov ebx,pfOldOpenProcess

sub eax,ebx

sub eax,CODE_LENGTH

mov dword ptr [newCodeOpenPro+1],eax

}

HookOn(); //Ìî³äÍê±Ï£¬¿ªÊ¼HOOK

}

/*

½«³¤¶ÈΪ length µÄ pcode дÈëµØÖ· lpAddress µÄ½ø³ÌÄÚ´æÖÐ

*/

BOOL WriteMemory(LPVOID lpAddress,BYTE* pcode,size_t length)

{

ASSERT(hProcess != NULL);

DWORD dwtemp,dwOldProtect,dwRet,dwWrited;

dwRet = VirtualProtectEx(hProcess,lpAddress,length,PAGE_READWRITE,&dwOldProtect);

CString logInfo;

if ( 0 == dwRet)

{

logInfo.Format(_T("WriteMemory :: Call VirtualProtectEx fail, eror code = [%d]\n\n"),GetLastError());

AfxMessageBox(logInfo);

return FALSE;

}

dwRet = WriteProcessMemory(hProcess,lpAddress,pcode,length,&dwWrited);

if ( 0 == dwRet || 0 == dwWrited)

{

logInfo.Format(_T("WriteMemory :: Call WriteProcessMomory fail, error code = [%d]\n\n"),GetLastError());

AfxMessageBox(logInfo);

return FALSE;

}

dwRet = VirtualProtectEx(hProcess,lpAddress,length,dwOldProtect,&dwtemp);

if ( 0 == dwRet )

{

logInfo.Format(_T("WriteMemory :: Recover Protect fail, error code = [%d]\n\n"),GetLastError());

AfxMessageBox(logInfo);

return FALSE;

}

return TRUE;

}

/*

¿ªÊ¼HOOK¡£

¼´£¬½«Inject ³õʼ»¯ºÃµÄÈë¿ÚµØÖ·½øÐÐдÈë½ø³ÌÄÚ´æÖС£

ÕâÀ½«Ðº¯ÊýÈë¿Ú newCode_[]£¬Ð´ÈëÄÚ´æÖС£

ÕâÑùÒ»À´£¬ÔÚÔ­º¯Êý±»µ÷ÓõÄʱºò£¬¾Í»áÌø×ªµ½ÎÒÃÇк¯ÊýµÄλÖá£

×¢: ÕâÀï´¦ÀíµÄº¯Êý£¬Êǵ±Ç°ÐèÒªÌæ»»µÄËùÓк¯Êý£¬ËùÒÔÖ»ÔÚInject()º¯ÊýÖе÷Óã¬

¼´½øÐгõʼ»¯µÄʱºòÓõ½¸Ãº¯Êý¡£

*/

VOID HookOn()

{

BOOL ret;

ret = WriteMemory(pfOldTerminateProcess,newCodeTermpro,CODE_LENGTH);

if (FALSE == ret)

{

AfxMessageBox(_T("HookOn :: Fail to write pfOldTerminateProcess"));

}

ret = WriteMemory(pfOldOpenProcess,newCodeOpenPro,CODE_LENGTH);

if (FALSE == ret)

{

AfxMessageBox(_T("HookOn :: Fail to write pfOldOpenProcess"));

}

}

/*

Í£Ö¹HOOK¡£

»Ö¸´Ô­º¯ÊýµØÖ·¡£

×¢£ºÕâÀï´¦ÀíµÄÊÇËùÓÐÌæ»»µÄº¯Êý£¬ËùÒÔÒ»°ãÇé¿öÏÂÖ»ÓÐÔÚÐ¶ÔØHOOKº¯ÊýÖе÷ÓÃ

*/

VOID HookOff()

{

ASSERT(hProcess != NULL);

BOOL ret;

ret = WriteMemory(pfOldTerminateProcess,oldCodeTermPro,CODE_LENGTH);

if (FALSE == ret)

{

AfxMessageBox(_T("HookOff :: fail to recover pfOldTerminateProcess \n\n"));

}

ret = WriteMemory(pfOldOpenProcess,oldCodeOpenPro,CODE_LENGTH);

if (FALSE == ret)

{

AfxMessageBox(_T("HookOff :: fail to recover pfOldOpenProcess"));

}

}

/*

ÌáÉý½ø³ÌȨÏÞ¡£

*/

BOOL SetPrivilege(

HANDLE hToken, // access token handle

LPCTSTR lpszPrivilege, // name of privilege to enable/disable

BOOL bEnablePrivilege // to enable or disable privilege

)

{

TOKEN_PRIVILEGES tp;

LUID luid;

CString info;

if ( !LookupPrivilegeValue(

NULL, // lookup privilege on local system

lpszPrivilege, // privilege to lookup

&luid ) ) // receives LUID of privilege

{

info.Format(_T("LookupPrivilegeValue error: %u\n"), GetLastError() );

AfxMessageBox(info);

return FALSE;

}

tp.PrivilegeCount = 1;

tp.Privileges[0].Luid = luid;

if (bEnablePrivilege)

tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

else

tp.Privileges[0].Attributes = 0;

// Enable the privilege or disable all privileges.

if ( !AdjustTokenPrivileges(

hToken,

FALSE,

&tp,

sizeof(TOKEN_PRIVILEGES),

(PTOKEN_PRIVILEGES) NULL,

(PDWORD) NULL) )

{

info.Format(_T("AdjustTokenPrivileges error: %u\n"), GetLastError() );

AfxMessageBox(info);

return FALSE;

}

if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)

{

info.Format(_T("The token does not have the specified privilege. \n"));

AfxMessageBox(info);

return FALSE;

}

return TRUE;

}

//

// ×Ô¼ºÖØÐ¶¨ÒåµÄ½ø³ÌÖÕÖ¹º¯Êý¡£

// ¼ì²éµ±Ç°ÒªÖÕÖ¹µÄ½ø³ÌÊÇ·ñÊÇÊܱ£»¤½ø³Ì£¬ÈôÊÇÔò½ûÖ¹¹Ø±Õ¡£

//

BOOL WINAPI MyTerminateProcess(_In_ HANDLE hProcess, _In_ UINT uExitCode)

{

BOOL ret;

if (g_hProcess == hProcess)

{

AfxMessageBox(_T("²»ÄܹرÕÊܱ£»¤½ø³ÌŶ£¡£¡"));

ret = TRUE;

}

else

{

WriteMemory(pfOldTerminateProcess,oldCodeTermPro,CODE_LENGTH);

ret = oldTerminateProcess(hProcess,uExitCode);

WriteMemory(pfOldTerminateProcess,newCodeTermpro,CODE_LENGTH);

}

return ret;

}

//

// ×Ô¼º¶¨ÒåµÄ´ò¿ª½ø³Ìº¯Êý¡£

// Èôµ±Ç°´ò¿ª½ø³ÌΪÊܱ£»¤½ø³Ì£¬Ôò¼Ç¼Ï¸ÃÔ¶³Ìµ÷Óþä±ú¡£

//

HANDLE WINAPI MyOpenProcess(_In_ DWORD dwDesiredAccess,_In_ BOOL bInheritHandle,_In_ DWORD dwProcessId)

{

HANDLE hProcess = NULL;

WriteMemory(pfOldOpenProcess,oldCodeOpenPro,CODE_LENGTH);

hProcess = oldOpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId);

if ( dwProcessId == g_dwProcessId)

{

g_hProcess = hProcess;

}

WriteMemory(pfOldOpenProcess,newCodeOpenPro,CODE_LENGTH);

return hProcess;

}

MonitorDllÖеÄMonitorDll.def

; MonitorDll.def : ÉùÃ÷ DLL µÄÄ£¿é²ÎÊý¡£

LIBRARY

EXPORTS

; ´Ë´¦¿ÉÒÔÊÇÏÔʽµ¼³ö

HookLoad

HookUnload

0x03 Ö÷µ÷MFC´°¿Ú

MyWindowµÄMyWindowDlg.h

// MyWindowDlg.h : Í·Îļþ

//

#pragma once

// CMyWindowDlg ¶Ô»°¿ò

class CMyWindowDlg : public CDialogEx

{

// ¹¹Ôì

public:

CMyWindowDlg(CWnd* pParent = NULL); // ±ê×¼¹¹Ô캯Êý

// ¶Ô»°¿òÊý¾Ý

enum { IDD = IDD_MYWINDOW_DIALOG };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö

// ʵÏÖ

protected:

HICON m_hIcon;

HINSTANCE m_hinstHookDll; // MonitorDllµÄʵÀý¾ä±ú

void HookLoad(); // ¼ÓÔØHOOK

void HookUnload(); // Ð¶ÔØHOOK

// Éú³ÉµÄÏûÏ¢Ó³É亯Êý

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

afx_msg void OnClose(); // ¹Ø±Õ³ÌÐòµÄʱºòÐ¶ÔØDLL !!!!!

DECLARE_MESSAGE_MAP()

};

MyWindowµÄMyWindowDlg.cpp

// MyWindowDlg.cpp : ʵÏÖÎļþ

//

#include "stdafx.h"

#include "MyWindow.h"

#include "MyWindowDlg.h"

#include "afxdialogex.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// ÓÃÓÚÓ¦ÓóÌÐò"¹ØÓÚ"²Ëµ¥ÏîµÄ CAboutDlg ¶Ô»°¿ò

class CAboutDlg : public CDialogEx

{

public:

CAboutDlg();

// ¶Ô»°¿òÊý¾Ý

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV Ö§³Ö

// ʵÏÖ

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)

END_MESSAGE_MAP()

// CMyWindowDlg ¶Ô»°¿ò

CMyWindowDlg::CMyWindowDlg(CWnd* pParent /*=NULL*/)

: CDialogEx(CMyWindowDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMyWindowDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CMyWindowDlg, CDialogEx)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

END_MESSAGE_MAP()

// CMyWindowDlg ÏûÏ¢´¦Àí³ÌÐò

BOOL CMyWindowDlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

// ½«"¹ØÓÚ..."²Ëµ¥ÏîÌí¼Óµ½ÏµÍ³²Ëµ¥ÖС£

// IDM_ABOUTBOX ±ØÐëÔÚϵͳÃüÁΧÄÚ¡£

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

BOOL bNameValid;

CString strAboutMenu;

bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// ÉèÖô˶Ի°¿òµÄͼ±ê¡£µ±Ó¦ÓóÌÐòÖ÷´°¿Ú²»ÊǶԻ°¿òʱ£¬¿ò¼Ü½«×Ô¶¯

// Ö´Ðд˲Ù×÷

SetIcon(m_hIcon, TRUE); // ÉèÖôóͼ±ê

SetIcon(m_hIcon, FALSE); // ÉèÖÃСͼ±ê

// TODO: ÔÚ´ËÌí¼Ó¶îÍâµÄ³õʼ»¯´úÂë

HookLoad(); // ¼ÓÔØHOOK

return TRUE; // ³ý·Ç½«½¹µãÉèÖõ½¿Ø¼þ£¬·ñÔò·µ»Ø TRUE

}

void CMyWindowDlg::OnClose()

{

// TODO: ÔÚ´ËÌí¼ÓÏûÏ¢´¦Àí³ÌÐò´úÂëºÍ/»òµ÷ÓÃĬÈÏÖµ

HookUnload(); // Í˳ö´°¿Ú£¬ÒªÐ¶ÔØHOOK

CDialogEx::OnClose();

}

void CMyWindowDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialogEx::OnSysCommand(nID, lParam);

}

}

// Èç¹ûÏò¶Ô»°¿òÌí¼Ó×îС»¯°´Å¥£¬ÔòÐèÒªÏÂÃæµÄ´úÂë

// À´»æÖƸÃͼ±ê¡£¶ÔÓÚʹÓÃÎĵµ/ÊÓͼģÐ굀 MFC Ó¦ÓóÌÐò£¬

// Õ⽫ÓÉ¿ò¼Ü×Ô¶¯Íê³É¡£

void CMyWindowDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // ÓÃÓÚ»æÖƵÄÉ豸ÉÏÏÂÎÄ

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// ʹͼ±êÔÚ¹¤×÷Çø¾ØÐÎÖоÓÖÐ

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// »æÖÆÍ¼±ê

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialogEx::OnPaint();

}

}

//µ±Óû§Í϶¯×îС»¯´°¿Úʱϵͳµ÷Óô˺¯ÊýÈ¡µÃ¹â±ê

//ÏÔʾ¡£

HCURSOR CMyWindowDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

void CMyWindowDlg::HookLoad()

{

m_hinstHookDll = ::LoadLibrary(_T("C:\\testProject\\MonitorDll.dll"));

CString loginfo;

if ( NULL == m_hinstHookDll)

{

loginfo.Format(_T("¼ÓÔØ MonitorDll.dllʧ°Ü£¬´íÎó´úÂë = [%d] "),GetLastError());

AfxMessageBox(loginfo);

return;

}

typedef BOOL (WINAPI* LoadMonitor)(HWND hwnd,DWORD dwProcessId);

LoadMonitor loadMonitor = NULL;

loadMonitor = (LoadMonitor)::GetProcAddress(m_hinstHookDll,"HookLoad");

if (NULL == loadMonitor)

{

loginfo.Format(_T("»ñÈ¡º¯Êý HookLoad ʧ°Ü£¬´íÎó´úÂë = [%d]"),GetLastError());

AfxMessageBox(loginfo);

}

if (loadMonitor(m_hWnd,GetCurrentProcessId()))

{

loginfo.Format(_T("HOOK¼ÓÔØ³É¹¦"));

AfxMessageBox(loginfo);

}

else

{

loginfo.Format(_T("HOOK¼ÓÔØÊ§°Ü"));

AfxMessageBox(loginfo);

}

}

/*

Ð¶ÔØHOOKDLL

*/

void CMyWindowDlg::HookUnload()

{

CString logInfo;

if (m_hinstHookDll == NULL)

{

m_hinstHookDll = LoadLibrary(_T("MonitorDll.dll"));

if ( NULL == m_hinstHookDll)

{

logInfo.Format(_T("¼ÓÔØ MonitorDll.dllʧ°Ü£¬´íÎó´úÂë = [%d]"),GetLastError());

AfxMessageBox(logInfo);

return;

}

}

typedef VOID (WINAPI* UnloadHook)();

UnloadHook unloadHook = NULL;

unloadHook = (UnloadHook)::GetProcAddress(m_hinstHookDll,"HookUnload");

if (NULL == unloadHook)

{

logInfo.Format(_T("»ñÈ¡º¯Êý HookUnload ʧ°Ü£¬´íÎó´úÂë = [%d]"),GetLastError());

AfxMessageBox(logInfo);

return;

}

unloadHook();

}

0x04 ²âÊÔ

±¾ÊµÀý˵Ã÷£ºÓÐÁ½¸öÊä³öÎļþ£¬Ò»¸öÊÇMonitorDll.dll£¬ÕâÊDZàÒëMFC DLL¹¤³ÌµÃµ½µÄ£¬ÓÃÀ´ÊµÏÖHOOK APIµÄ¹¦ÄÜ£¬ÓÉÖ÷´°¿Úµ÷Óã¬×¢È뵽Ŀ±ê½ø³ÌÖС£Ö÷´°¿Ú³ÌÐòMyWindow£¬ÔÚ´°¿Ú³õʼ»¯Ê±¼ÓÔØHOOK£¬ÔÚ´°¿Ú½ø³ÌÕý³£Í˳öÊ±Ð¶ÔØHOOK¡£ÊµÀý²âÊÔЧ¹ûÈçÏ£º

´°¿Ú³õʼ»¯¹ý³Ì£¬´òÓ¡Êܱ£»¤½ø³Ìid£º

´°¿Ú³õʼ»¯¹ý³ÌÖÐ×Ô¶¯¼ÓÔØHOOK£¬³É¹¦£º

µã»÷È·¶¨£¬³öÏÖÒÔ϶Ի°¿ò£º

´ò¿ªÈÎÎñ¹ÜÀíÆ÷£¬ÕÒµ½ÎÒÃǵĴ°¿Ú½ø³ÌMyWindow.exe£º

ÊÔÍ¼Ç¿ÖÆ¹Ø±ÕÎÒÃǵĽø³ÌMyWindow.exe£º

µ¯³ö²»ÄܹرնԻ°¿ò£¬ÕâÑùÒ²¾Í·ÀÖ¹Á˽ø³Ì±»Ç¿Öƹرգº

   
3797 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ

ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ