#include "stdafx.h" #include "Test_Dll(mfc).h"
#ifdef _DEBUG #define new DEBUG_NEW #endif
#pragma region 我的代码
#define UM_WNDTITLE WM_USER+100
#pragma data_seg(".Share") HWND g_hWnd = NULL; HHOOK hhk = NULL; HINSTANCE hInst = NULL; #pragma data_seg() #pragma comment(linker, "/section:.Share,rws")
HANDLE hProcess=NULL; BOOL bIsInjected=FALSE; typedef int (WINAPI *MsgBoxA)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType); typedef int (WINAPI *MsgBoxW)(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType); MsgBoxA oldMsgBoxA=NULL; MsgBoxW oldMsgBoxW=NULL; FARPROC pfMsgBoxA=NULL; FARPROC pfMsgBoxW=NULL; BYTE OldCodeA[5]; BYTE NewCodeA[5]; BYTE OldCodeW[5]; BYTE NewCodeW[5]; int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType); int WINAPI MyMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType);
void HookOn() { ASSERT(hProcess!=NULL);
DWORD dwTemp = 0, dwOldProtect, dwRet = 0, dwWrite; VirtualProtectEx( hProcess, pfMsgBoxA, 5, PAGE_READWRITE, &dwOldProtect );
dwRet = WriteProcessMemory( hProcess, pfMsgBoxA, NewCodeA, 5, &dwWrite ); if (0==dwRet||0==dwWrite){ TRACE("NewCodeA 写入失败"); }
VirtualProtectEx(hProcess,pfMsgBoxA,5,dwOldProtect,&dwTemp);
VirtualProtectEx(hProcess,pfMsgBoxW,5,PAGE_READWRITE,&dwOldProtect); dwRet=WriteProcessMemory(hProcess,pfMsgBoxW,NewCodeW,5,&dwWrite); if (0==dwRet||0==dwWrite){TRACE("NewCodeW 写入失败");} VirtualProtectEx(hProcess,pfMsgBoxW,5,dwOldProtect,&dwTemp); }
void HookOff() { ASSERT(hProcess!=NULL);
DWORD dwTemp = 0, dwOldProtect = 0, dwRet = 0, dwWrite = 0;
VirtualProtectEx( hProcess, pfMsgBoxA, 5, PAGE_READWRITE, &dwOldProtect );
dwRet = WriteProcessMemory( hProcess, pfMsgBoxA, OldCodeA, 5, &dwWrite ); if (0==dwRet||0==dwWrite){ TRACE("OldCodeA 写入失败"); }
VirtualProtectEx(hProcess,pfMsgBoxA,5,dwOldProtect,&dwTemp);
VirtualProtectEx(hProcess,pfMsgBoxW,5,PAGE_READWRITE,&dwOldProtect); WriteProcessMemory(hProcess,pfMsgBoxW,OldCodeW,5,&dwWrite); if (0==dwRet||0==dwWrite){TRACE("OldCodeW 写入失败");} VirtualProtectEx(hProcess,pfMsgBoxW,5,dwOldProtect,&dwTemp); }
void Inject() { if (!bIsInjected){
bIsInjected=TRUE;
HMODULE hmod=::LoadLibrary(_T("User32.dll")); oldMsgBoxA=(MsgBoxA)::GetProcAddress(hmod,"MessageBoxA"); pfMsgBoxA=(FARPROC)oldMsgBoxA; oldMsgBoxW=(MsgBoxW)::GetProcAddress(hmod,"MessageBoxW"); pfMsgBoxW=(FARPROC)oldMsgBoxW; if (pfMsgBoxA==NULL){MessageBox(NULL,_T("cannot get MessageBoxA()"),_T("error"),0);return;} if (pfMsgBoxW==NULL){MessageBox(NULL,_T("cannot get MessageBoxW()"),_T("error"),0);return;}
_asm { lea edi,OldCodeA ; 把 OldCodeA 的地址给 edi mov esi,pfMsgBoxA ; 把 MessageBoxA 的地址给 esi cld ; 方向标志位复位 movsd ; 复制双子 movsb ; 复制字节 } _asm { lea edi,OldCodeW ; 以相同的方式操作 MessageBoxW mov esi,pfMsgBoxW cld movsd movsb }
NewCodeA[0]=0xe9; NewCodeW[0]=0xe9;
_asm { lea eax,MyMessageBoxA ; 将 MyMessageBoxA 的地址给 eax mov ebx,pfMsgBoxA ; 将 MessageBoxA 的地址给 ebx sub eax,ebx ; 计算 jmp 后面要跟的地址 sub eax,5 mov dword ptr [NewCodeA+1],eax } _asm { lea eax,MyMessageBoxW ; 以相同的方式操作 MessageBoxW mov ebx,pfMsgBoxW sub eax,ebx sub eax,5 mov dword ptr [NewCodeW+1],eax } HookOn(); } }
int WINAPI MyMessageBoxA(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType) { int nRet = 0;
HookOff();
nRet = ::MessageBoxA(hWnd,"Hook MessageBoxA",lpCaption,uType);
HookOn();
return nRet; }
int WINAPI MyMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption,UINT uType) { int nRet = 0;
HookOff();
nRet = ::MessageBoxW(hWnd,_T("Hook MessageBoxW"),lpCaption,uType);
HookOn();
return nRet; } #pragma endregion
#pragma region 忽略掉
BEGIN_MESSAGE_MAP(CTest_DllmfcApp, CWinApp) END_MESSAGE_MAP()
CTest_DllmfcApp::CTest_DllmfcApp() { }
CTest_DllmfcApp theApp; #pragma endregion
BOOL CTest_DllmfcApp::InitInstance() { CWinApp::InitInstance();
#pragma region 我的代码 hInst = AfxGetInstanceHandle();
DWORD dwPid = ::GetCurrentProcessId(); hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);
Inject();
#pragma endregion
return TRUE; }
int CTest_DllmfcApp::ExitInstance() {
#pragma region 我的代码 HookOff();
#pragma endregion
return CWinApp::ExitInstance(); }
#pragma region 我的代码
LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam ){ if (nCode==HC_ACTION){ ::SendMessage( g_hWnd, UM_WNDTITLE, wParam, (LPARAM)(((PMOUSEHOOKSTRUCT)lParam)->hwnd) );
}
return CallNextHookEx( hhk, nCode, wParam, lParam ); }
BOOL WINAPI StartHook(HWND hWnd) { g_hWnd = hWnd; hhk = ::SetWindowsHookEx( WH_MOUSE, MouseProc, hInst, NULL ); if (hhk==NULL){return FALSE;} else{return TRUE;} }
VOID WINAPI StopHook() { HookOff();
if (hhk!=NULL) { UnhookWindowsHookEx(hhk);
FreeLibrary(hInst); } }
#pragma endregion
|