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

1Ôª 10Ôª 50Ôª





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



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

0x00 ǰÑÔ

ÒÔϽ«¸ø³öÒ»¸ö¼òµ¥µÄÀý×Ó£¬×÷ΪHOOK APIµÄÈëÃÅ¡£ÕâÀïÊÇHOOK ×Ô¼º³ÌÐòµÄMessageBox£¬¼´½«×Ô¼º³ÌÐò¶ÔMessageBox APIµÄµ÷ÓÃÖØ¶¨Ïòµ½×Ô¼ºÊµÏÖµÄAPIÖУ¬ÔÚ×Ô¼º¶¨ÒåµÄAPIÖÐʵÏÖÄÚÈݵÄÌæ»»¡£

ÐèҪעÒâµÄÊÇ£¬±¾Àý×ÓµÄHOOK½ö½ö¶Ô×Ô¼ºÊµÏÖµÄMFC´°¿Ú³ÌÐò£¬µ±¿ªÊ¼HOOK ºó£¬×Ô¼ºµÄ³ÌÐòµ÷ÓÃMessageBox½«±»Öض¨Ïò£¬µ«ÆäËû³ÌÐòµÎ°¡ÓÃMessageBoxʱÊÇÕý³£µÄ¡£

ÔÚWindowsÖУ¬Ã¿¸ö½ø³Ì¶¼ÓÐ×Ô¼ºµÄ½ø³Ì¿ØÖƿ飬ÓÐ×Ô¼ºµÄ°²È«ÔËÐпռ䣬¸÷º¯ÊýÔÚ³õʼ»¯Ê±±»¼ÓÔØµ½½ø³ÌµÄµØÖ·¿Õ¼äÖУ¬¸÷½ø³ÌµÄµØÖ·¿Õ¼äÊDz»ÏཻµÄ¡£±¾ÊµÀýÖУ¬HOOK API½ö½öÔÚ×Ô¼º³ÌÐòµÄµØÖ·¿Õ¼äÖÐʵÏÖÁ˵ØÖ·µÄÌæ»»£¬Òò´Ë²»Ó°ÏìÆäËû½ø³ÌµÄ¹¤×÷£¬ÈôÏëHOOKÆäËû³ÌÐò£¬ÄÇô¾ÍÒªÏë°ì·¨½«×Ô¼ºÊµÏÖµÄAPI×¢È뵽Ŀ±ê½ø³ÌµÄµØÖ·¿Õ¼äÖУ¬²¢Ìæ»»Ô­APIµÄµØÖ·£¬²ÅÄÜʵÏÖÎÒÃÇÏëÒªµÄ¹¦ÄÜ£¬Õ⽫ÔÚºóÐøµÄѧϰÖнøÒ»²½½éÉÜ¡£

±¾ÊÂÀý½ö¶Ô×Ô¼ºµÄ³ÌÐò½øÐÐHOOK£¬ÊµÓÃÐÔ²»ÊǺܴ󣬵«ÊǶÔÓÚÈëÃÅ£¬Àí½âHOOK APIµÄ¹ý³Ì»¹ÊǺÜÓаïÖúµÄ¡£

0x01 ʵÏÖ˼Ïë

ÔÚ×Ô¼ºÊµÏֵĴ°Ìå³ÌÐò£¨Windows-A£©ÖÐʵÏÖÒ»¸öÓëMessageBox API¶¨ÒåһģһÑùµÄAPI£¨MessBox-New£©£¬Õâ¸öAPI³ýÁËÍê³ÉÔ­API£¨MessBox-Old£©µÄ¹¤×÷Ö®Í⣬»¹½«ÏÔʾÄÚÈݽøÐÐÐ޸ġ£Windows A ¼ÓÔØÊ±£¬¶Ô½«×Ô¼ºËùʹÓõÄAPIµØÖ·¶¼¼ÓÔØµ½×Ô¼ºµÄµØÖ·¿Õ¼äÖУ¬ÕâÀï°üÀ¨ÎÒÃÇ×Ô¼ºÐ´µÄMessBox-New£¬Òò´ËÎÒÃÇ¿ÉÒԺܷ½±ãµÄʹÓÃMessBox-NewµÄµ÷ÓõØÖ·À´Ìæ»»MessBox-OldµÄÈë¿ÚµØÖ·£¬½ø¶øÊµÏÖ¶ÔMessBox-OldµÄÖØ¶¨Ïò¡¢¼´Ìæ»»¡£µØÖ·±»Ìæ»»Ö®ºó£¬Ö»Òª±¾³ÌÐòµ÷ÓÃMessageBoxÕâ¸öAPI£¬¾Í»á±»Öض¨Ïòµ½ÎÒÃÇʵÏÖµÄMessBox-NewÖС£´Ë¹ý³ÌÖУ¬ÈôÏëÒª»Ö¸´Õý³££¬Ö»ÐèÒª½«MessBox-OldµÄÈë¿ÚµØÖ·»Ö¸´¼´¿É¡£

0x02 HOOK APIʵÏÖ¹ý³Ì

±¾Ð¡½Ú½«½éÉܳÌÐòµÄʵÏÖ¹ý³Ì¡£

1.¶¨Òå×Ô¼ºµÄAPI

¶¨Òå×Ô¼ºµÄAPI£¬ÒòΪÎÒÃÇÕâÀïÒªHOOK ×Ô¼º³ÌÐòµÄMessageBox£¬Òò´Ë¾ÍÒª¶¨ÒåÒ»¸öÔ­ÐÍÓëMessageBox APIһģһÑùµÄAPI¡£²éMSDN£¬¿ÉµÃMessageBoxÓÐÁ½ÖÖµ÷ÓÃÐÎʽ£¬·Ö±ðÊÇMessageBoxAºÍMessageBoxW£¬Ç°Õß´¦ÀíÕ­×Ö·û´®£¬¼´Ã¿¸ö×Ö·ûÕ¼Ò»¸ö×Ö½Ú£»ºóÕß´¦Àí¿í×Ö·û´®£¬¼´Ò»¸ö×Ö·ûÕ¼Á½¸ö×Ö½Ú¡£ÎÒÃÇÕâÀïHOOK MessageBoxW£¬ÆäÔ­ÐÍΪ£º

 int WINAPI MessageBoxW(

_In_opt_ HWND hWnd,

_In_opt_ LPCWSTR lpText,

_In_opt_ LPCWSTR lpCaption,

_In_ UINT uType

);

ÓÉ´Ë£¬¿ÉÒÔ¶¨ÒåÎÒÃÇ×Ô¼ºµÄAPIÈçÏ£º

ÕâÀïºÜÈÝÒשµôº¯ÊýÇ°ÃæµÄ WINAPI£¬ÈôÊÇÉÙÁ˽«ÎÞ·¨Õý³£ÊµÏÖHOOK£¬Ò»¶¨Òª×¢ÒâÎÒÃÇʵÏֵĺ¯ÊýµÄÔ­ÐÍÒªÓëÔ­APIÒ»Ö¡£

// 

// ×Ô¼º¶¨ÒåµÄ£¬ÓÃÓÚÌæ»»ÏàÓ¦APIµÄ£¬¼ÙµÄAPI

//

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

{

TRACE(lpText);

/*

µ÷ÓÃÔ­º¯Êý֮ǰ£¬ÏÈÍ£Ö¹HOOK£¬Ò²¾ÍÊǻָ´Ô­ÏµÍ³APIº¯ÊýµÄÈë¿Ú£¬·ñÔòÎÞ·¨µ÷Óõ½Ô­APIº¯Êý£¬

¶øÊǼÌÐøµ÷ÓÃ×Ô¼ºµÄAPI£¬»áÔì³ÉËÀÑ­»·£¬½ø¶øÔì³É¶ÑÕ»Òç³ö£¬±ÀÀ£¡£

*/

HookOff();

/*

µ÷ÓÃÔ­À´µÄMessageBoxW´òÓ¡ÎÒÃǵÄÐÅÏ¢¡£

*/

int ret = MessageBoxW(hwnd,_T("¹þ¹þ£¬±»HOOK¿©£¡£¡"),lpCation,uType);

/*

µ÷ÓÃÍêԭϵͳAPIºó£¬¼ÇµÃ»Ö¸´HOOK£¬Ò²¾ÍÊÇÆô¶¯HOOK£¬½«Ô­APIº¯ÊýÈë¿Ú»»³ÉÎÒÃÇ×Ô¼º¶¨ÒåµÄº¯ÊýÈë¿Ú£¬

·ñÔòÏÂÒ»´Îµ÷ÓÃMessageBoxWµÄʱºò¾ÍÎÞ·¨×ªµ½ÎÒÃÇ×Ô¼º¶¨ÒåµÄAPIº¯ÊýÖУ¬Ò²¾ÍÎÞ·¨ÊµÏÖHOOK¡£

*/

HookOff();

return ret;

}

2. ¶¨ÒåAPIÀàÐÍ

¶¨ÒåÔ­APIµÄÀàÐÍ£¬ÏÂÃæµÄTypeMessageBoxWÆäËüÆÕͨµÄÊý¾ÝÀàÐ͵ÄʹÓ÷½·¨ÊÇÒ»ÑùµÄ¡£¶¨ÒåÒ»¸öTypeMessageBoxWÀàÐ͵ıäÁ¿£¬ÓÃÓÚ´æ´¢Ô­APIµÄÖ¸Õ룬»¹¶¨ÒåÒ»¸öÔ¶Ö¸ÕëÀàÐÍ£¬pfOldMsgBoxW£¬ÒòΪϵͳAPIÊÇÔÚ¶¯Ì¬Á´½Ó¿â£¨DLL£©ÖÐʵÏֵģ¬Òò´Ë³ÌÐòʵ¼ÊÉÏÊÇͨ¹ýÔ¶µØÖ·Ö¸ÕëÀ´DLLÖÐÏàÓ¦µÄAPIµ÷Ó᣶ø±¾ÊµÀýÖÐÉè¼ÆµÄMessageBoxÊÇÔÚ User32.dll Öеġ£¹ØÓÚÔ¶µØÖ·Ö¸ÕëÕâÀï²»×ö¶à½éÉÜ£¬ÐèÒªÁ˽âµÄ¿ÉÒÔ²éÔÄÏà¹Ø×ÊÁÏ¡£

typedef int (WINAPI *TypeMessageBoxW)(HWND hwnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType); 

TypeMessageBoxW OdlMsgBoxW = NULL; // Ö¸Ïòº¯ÊýÔ­ÐÍÖ¸Õë

FARPROC pfOldMsgBoxW; // Ö¸Ïòº¯ÊýÔ¶Ö¸Õë

3.»ñȡԭAPIº¯ÊýÈë¿Ú

ÓÉMSDN¿ÉÖª£¬Ô­APIÔÚUser32.dllÖÐʵÏÖ£¬Òò´ËÔÚ´Ë֮ǰҪ¼ÓÔØUser32.dll£¬²¢»ñÈ¡µ½Ô­APIµÄº¯ÊýÈë¿Ú¡£ÊµÏÖ´úÂëÈçÏ£º

HMODULE hmod = LoadLibrary(_T("User32.dll")); 

if ( NULL == hmod)

{

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

return;

}

OdlMsgBoxW = (TypeMessageBoxW)::GetProcAddress(hmod,"MessageBoxW");

pfOldMsgBoxW = (FARPROC)OdlMsgBoxW;

if ( pfOldMsgBoxW == NULL)

{

AfxMessageBox(_T("»ñȡԭAPIÈë¿ÚµØÖ·³ö´í"));

return;

}

4.±£´æÔ­APIÈë¿ÚµÄǰ5¸ö×Ö½Ú

ΪÁË×îºó»Ö¸´Ô­APIµÄµØÖ·£¬±ØÐëÒªÔÚHOOK֮ǰ½«Ô­APIµÄÈë¿ÚµØÖ·±£´æÆðÀ´¡£¶øÕâÀïΪʲôÊÇ5¸ö×Ö½ÚÄØ£¿ÒòΪÎÒÃÇʹÓÃjmp xxxx Ö¸ÁîʵÏÖÔ­APIµÄÖØ¶¨Ïò£¬¸ÃÖ¸ÁîµÄ³¤¶ÈΪ5¸ö×Ö½Ú£¬jmpÕ¼Ò»¸ö×Ö½Ú£¬¶øxxxx±íʾÐÂAPIµÄÈë¿ÚµØÖ·£¬Õ¼4¸ö×Ö½Ú£¬ÎÒÃÇʹÓÃjmp xxxxÕâÌõÖ¸ÁîÀ´Ìæ»»µôÔ­APIÈë¿ÚµÄ5¸ö×Ö½Ú£¬ÕâÑùÒ»À´µ±±¾³ÌÐòµ÷ÓÃMessageBoxWʱ£¬¾Í»áÌø×ªµ½ÎÒÃÇʵÏÖµÄAPI¡£×ÛÉÏËùÊö£¬ÎÒÃÇÕâÀïÐèÒª±£´æÔ­APIµÄǰ5¸ö×Ö½Ú£¬ÊµÏÖ´úÂëÈçÏ£º

// 

// ½«Ô­APIµÄÈë¿Ú5¸ö×Ö½Ú´úÂë±£´æµ½OdeCode[]ÖÐ

//

_asm

{

lea edi,OldCode // È¡Êý×éOldCode[]µØÖ·£¬´æ·Åµ½ediÖÐ

mov esi,pfOldMsgBoxW // »ñȡԭAPIÈë¿ÚµØÖ·£¬´æÈëesiÖÐ

cld // ÉèÖ÷½Ïò

movsd // ÒÆ¶¯dword £¬4 Byte

movsb // ÒÆ¶¯ 1 Byte

}

5.ÉèÖÃеģ¨×Ô¼ºµÄ£©APIÈë¿ÚµÄǰ5¸ö×Ö½Ú

±£´æºÃÔ­APIµÄÈë¿ÚÖ®ºó£¬ÎÒÃÇÕâÀïÐèÒªÉèÖÃjmp xxxxÖ¸ÁxxxxΪÐÂAPIµÄÈë¿ÚµØÖ·£¬ÒÔ±ãÖ®ºóʵÏÖµØÖ·µÄÌæ»»¡£

¶øxxxxÈçºÎ¼ÆËãÄØ£¬¿É×ñѭǰÈË×ܽáµÄÒ»Ìõ¼ÆË㹫ʽ£º

int xxxx = MyFunAddr ¨C SystemFunAddr - CodeLength;

jmp xxxx;

MyFunAddr : ÎÒÃDZàдµÄеÄAPIµÄµØÖ·£»

SystemFunAddr : Ô­APIµÄµØÖ·£»

CodeLength : Èë¿ÚÖ¸Á¶È£¬±¾ÊµÀýÊÇ jmp xxxx µÄ³¤¶È£¬Îª5¸ö×Ö½Ú¡£

// 

// еÄAPIÈë¿Ú±£´æµ½NewCode[]ÖУ¬¼´jmp xxxx£¬xxxxΪÐÂAPIµØÖ·£¬¸ÃÖ¸Áî×ܳ¤¶ÈΪ5¸ö×Ö½Ú

//

NewCode[0] = 0xe9; // 0xe9Ï൱ÓÚjmpÖ¸Áî

_asm

{

lea eax,MyMessageBoxW

mov ebx,pfOldMsgBoxW

sub eax,ebx

sub eax,CODE_LENGTH

mov dword ptr[NewCode+1],eax

}

6.ÐÞ¸ÄÔ­£¨ÕæÊµ£©APIÈë¿ÚµÄǰ5¸ö×Ö½ÚΪеģ¨×Ô¼ºµÄ£©APIÈë¿ÚµØÖ·

ÔÚ±£´æÁËÔ­APIºÍÐÂAPIµÄÈë¿ÚµØÖ·Ö®ºó£¬½ÓÏÂÀ´¾ÍÊÇҪʵÏÖµØÖ·µÄÌæ»»£¬¼´Ê¹ÓÃÐÂAPIÈë¿ÚÌæ»»Ô­APIÈë¿Ú£¬´Ó¶øÊµÏÖHOOK MessageBoxW¡£ÕâÀïÉæ¼°µ½Á½¸öÖØÒªµÄAPI£¬VirtualProtectEx ºÍ WriteProcessMemory£¬¹ØÓÚAPIµÄÏêϸ˵Ã÷¿ÉÒÔ²éѯMSDN¡£

/* 

Æô¶¯HOOK£¬½«Ô­APIµÄÈë¿ÚµØÖ·»»³ÉÎÒÃÇ×Ô¼º¶¨Ò庯ÊýµÄÈë¿ÚµØÖ·

*/

VOID HookOn()

{

//

// È·±£±¾³ÌÐò½ø³Ì¾ä±úhProcess²»ÎªNULL

//

ASSERT(hProcess!=NULL);

DWORD dwTemp;

DWORD dwOldProtect;

SIZE_T writedByte;

//

// ÐÞ¸ÄAPIÈë¿ÚµÄǰ5¸ö×Ö½Ú£¬jmp xxxx

//

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,PAGE_READWRITE,&dwOldProtect);

WriteProcessMemory(hProcess,pfOldMsgBoxW,NewCode,CODE_LENGTH,&writedByte);

if (writedByte == 0)

{

AfxMessageBox(_T("Ìæ»»Ô­APIµØÖ·Ê§°Ü"));

}

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,dwOldProtect,&dwTemp);

}

7.»Ö¸´Ô­APIÈë¿ÚµØÖ·

ÔÚHOOKºó£¬¶ÔMessageBoxµÄµ÷ÓÃ»á±»ÖØ¶¨Ïòµ½ÎÒÃÇʵÏÖµÄAPIÖУ¬ÈôÐèÒªµ÷ÓÃÔ­API£¬Ôò±ØÐë»Ø¸´Ô­APIµÄÈë¿ÚµØÖ·£¬·ñÔò»á³öÏÖËÀÑ­»·¡£ÊµÏÖ´úÂëÈçÏ£º

/* 

Í£Ö¹HOOK£¬½«Èë¿Ú»»³ÉÔ­À´µÄAPIÈë¿ÚµØÖ·

*/

VOID HookOff()

{

ASSERT(hProcess != NULL);

DWORD dwTemp;

DWORD dwOldProtect;

SIZE_T wirtedByte;

//

// »Ø¸´Ô­APIµØÖ·

//

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,PAGE_READWRITE,&dwOldProtect);

WriteProcessMemory(hProcess,pfOldMsgBoxW,OldCode,CODE_LENGTH,&wirtedByte);

if (wirtedByte == 0)

{

AfxMessageBox(_T("»Ø¸´Ô­APIµØÖ·Ê§°Ü"));

}

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,dwOldProtect,&dwTemp);

}

0x03 ´°¿Ú°´Å¥ÊµÏÖ

1.Æô¶¯HookMessageBoxW

// 

// Æô¶¯ HookMessageBoxW

//

void CHookMessageboxWindowDlg::OnBnClickedButtonStart()

{

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

AdjustPrivileges(); // ÌáÉýȨÏÞ£¬ÒòΪµ÷Óà OpenProcess() ÐèÒªºÏÊʵÄȨÏÞ

DWORD dwPid = ::GetCurrentProcessId();

hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);

if (hProcess == NULL)

{

CString logInfo;

logInfo.Format(_T("»ñÈ¡½ø³Ì¾ä±úʧ°Ü£¡£¡,½ø³Ì id = 0x%x ,´íÎó´úÂë = 0x%x"),dwPid,GetLastError());

AfxMessageBox(logInfo);

return;

}

GetApiEntrancy(); // »ñȡоÉAPIÈë¿Ú£¬²¢¿ªÊ¼HOOK

m_status.SetWindowText(_T("HookÒÑÆô¶¯"));

}

2.ÖÕÖ¹HookMessageBoxW

// 

// ÖÕÖ¹ HookMessageBoxW

//

void CHookMessageboxWindowDlg::OnBnClickedButtonStop()

{

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

HookOff();

m_status.SetWindowText(_T("HookÒÑÍ£Ö¹"));

}

3.µ÷ÓÃMessageBoxW

// 

// µ÷ÓÃ HookMessageBoxW

//

void CHookMessageboxWindowDlg::OnBnClickedButtonCall()

{

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

::MessageBoxW(m_hWnd,_T("ÕâÊÇÕý³£µÄMessageBoxW"),_T("Hello"),0);

}

4.ÌáÉýȨÏÞ

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;

}

0x04 ²âÊÔ

1.Æô¶¯³ÌÐò£¬µ¥»÷"µ÷ÓÃMessageBoxW"°´Å¥

2.µ¥»÷"Æô¶¯HookMessageBoxW"°´Å¥£¬µ¥»÷"µ÷ÓÃMessageBoxW"°´Å¥

3.µ¥»÷"ÖÕÖ¹HookMessageBoxW"°´Å¥£¬µ¥»÷"µ÷ÓÃMessageBoxW"°´Å¥

0x04 ¸½Â¼¡ª¡ªÈ«²¿Ô´Âë

ÒÔϸø³öÖ÷ҪʵÏÖµÄËùÓÐÔ´´úÂ룬ÒÔ±ã´ÓÕûÌåÉϰÑÎÕÕû¸öʵÏÖ¹ý³Ì¡£

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

//

#include "stdafx.h"

#include "HookMessageboxWindow.h"

#include "HookMessageboxWindowDlg.h"

#include "afxdialogex.h"

// ¶¨ÒåAPIÀàÐÍ

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

typedef int (WINAPI *TypeMessageBoxW)(HWND hwnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);

TypeMessageBoxW OdlMsgBoxW = NULL; // Ö¸Ïòº¯ÊýÔ­ÐÍÖ¸Õë

FARPROC pfOldMsgBoxW; // Ö¸Ïòº¯ÊýÔ¶Ö¸Õë

BYTE OldCode[CODE_LENGTH]; // ԭϵͳAPIÈë¿Ú

BYTE NewCode[CODE_LENGTH]; // ×Ô¼ºÊµÏÖµÄAPIµÄÈë¿Ú£¬£¨jmp xxxx£©£¬xxxxΪÐÂAPIÈë¿ÚµØÖ·

HANDLE hProcess = NULL; // ±¾³ÌÐò½ø³Ì¾ä±ú

HINSTANCE hInst = NULL; // APIËùÔÚµÄdllÎļþ¾ä±ú

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

VOID HookOff(); // ֹͣHOOK

VOID GetApiEntrancy(); // »ñÈ¡APIÈë¿ÚµØÖ·

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

//

// ×Ô¼º¶¨ÒåµÄ£¬ÓÃÓÚÌæ»»ÏàÓ¦APIµÄ£¬¼ÙµÄAPI

//

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

{

TRACE(lpText);

/*

µ÷ÓÃÔ­º¯Êý֮ǰ£¬ÏÈÍ£Ö¹HOOK£¬Ò²¾ÍÊǻָ´Ô­ÏµÍ³APIº¯ÊýµÄÈë¿Ú£¬

·ñÔòÎÞ·¨µ÷Óõ½Ô­APIº¯Êý£¬¶øÊǼÌÐøµ÷ÓÃ×Ô¼ºµÄAPI£¬»áÔì³ÉËÀ

Ñ­»·£¬½ø¶øÔì³É¶ÑÕ»Òç³ö£¬±ÀÀ£¡£

*/

HookOff();

/*

µ÷ÓÃÔ­À´µÄMessageBoxW´òÓ¡ÎÒÃǵÄÐÅÏ¢¡£

*/

int ret = MessageBoxW(hwnd,_T("¹þ¹þ£¬±»HOOK¿©£¡£¡"),lpCation,uType);

/*

µ÷ÓÃÍêԭϵͳAPIºó£¬¼ÇµÃ»Ö¸´HOOK£¬Ò²¾ÍÊÇÆô¶¯HOOK£¬½«Ô­APIº¯ÊýÈë¿Ú»»³ÉÎÒÃÇ×Ô¼º¶¨ÒåµÄº¯ÊýÈë¿Ú£¬

·ñÔòÏÂÒ»´Îµ÷ÓÃMessageBoxWµÄʱºò¾ÍÎÞ·¨×ªµ½ÎÒÃÇ×Ô¼º¶¨ÒåµÄAPIº¯ÊýÖУ¬Ò²¾ÍÎÞ·¨ÊµÏÖHOOK¡£

*/

HookOff();

return ret;

}

/*

Æô¶¯HOOK£¬½«Ô­APIµÄÈë¿ÚµØÖ·»»³ÉÎÒÃÇ×Ô¼º¶¨Ò庯ÊýµÄÈë¿ÚµØÖ·

*/

VOID HookOn()

{

//

// È·±£±¾³ÌÐò½ø³Ì¾ä±úhProcess²»ÎªNULL

//

ASSERT(hProcess!=NULL);

DWORD dwTemp;

DWORD dwOldProtect;

SIZE_T writedByte;

//

// ÐÞ¸ÄAPIÈë¿ÚµÄǰ5¸ö×Ö½Ú£¬jmp xxxx

//

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,PAGE_READWRITE,&dwOldProtect);

WriteProcessMemory(hProcess,pfOldMsgBoxW,NewCode,CODE_LENGTH,&writedByte);

if (writedByte == 0)

{

AfxMessageBox(_T("Ìæ»»Ô­APIµØÖ·Ê§°Ü"));

}

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,dwOldProtect,&dwTemp);

}

/*

¶¨ÖÆHOOK£¬½«Èë¿Ú»»³ÉÔ­À´µÄAPIÈë¿ÚµØÖ·

*/

VOID HookOff()

{

ASSERT(hProcess != NULL);

DWORD dwTemp;

DWORD dwOldProtect;

SIZE_T wirtedByte;

// »Ø¸´Ô­APIµØÖ·

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,PAGE_READWRITE,&dwOldProtect);

WriteProcessMemory(hProcess,pfOldMsgBoxW,OldCode,CODE_LENGTH,&wirtedByte);

if (wirtedByte == 0)

{

AfxMessageBox(_T("»Ø¸´Ô­APIµØÖ·Ê§°Ü"));

}

VirtualProtectEx(hProcess,pfOldMsgBoxW,CODE_LENGTH,dwOldProtect,&dwTemp);

}

/*

±£´æÔ­APIºÍÐÂAPIµÄµØÖ·

*/

VOID GetApiEntrancy()

{

//

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

//

HMODULE hmod = LoadLibrary(_T("User32.dll"));

if ( NULL == hmod)

{

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

return;

}

OdlMsgBoxW = (TypeMessageBoxW)::GetProcAddress(hmod,"MessageBoxW");

pfOldMsgBoxW = (FARPROC)OdlMsgBoxW;

if ( pfOldMsgBoxW == NULL)

{

AfxMessageBox(_T("»ñȡԭAPIÈë¿ÚµØÖ·³ö´í"));

return;

}

//

// ½«Ô­APIµÄÈë¿Ú5¸ö×Ö½Ú´úÂë±£´æµ½OdeCode[]ÖÐ

//

_asm

{

lea edi,OldCode // È¡Êý×éOldCode[]µØÖ·£¬´æ·Åµ½ediÖÐ

mov esi,pfOldMsgBoxW // »ñȡԭAPIÈë¿ÚµØÖ·£¬´æÈëesiÖÐ

cld // ÉèÖ÷½Ïò

movsd // ÒÆ¶¯dword £¬4 Byte

movsb // ÒÆ¶¯ 1 Byte

}

//

// еÄAPIÈë¿Ú±£´æµ½NewCode[]ÖУ¬¼´jmp xxxx£¬xxxxΪÐÂAPIµØÖ·£¬¸ÃÖ¸Áî×ܳ¤¶ÈΪ5¸ö×Ö½Ú

//

NewCode[0] = 0xe9; // 0xe9Ï൱ÓÚjmpÖ¸Áî

_asm

{

lea eax,MyMessageBoxW

mov ebx,pfOldMsgBoxW

sub eax,ebx

sub eax,CODE_LENGTH

mov dword ptr[NewCode+1],eax

}

//

// Ìî³äÍê±Ï£¬¿ªÊ¼HOOK£¬¼´Ê¹ÓÃNewCode[]Ìæ»»Ô­APIÈë¿Ú

//

HookOn();

}

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;

}

//

// Æô¶¯ HookMessageBoxW

//

void CHookMessageboxWindowDlg::OnBnClickedButtonStart()

{

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

AdjustPrivileges(); // ÌáÉýȨÏÞ£¬ÒòΪµ÷Óà OpenProcess() ÐèÒªºÏÊʵÄȨÏÞ

DWORD dwPid = ::GetCurrentProcessId();

hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);

if (hProcess == NULL)

{

CString logInfo;

logInfo.Format(_T("»ñÈ¡½ø³Ì¾ä±úʧ°Ü£¡£¡,½ø³Ì id = 0x%x ,´íÎó´úÂë = 0x%x"),dwPid,GetLastError());

AfxMessageBox(logInfo);

return;

}

GetApiEntrancy(); // »ñȡоÉAPIÈë¿Ú£¬²¢¿ªÊ¼HOOK

m_status.SetWindowText(_T("HookÒÑÆô¶¯"));

}

//

// ÖÕÖ¹ HookMessageBoxW

//

void CHookMessageboxWindowDlg::OnBnClickedButtonStop()

{

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

HookOff();

m_status.SetWindowText(_T("HookÒÑÍ£Ö¹"));

}

//

// µ÷ÓÃ HookMessageBoxW

//

void CHookMessageboxWindowDlg::OnBnClickedButtonCall()

{

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

::MessageBoxW(m_hWnd,_T("ÕâÊÇÕý³£µÄMessageBoxW"),_T("Hello"),0);

}

   
2938 ´Îä¯ÀÀ       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ÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ