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

1Ôª 10Ôª 50Ôª





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



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

0x00 ǰÑÔ

±¾ÊµÀýҪʵÏÖHOOK MessageBox£¬°üÀ¨MessageBoxAºÍMessageBoxW£¬ÆäʵÏÖϸ½ÚÓëHOOK API£¨¶þ£©ÖнéÉܵĻù±¾ÀàËÆ£¬Î¨Ò»²»Í¬µÄÊÇ£¬±¾ÊµÀýҪʵÏÖ¶ÔËùÓгÌÐòµÄHOOK MessageBox£¬¼´ÎÞÂÛϵͳÖÐÄÄÒ»¸ö³ÌÐòµ÷ÓÃMessageBox¶¼»á±»Öض¨Ïòµ½ÎÒÃÇʵÏÖµÄеÄAPIÖС£

֮ǰ˵¹ý£¬ÔÚWindowsÖУ¬Ã¿¸ö½ø³Ì¶¼ÓÐ×Ô¼ºµÄµØÖ·¿Õ¼ä£¬½ø³Ì²»Äܵ÷ÓñðµÄ½ø³ÌÖеĺ¯Êý¡£ÕâÀïÉæ¼°µ½Ò»¸ö¹Ø¼ü£¬ÈçºÎÈÃÎÒÃÇʵÏÖµÄеÄAPIµ÷ÓõØÖ·´æÔÚÓÚËùÓнø³ÌµÄµØÖ·¿Õ¼äÖÐÄØ£¿Èç¹ûÕâÎÞ·¨ÊµÏֵϰ£¬ÆäËû½ø³Ì¾ÍÎÞ·¨µ÷Óõ½ÎÒÃÇËùʵÏÖµÄAPI¡£ÕâÀïÉæ¼°µ½µÄ¹Ø¼ü¾ÍÊÇ£¬ÈçºÎ½«ÎÒÃǵĴúÂë×¢Èëµ½±ðµÄ½ø³ÌÖС£

ÕâÀïÓÐÒ»¸öʵÏÖÊֶΣ¬¾ÍÊǽ«ÎÒÃÇʵÏֵĴúÂëËæ×Åϵͳ¹³×Ó×¢È뵽Ŀ±ê½ø³ÌÖУ¬ÎÒÃÇÔÚHOOK API £¨Ò»£©Öн²¹ýÊó±ê¹³×Ó£¬Êó±ê¹³×ÓÒ»µ©Æô¶¯£¬¾Í»á´æÔÚÓÚÿ¸öµ±Ç°ÔËÐеĽø³ÌÖУ¬ÊµÏÖ¶ÔÆÁÄ»×ø±êµÄ¶¨Î»¡£»¹ÓÐÒ»¸ö¹Ø¼ü¾ÍÊÇ£¬ÕâÑùµÄ¹³×ÓÐèҪעÈëµ½¶à¸öÄ¿±ê½ø³ÌÖУ¬ÄÇôÕâ¾ÍÒªÔÚ¶¯Ì¬Á´½Ó¿â£¨DLL£©ÖÐʵÏÖ£¬È»ºóÆô¶¯Ä³Ò»Ö÷µ÷½ø³Ì½«ÕâÑùÒ»¸öDLL×¢È뵽Ŀ±ê½ø³ÌÖУ¬´Ó¶øÊµÏÖHOOK API¡£

±¾ÊµÀý½éÉÜÈçºÎ½«ÊµÏÖÁËHOOK MessageBoxµÄDLL×¢Èëµ½ËùÓнø³ÌÖеĹý³Ì¡£

0x01 HOOK DLLµÄʵÏÖ

1.½¨Á¢Ò»¸öMFC DLL¹¤³Ì

ÓÉÓÚ±»ÊµÀýµÄDLLÓÃÓÚMFC¿ò¼Ü£¬Òò´Ë´´½¨µÄÊÇMFC DLL£¬ÐèÒªµÄ»°£¬Ò²¿ÉÒÔ½¨Á¢ÆäËûÀàÐ͵ÄDLL¹¤³Ì¡£

1.Êó±ê¹³×ӻص÷º¯Êý

ÎÒÃǵÄDLLÒª¸úËæÊó±ê¹³×Ó×¢È뵽Ŀ±ê½ø³ÌÖУ¬¶øÊó±ê¹³×ÓÊÇϵͳ¹³×Ó£¬ÎÒÃÇÐèҪʵÏÖÆä¹³×ӻص÷º¯Êý¡£

/* 

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

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

*/

LRESULT CALLBACK MouseProc(

int nCode, // hook code

WPARAM wParam,// message identifier

LPARAM lParam // mouse coordinates

)

{

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

}

°²×°Êó±ê¹³×Ó

µ÷ÓÃSetWindowsHookEx() API¿ÉÒÔ°²×°Êó±ê¹³×Ó£¬ÆäÖÐSetWindowsHookEx() Ô­ÐÍÈçÏ£º

HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn, INSTANCE hMod,DWORD dwThreadId )

²ÎÊý£º

idHook±íʾ¹³×ÓÀàÐÍ£¬ËüÊǺ͹³×Óº¯ÊýÀàÐÍÒ»Ò»¶ÔÓ¦µÄ¡£±ÈÈ磬WH_KEYBOARD±íʾ°²×°µÄÊǼüÅ̹³×Ó£¬WH_MOUSE±íʾÊÇÊó±ê¹³×ӵȵȡ£

LpfnÊǹ³×Óº¯ÊýµÄµØÖ·¡£

HModÊǹ³×Óº¯ÊýËùÔÚµÄʵÀýµÄ¾ä±ú¡£¶ÔÓÚÏ̹߳³×Ó£¬¸Ã²ÎÊýΪNULL£»¶ÔÓÚϵͳ¹³×Ó£¬¸Ã²ÎÊýΪ¹³×Óº¯ÊýËùÔÚµÄDLL¾ä±ú¡£

dwThreadId Ö¸¶¨¹³×ÓËù¼àÊÓµÄÏ̵߳ÄÏ̺߳š£¶ÔÓÚÈ«¾Ö¹³×Ó£¬¸Ã²ÎÊýΪNULL¡£

·µ»ØÖµ£º

SetWindowsHookEx·µ»ØËù°²×°µÄ¹³×Ó¾ä±ú¡£

// 

// °²×°¹³×Ó

//

BOOL WINAPI StartHook(HWND hWnd)

{

g_hWnd = hWnd;

hhk = ::SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInstance,0);

if (hhk == NULL)

{

return FALSE;

}

else

{

return TRUE;

}

}

Ð¶ÔØÊó±ê¹³×Ó

// 

// Ð¶ÔØ¹³×Ó

//

BOOL WINAPI StopHook()

{

/*

Ð¶ÔØ¹³×Óʱ£¬Ò»¶¨Òª¼ÇµÃ»Ö¸´Ô­APIÈë¿Ú¡£

ÕâÀï»Ö¸´µÄÖ»ÊÇÖ÷³ÌÐòµÄÔ­APIÈë¿Ú£¬ÆäËü³ÌÐòµÄAPIÈë¿Ú»¹Ã»Óб»»Ö¸´¡£

Òò´ËÎÒÃDZØÐë´¦ÀídllÍ˳ö¹ý³Ì£¬¼´ÔÚº¯ÊýExitInstance()ÖУ¬µ÷Óûָ´

APIÈë¿ÚµÄº¯ÊýHookOff(),Ö»ÓÐÕâÑù£¬ÆäËü³ÌÐòÔٴε÷ÓÃÔ­APIʱ£¬²Å²»

»á·¢Éú´íÎó¡£

µ±ÎÒÃÇHOOKËùÓгÌÐòµÄij¸öϵͳAPIʱ£¬Ç§ÍòҪעÒâÔÚExitInstance()ÖÐ

µ÷ÓÃHookOff()£¡£¡£¡£¡£¡

*/

HookOff();

if (hhk!=NULL)

{

UnhookWindowsHookEx(hhk);

FreeLibrary(g_hInstance);

}

return TRUE;

}

µ¼³öÎÒÃǵݲװºÍÐ¶ÔØº¯Êý

.defÄÚÈÝÈçÏ£º

½«StarHookºÍStopHookº¯Êýµ¼³ö£¬Ò»±éÖ÷³ÌÐò°²×°ºÍÐ¶ÔØHOOK³ÌÐò¡£

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

LIBRARY "HookMessageBox"

EXPORTS

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

StartHook

StopHook

MFC DLLµÄInitInstance()º¯Êý

/* 

dll³ÌÐòÈë¿Ú£¬µ±³ÌÐò¼ÓÔØdllʱ£¬»áÖ´ÐÐInitInstance()

*/

BOOL CHookDllApp::InitInstance()

{

CWinApp::InitInstance();

g_hInstance = AfxGetInstanceHandle();// »ñÈ¡µ±Ç°DLLʵÀý¾ä±ú

AdjustPrivileges(); // Ìá¸ßȨÏÞ

DWORD dwPid = ::GetCurrentProcessId();

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

if (hProcess == NULL)

{

CString str;

str.Format(_T("OpenProcess fail£¬ and error code = %d"),GetLastError());

AfxMessageBox(str);

return FALSE;

}

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

return TRUE;

}

MFC DLLµÄExitInstance()º¯Êý

int CHookDllApp::ExitInstance() 

{

/*

dllÍ˳öʱ£¬Ò»¶¨Òª¼ÇµÃ»Ö¸´Ô­APIµÄÈë¿Ú£¡£¡£¡

ÎÒÃDZàдµÄdll»á±»×¢Èëµ½ËùÓÐÄ¿±ê½ø³ÌÖУ¬ÈôdllÍ˳öʱ£¬Ã»Óлָ´Ô­APIÈë¿Ú£¬

ÄÇô±»¹Ò¹³µÄ³ÌÐòÔٴε÷ÓøÃAPIʱ£¬»á·¢Éú´íÎó¡£

ÒòΪÎÒÃǵÄdll³ÌÐòÒѾ­Í˳ö£¬µ«Ô­APIµÄÈë¿ÚÈÔΪÎÒÃÇËù¶¨ÒåµÄAPIµÄÈë¿Ú£¬Õâ

ʱ±»¹Ò¹³µÄ³ÌÐòÎÞ·¨ÕÒµ½ÎÒÃÇʵÏÖµÄAPI£¬È»¶øÔ­APIµÄµØÖ·ÓÖûÓб»»Ö¸´£¬Ò²¾Í

µ÷Óò»µ½Ô­API£¬Õâʱ³ÌÐò×ÔÈ»»á·¢Éú±ÀÀ£ÁË¡£

*/

HookOff();

return CWinApp::ExitInstance();

}

HOOK APIʵÏÖ

1.×¢È뺯Êý£¬±£´æÐµģ¬Ô­À´µÄAPIµÄÈë¿Ú

¸Ãº¯ÊýµÄÖ÷Òª¹¦ÄÜÊDZ£´æÐµĺÍÔ­À´µÄAPIÈë¿Ú£¬²¢ÇÒÔÚ×îºóÆô¶¯HOOK¡£ÐèҪעÒâµÄÊÇ£¬Õâ¸öº¯ÊýÖ»Äܱ»µ÷ÓÃÒ»´Î£¬¼´Ö»ÄܽøÐÐÒ»´Î×¢Èë²Ù×÷¡£

/* 

×¢Èë

*/

void Inject()

{

if ( TRUE == bIsInJected)

{

return;

}

bIsInJected = TRUE; // ±£Ö¤Ö»µ÷ÓÃÒ»´Î

//

// »ñÈ¡º¯Êý

//

HMODULE hmodle = ::LoadLibrary(_T("User32.dll"));

oldMsgBoxA = (TypeMsgBoxA) ::GetProcAddress(hmodle,"MessageBoxA");

pfMsgBoxA = (FARPROC)oldMsgBoxA;

oldMsgBoxW = (TypeMsgBoxW) ::GetProcAddress(hmodle,"MessageBoxW");

pfMsgBoxW = (FARPROC)oldMsgBoxW;

if (pfMsgBoxA == NULL)

{

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

return;

}

if ( pfMsgBoxW == NULL)

{

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

return;

}

//

// ±£´æÔ­APIµØÖ·

//

_asm

{

lea edi,oldCodeA // È¡Êý×é»ùµØÖ·

mov esi,pfMsgBoxA // APIµØÖ·

cld // ÉèÖ÷½Ïò

mov ecx,CODE_LENGTH

rep movsb

}

_asm

{

lea edi,oldCodeW

mov esi,pfMsgBoxW

cld

mov ecx,CODE_LENGTH

rep movsb

}

//

// ½«ÐµØÖ·¸´ÖƵ½Èë¿Ú

//

newCodeA[0] = newCodeW [0] = 0xe9; // jmp Ö¸¶¨´úÂë

_asm

{

lea eax,MyMessageBoxA // ÐÂAPIµØÖ·

mov ebx,pfMsgBoxA // Ô­APIµØÖ·

sub eax,ebx

sub eax,CODE_LENGTH // Ìø×ªµØÖ· = ÐÂAPIµØÖ· - Ô­APIµØÖ· - Ö¸Á¶È

mov dword ptr [newCodeA+1],eax // eax 32bit = 4 BYTE

}

_asm

{

lea eax,MyMessageBoxW

mov ebx,pfMsgBoxW

sub eax,ebx

sub eax,CODE_LENGTH

mov dword ptr [newCodeW + 1],eax

}

HookOn(); // ¿ªÊ¼HOOK

}

1.дÄڴ溯Êý

¸Ãº¯ÊýÖ÷ÒªÍê³ÉÏò½ø³Ì¿ØÖÆ¿éддָÁîµÄÈÎÎñ¡£¹©HookOn()ºÍHookOff()µ÷Óã¬ÓÃÀ´½«Ô­APIÈë¿Ú£¬»òеÄAPIÈë¿ÚдÈëµ½½ø³ÌµÄµØÖ·¿Õ¼äÖС£

/* 

½«³¤¶ÈΪlengthµÄpcodeдÈëµ½µØÖ·lpAddressÖС£

*/

void WriteMemory(LPVOID lpAddress,BYTE* pcode,int length)

{

//

// ±£Ö¤±¾½ø³Ì¾ä±ú²»ÎªNULL

//

ASSERT(hProcess != NULL);

DWORD dwTemp,dwOldProtect,dwRet,dwWrited;

//

// ÐÞ¸ÄAPIÈë¿Úǰlength¸ö×Ö½ÚΪ jmp xxxx

//

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

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

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

{

AfxMessageBox(_T("¿Þ£¡£¡Ð´Èëʧ°Ü"));

}

VirtualProtectEx(hProcess,lpAddress,length,dwOldProtect,&dwTemp);

}

1.ÓÃÐÂAPIµØÖ·Ìæ»»Ô­APIµØÖ·

/* 

ÓÃÐÂAPIµØÖ·Ìæ»»Ô­APIµØÖ·

*/

void HookOn()

{

ASSERT(hProcess != NULL);

DWORD dwTemp,dwOldProtect,dwRet,dwWrited;

WriteMemory(pfMsgBoxA,newCodeA,CODE_LENGTH);

WriteMemory(pfMsgBoxW,newCodeW,CODE_LENGTH);

}

1.»Ö¸´Ô­APIµØÖ·

/*     

»Ö¸´Ô­APIµØÖ·

*/

void HookOff()

{

ASSERT(hProcess != NULL);

DWORD dwTemp,dwOldProtect,dwRet,dwWrited;

WriteMemory(pfMsgBoxA,oldCodeA,CODE_LENGTH);

WriteMemory(pfMsgBoxW,oldCodeW,CODE_LENGTH);

}

1.ÐÂAPI¶¨Òå

/* 

×Ô¼ºÓÃÓÚÌæ»»µÄAPI

*/

int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCation,UINT uType)

{

int nRet = 0;

HookOff();

nRet = ::MessageBoxA(hWnd,"¹þ¹þ ^_^£¬MessageBoxA ±» HOOK ¿©",lpCation,uType);

nRet = ::MessageBoxA(hWnd,lpText,lpCation,uType);

HookOn();

return nRet;

}

int WINAPI MyMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCation,UINT uType)

{

int nRet = 0;

HookOff();

nRet = ::MessageBoxW(hWnd,_T("O(¡É_¡É)O¹þ¹þ~£¬MMessageBoxW ±» HOOK ¿©"),lpCation,uType);

nRet = ::MessageBoxW(hWnd,lpText,lpCation,uType);

HookOn();

return nRet;

}

1.ÌáÉýȨÏÞº¯Êý

Õâ¶Î´úÂë²¢²»ÊDZØÐëµÄ£¬µ«ÓÐЩʱºò»á³öÏÖ³ÌÐòȨÏÞ²»×ãÒÔ»ñÈ¡½ø³Ì¾ä±úµÄÇé¿ö£¬Õâ¸öʱºòÐèÒªÔÚ´úÂëÖ´ÐÐǰµ÷Óøú¯ÊýÀ´Ìá¸ß³ÌÐòµÄȨÏÞ¡£

/* 

ÌáÉýȨÏÞ

*/

bool AdjustPrivileges() {

HANDLE hToken;

TOKEN_PRIVILEGES tp;

TOKEN_PRIVILEGES oldtp;

DWORD dwSize=sizeof(TOKEN_PRIVILEGES);

LUID luid;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {

if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;

else return false;

}

if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {

CloseHandle(hToken);

return false;

}

ZeroMemory(&tp, sizeof(tp));

tp.PrivilegeCount=1;

tp.Privileges[0].Luid=luid;

tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

/* Adjust Token Privileges */

if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {

CloseHandle(hToken);

return false;

}

// close handles

CloseHandle(hToken);

return true;

}

0x02 HOOK ´°ÌåʵÏÖ

1.StartHook

HINSTANCE g_hinstDll = NULL; 

//

// ¿ªÊ¼ HOOK

//

void CHookWindowDlg::OnBnClickedButtonStart()

{

// TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë

g_hinstDll = LoadLibrary(_T("HookDll.dll"));

if ( NULL == g_hinstDll)

{

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

}

typedef BOOL (CALLBACK *HookStart)(HWND hwnd);

HookStart hookStart = NULL;

hookStart = (HookStart)::GetProcAddress(g_hinstDll,"StartHook");

if ( NULL == hookStart)

{

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

return;

}

bool ret = hookStart(m_hWnd);

if (ret)

{

m_list.InsertItem(m_list.GetItemCount(),_T("Æô¶¯¹³×ӳɹ¦"));

m_list.EnsureVisible(m_list.GetItemCount()-1,FALSE);

}

else

{

m_list.InsertItem(m_list.GetItemCount(),_T("Æô¶¯¹³×Óʧ°Ü"));

m_list.EnsureVisible(m_list.GetItemCount()-1,FALSE);

}

}

1.StopHook

// 

// ÖÕÖ¹ HOOK

//

void CHookWindowDlg::OnBnClickedButtonStop()

{

// TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë

typedef BOOL (CALLBACK* HookStop)();

HookStop hookStop = NULL;

if (NULL == g_hinstDll) // Ò»¶¨Òª¼ÓÕâ¸öÅжϣ¬Èô²»Îª¿ÕµÄ»°¾Í²»ÐèÒªÔÚÖØÐ¼ÓÔØ£¬·ñÔò»áÊDz»Í¬µÄʵÀý

{

g_hinstDll = LoadLibrary(_T("HookDll.dll"));

if (g_hinstDll == NULL)

{

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

return;

}

}

hookStop = ::GetProcAddress(g_hinstDll,"StopHook");

if (hookStop == NULL)

{

AfxMessageBox(_T("»ñÈ¡ StopHook ʧ°Ü"));

FreeLibrary(g_hinstDll);

g_hinstDll=NULL;

return;

}

hookStop();

if (g_hinstDll!= NULL)

{

::FreeLibrary(g_hinstDll);

}

m_list.InsertItem(m_list.GetItemCount(),_T("ÖÕÖ¹HOOK³É¹¦"));

}

1.MessageBoxA

// MessageBoxA 

void CHookWindowDlg::OnBnClickedButtonMsga()

{

// TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë

MessageBoxA(m_hWnd,"ÕâÊÇÕý³£µÄMessageBoxA...","¹þ¹þ",0);

}

1.MessageBoxW

// MessageBoxW 

void CHookWindowDlg::OnBnClickedButtonMsgw()

{

// TODO: ÔÚ´ËÌí¼Ó¿Ø¼þ֪ͨ´¦Àí³ÌÐò´úÂë

MessageBoxW(_T("ÕâÊÇÕý³£µÄMessageBoxW..."),_T("ºÇºÇ"),0);

}

0x03 ²âÊÔ

±¾ÊµÀýÔÚ×Ô¼ºÊµÏÖµÄAPIÖдòÓ¡Ò»¾ä×Ô¼ºµÄ»°£¬È»ºóÔÙµ¯³öÔ­±¾µÄ¶Ô»°¿ò¡£²âÊÔ½á¹ûÈçÏ£º

1.Æô¶¯¹³×Ó

1.µ¥»÷"MessageBoxA"°´Å¥£¬µ÷ÓÃMessageBoxAº¯Êý

¿ÉÒÔ¿´µ½£¬Ïȵ¯³öÁËÎÒÃÇ×Ô¼ºµÄ¶Ô»°¿ò£¬È»ºó²Åµ¯³öÕæÕýµÄ¶Ô»°¿ò¡£

1.µ¥»÷"MessageBoxW"°´Å¥£¬µ÷ÓÃMessageBoxWº¯Êý¡£

¿ÉÒÔ¿´µ½£¬Ïȵ¯³öÎÒÃǵĶԻ°¿ò£¬È»ºó²Åµ¯³öÕæÕýµÄ¶Ô»°¿ò¡£

1.¼Çʱ¾µÄ¶Ô»°¿òÒ²±»HOOKÁË¡£

´ò¿ª¼¼Êõ±¾£¬´ò¿ª²éÕÒ¶Ô»°¿ò£¬È»ºóÊäÈëÒ»¸ö×Ö·û´®£¬"²éÕÒÒ»ÏÂ"£¬Õâ¸öʱºòͬÑùÏȵ¯³öÎÒÃǵĶԻ°¿ò£¬È»ºó²Åµ¯³öÔ­À´µÄ£¬ÕÒ²»µ½¶Ô»°¿ò¡£

0x04 ¸½Â¼¡ª¡ªHOOK DLL¹Ø¼üÔ´Âë

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

//

#include "stdafx.h"

#include "HookDll.h"

#include <Windows.h>

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

/*

È«¾Ö¹²Ïí±äÁ¿

*/

#pragma data_seg("Share")

HWND g_hWnd = NULL ; // Ö÷´°¿Ú¾ä±ú

HINSTANCE g_hInstance = NULL; // ±¾dllʵÀý¾ä±ú

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

#pragma data_seg()

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

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

BOOL bIsInJected = FALSE; // ÊÇ·ñÒÑ×¢Èë±ê¼Ç

TCHAR* msgToMain = new TCHAR[200]; // ·¢¸øÖ÷µ÷³ÌÐòµÄÐÅÏ¢

/*

Ô­º¯Êý¶¨Òå

*/

typedef int (WINAPI *TypeMsgBoxA)(HWND hWnd,LPCSTR lpText, LPCSTR lpCaption,UINT uType);

typedef int (WINAPI *TypeMsgBoxW)(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);

TypeMsgBoxA oldMsgBoxA = NULL; // ÓÃÓÚ±£´æÔ­º¯ÊýµØÖ·

TypeMsgBoxW oldMsgBoxW = NULL; // ÓÃÓÚ±£´æÔ­¿¬Ê鵨ַ

FARPROC pfMsgBoxA = NULL; // Ö¸ÏòÔ­º¯ÊýµØÖ·µÄÔ¶Ö¸Õë

FARPROC pfMsgBoxW = NULL; // Ö¸ÏòÔ­º¯ÊýµØÖ·µÄÔ¶Ö¸Õë

#define CODE_LENGTH 5

BYTE oldCodeA[CODE_LENGTH]; // ±£´æÔ­À´APIÈë¿Ú´úÂë

BYTE oldCodeW[CODE_LENGTH]; // ±£´æÔ­À´APIÈë¿Ú´úÂë

BYTE newCodeA[CODE_LENGTH]; // ±£´æÐÂAPIÈë¿Ú´úÂ룬jmp xxxx

BYTE newCodeW[CODE_LENGTH]; // ±£´æÐÂAPIÈë¿Ú´úÂ룬jmp xxxx

/*

×Ô¼º±àдµÄAPI

*/

int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCation,UINT uType);

int WINAPI MyMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCation,UINT uType);

/*

ÆäËüº¯ÊýÔ­ÐÍÉùÃ÷

*/

void HookOn(); // ¿ªÊ¼HOOK

void HookOff(); // ¹Ø±ÕHOOK

void Inject(); // ×¢Èë

BOOL WINAPI StartHook(HWND hWnd); // ¼ÓÔØ¹³×Ó

BOOL WINAPI StopHook(); // Ð¶ÔØ¹³×Ó

bool AdjustPrivileges(); // ÌáÉýȨÏÞ

//

//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¡£

//

// CHookDllApp

BEGIN_MESSAGE_MAP(CHookDllApp, CWinApp)

END_MESSAGE_MAP()

// CHookDllApp ¹¹Ôì

CHookDllApp::CHookDllApp()

{

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

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

}

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

CHookDllApp theApp;

// CHookDllApp ³õʼ»¯

/*

dll³ÌÐòÈë¿Ú£¬µ±³ÌÐò¼ÓÔØdllʱ£¬»áÖ´ÐÐInitInstance()

*/

BOOL CHookDllApp::InitInstance()

{

CWinApp::InitInstance();

g_hInstance = AfxGetInstanceHandle();// »ñÈ¡µ±Ç°DLLʵÀý¾ä±ú

AdjustPrivileges(); // Ìá¸ßȨÏÞ

DWORD dwPid = ::GetCurrentProcessId();

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

if (hProcess == NULL)

{

CString str;

str.Format(_T("OpenProcess fail£¬ and error code = %d"),GetLastError());

AfxMessageBox(str);

return FALSE;

}

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

return TRUE;

}

int CHookDllApp::ExitInstance()

{

/*

dllÍ˳öʱ£¬Ò»¶¨Òª¼ÇµÃ»Ö¸´Ô­APIµÄÈë¿Ú£¡£¡£¡

ÎÒÃDZàдµÄdll»á±»×¢Èëµ½ËùÓÐÄ¿±ê½ø³ÌÖУ¬ÈôdllÍ˳öʱ£¬Ã»Óлָ´Ô­APIÈë¿Ú£¬

ÄÇô±»¹Ò¹³µÄ³ÌÐòÔٴε÷ÓøÃAPIʱ£¬»á·¢Éú´íÎó¡£

ÒòΪÎÒÃǵÄdll³ÌÐòÒѾ­Í˳ö£¬µ«Ô­APIµÄÈë¿ÚÈÔΪÎÒÃÇËù¶¨ÒåµÄAPIµÄÈë¿Ú£¬Õâ

ʱ±»¹Ò¹³µÄ³ÌÐòÎÞ·¨ÕÒµ½ÎÒÃÇʵÏÖµÄAPI£¬È»¶øÔ­APIµÄµØÖ·ÓÖûÓб»»Ö¸´£¬Ò²¾Í

µ÷Óò»µ½Ô­API£¬Õâʱ³ÌÐò×ÔÈ»»á·¢Éú±ÀÀ£ÁË¡£

*/

HookOff();

return CWinApp::ExitInstance();

}

/*

ÌáÉýȨÏÞ

*/

bool AdjustPrivileges() {

HANDLE hToken;

TOKEN_PRIVILEGES tp;

TOKEN_PRIVILEGES oldtp;

DWORD dwSize=sizeof(TOKEN_PRIVILEGES);

LUID luid;

if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {

if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;

else return false;

}

if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) {

CloseHandle(hToken);

return false;

}

ZeroMemory(&tp, sizeof(tp));

tp.PrivilegeCount=1;

tp.Privileges[0].Luid=luid;

tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;

/* Adjust Token Privileges */

if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) {

CloseHandle(hToken);

return false;

}

// close handles

CloseHandle(hToken);

return true;

}

/*

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

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

*/

LRESULT CALLBACK MouseProc(

int nCode, // hook code

WPARAM wParam,// message identifier

LPARAM lParam // mouse coordinates

)

{

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

}

/*

½«³¤¶ÈΪlengthµÄpcodeдÈëµ½µØÖ·lpAddressÖС£

*/

void WriteMemory(LPVOID lpAddress,BYTE* pcode,int length)

{

//

// ±£Ö¤±¾½ø³Ì¾ä±ú²»ÎªNULL

//

ASSERT(hProcess != NULL);

DWORD dwTemp,dwOldProtect,dwRet,dwWrited;

//

// ÐÞ¸ÄAPIÈë¿Úǰlength¸ö×Ö½ÚΪ jmp xxxx

//

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

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

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

{

AfxMessageBox(_T("¿Þ£¡£¡Ð´Èëʧ°Ü"));

}

VirtualProtectEx(hProcess,lpAddress,length,dwOldProtect,&dwTemp);

}

/*

ÓÃÐÂAPIµØÖ·Ìæ»»Ô­APIµØÖ·

*/

void HookOn()

{

ASSERT(hProcess != NULL);

DWORD dwTemp,dwOldProtect,dwRet,dwWrited;

WriteMemory(pfMsgBoxA,newCodeA,CODE_LENGTH);

WriteMemory(pfMsgBoxW,newCodeW,CODE_LENGTH);

}

/*

»Ö¸´Ô­APIµØÖ·

*/

void HookOff()

{

ASSERT(hProcess != NULL);

DWORD dwTemp,dwOldProtect,dwRet,dwWrited;

WriteMemory(pfMsgBoxA,oldCodeA,CODE_LENGTH);

WriteMemory(pfMsgBoxW,oldCodeW,CODE_LENGTH);

}

/*

×¢Èë

*/

void Inject()

{

if ( TRUE == bIsInJected)

{

return;

}

bIsInJected = TRUE; // ±£Ö¤Ö»µ÷ÓÃÒ»´Î

//

// »ñÈ¡º¯Êý

//

HMODULE hmodle = ::LoadLibrary(_T("User32.dll"));

oldMsgBoxA = (TypeMsgBoxA) ::GetProcAddress(hmodle,"MessageBoxA");

pfMsgBoxA = (FARPROC)oldMsgBoxA;

oldMsgBoxW = (TypeMsgBoxW) ::GetProcAddress(hmodle,"MessageBoxW");

pfMsgBoxW = (FARPROC)oldMsgBoxW;

if (pfMsgBoxA == NULL)

{

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

return;

}

if ( pfMsgBoxW == NULL)

{

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

return;

}

//

// ±£´æÔ­APIµØÖ·

//

_asm

{

lea edi,oldCodeA // È¡Êý×é»ùµØÖ·

mov esi,pfMsgBoxA // APIµØÖ·

cld // ÉèÖ÷½Ïò

mov ecx,CODE_LENGTH

rep movsb

}

_asm

{

lea edi,oldCodeW

mov esi,pfMsgBoxW

cld

mov ecx,CODE_LENGTH

rep movsb

}

//

// ½«ÐµØÖ·¸´ÖƵ½Èë¿Ú

//

newCodeA[0] = newCodeW [0] = 0xe9; // jmp Ö¸¶¨´úÂë

_asm

{

lea eax,MyMessageBoxA // ÐÂAPIµØÖ·

mov ebx,pfMsgBoxA // Ô­APIµØÖ·

sub eax,ebx

sub eax,CODE_LENGTH // Ìø×ªµØÖ· = ÐÂAPIµØÖ· - Ô­APIµØÖ· - Ö¸Á¶È

mov dword ptr [newCodeA+1],eax // eax 32bit = 4 BYTE

}

_asm

{

lea eax,MyMessageBoxW

mov ebx,pfMsgBoxW

sub eax,ebx

sub eax,CODE_LENGTH

mov dword ptr [newCodeW + 1],eax

}

HookOn(); // ¿ªÊ¼HOOK

}

//

// °²×°¹³×Ó

//

BOOL WINAPI StartHook(HWND hWnd)

{

g_hWnd = hWnd;

hhk = ::SetWindowsHookEx(WH_MOUSE,MouseProc,g_hInstance,0);

if (hhk == NULL)

{

return FALSE;

}

else

{

return TRUE;

}

}

//

// Ð¶ÔØ¹³×Ó

//

BOOL WINAPI StopHook()

{

/*

Ð¶ÔØ¹³×Óʱ£¬Ò»¶¨Òª¼ÇµÃ»Ö¸´Ô­APIÈë¿Ú¡£

ÕâÀï»Ö¸´µÄÖ»ÊÇÖ÷³ÌÐòµÄÔ­APIÈë¿Ú£¬ÆäËü³ÌÐòµÄAPIÈë¿Ú»¹Ã»Óб»»Ö¸´¡£

Òò´ËÎÒÃDZØÐë´¦ÀídllÍ˳ö¹ý³Ì£¬¼´ÔÚº¯ÊýExitInstance()ÖУ¬µ÷Óûָ´

APIÈë¿ÚµÄº¯ÊýHookOff(),Ö»ÓÐÕâÑù£¬ÆäËü³ÌÐòÔٴε÷ÓÃÔ­APIʱ£¬²Å²»

»á·¢Éú´íÎó¡£

µ±ÎÒÃÇHOOKËùÓгÌÐòµÄij¸öϵͳAPIʱ£¬Ç§ÍòҪעÒâÔÚExitInstance()ÖÐ

µ÷ÓÃHookOff()£¡£¡£¡£¡£¡

*/

HookOff();

if (hhk!=NULL)

{

UnhookWindowsHookEx(hhk);

FreeLibrary(g_hInstance);

}

return TRUE;

}

/*

×Ô¼ºÓÃÓÚÌæ»»µÄAPI

*/

int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCation,UINT uType)

{

int nRet = 0;

HookOff();

nRet = ::MessageBoxA(hWnd,"¹þ¹þ ^_^£¬MessageBoxA ±» HOOK ¿©",lpCation,uType);

nRet = ::MessageBoxA(hWnd,lpText,lpCation,uType);

HookOn();

return nRet;

}

int WINAPI MyMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCation,UINT uType)

{

int nRet = 0;

HookOff();

nRet = ::MessageBoxW(hWnd,_T("O(¡É_¡É)O¹þ¹þ~£¬MMessageBoxW ±» HOOK ¿©"),lpCation,uType);

nRet = ::MessageBoxW(hWnd,lpText,lpCation,uType);

HookOn();

return nRet;

}

   
2648 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

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

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

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]

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

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

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