// 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);
} |