3,245
社区成员
发帖
与我相关
我的任务
分享
DWORD g_pMsgA=0;
BYTE g_szMsgAOld[8]={NULL};
BYTE g_szMsgANew[8]={0XB8,0X00,0X00,0X40,0X00,0XFF,0XE0,0X00};
DWORD dwSize=0;
HMODULE hDLL=NULL;
hDLL=::LoadLibrary("User32.dll");
g_pMsgA=(DWORD)GetProcAddress(hDLL,"MessageBoxA");
ReadProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgAOld,8,&dwSize);
*(DWORD*)(g_szMsgANew+1)=(DWORD)MyMessageBoxA;
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgANew,8,&dwSize);
int MyMessageBoxA(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType)
{
int iRet=0;
DWORD dwSize=0;
if (CheckDlg(hWnd)) return 0;
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgAOld,8,&dwSize);
iRet=MessageBoxA(hWnd,lpText,lpCaption,uType);
WriteProcessMemory(INVALID_HANDLE_VALUE,(void*)g_pMsgA,g_szMsgANew,8,&dwSize);
return iRet;
}
#include <windows.h>
#pragma comment(lib, "user32.lib")
#ifndef _X86_JMP_SIZE
#define _X86_JMP_SIZE 6
#endif
void *g_pfnToHook = NULL;
void *g_pfnHooked = NULL;
BYTE g_oldBytes[_X86_JMP_SIZE] = { 0 };
BYTE g_jmpBytes[_X86_JMP_SIZE] = { 0 };
DWORD g_dwProtect = 0;
DWORD g_dwResult = 0;
int WINAPI HookedMessageBoxA(
HWND hWnd,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType
)
{
int iRet = -1;
if (VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, PAGE_EXECUTE_READWRITE, &g_dwResult)) {
memcpy(g_pfnToHook, (void *)g_oldBytes, _X86_JMP_SIZE);
iRet = MessageBoxA(hWnd, "The message from hooked MessageBox!", lpCaption, uType);
memcpy(g_pfnToHook, (void *)g_jmpBytes, _X86_JMP_SIZE);
VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, g_dwProtect, &g_dwResult);
}
return iRet;
}
BOOL InitializeMessageBoxHook(void)
{
BYTE jmpBytes[_X86_JMP_SIZE] = { 0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3 };
memcpy((void *)g_jmpBytes, (void *)jmpBytes, sizeof(jmpBytes));
DWORD jmpSize = (DWORD)((DWORD_PTR)g_pfnHooked - (DWORD_PTR)g_pfnToHook - 5);
BOOL fResult = VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, PAGE_EXECUTE_READWRITE, &g_dwProtect);
if (fResult) {
memcpy((void *)g_oldBytes, g_pfnToHook, _X86_JMP_SIZE);
memcpy((void *)&g_jmpBytes[1], (void *)&jmpSize, sizeof(jmpSize));
memcpy(g_pfnToHook, (void *)g_jmpBytes, _X86_JMP_SIZE);
fResult = VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, g_dwProtect, &g_dwResult);
}
return fResult;
}
BOOL FinalizeMessageBoxHook(void)
{
BOOL fResult = VirtualProtect(g_pfnToHook, _X86_JMP_SIZE, PAGE_EXECUTE_READWRITE, &g_dwResult);
if (fResult) {
memcpy(g_pfnToHook, g_oldBytes, _X86_JMP_SIZE);
}
return fResult;
}
int main(int argc, char *argv[])
{
g_pfnToHook = (void *)MessageBoxA;
g_pfnHooked = (void *)HookedMessageBoxA;
MessageBoxA(NULL, "Before Hook!", "before", MB_OK);
if (InitializeMessageBoxHook()) {
MessageBoxA(NULL, "Hello world!", "info", MB_OK);
FinalizeMessageBoxHook();
}
MessageBoxA(NULL, "After Hook!", "after", MB_OK);
return 0;
}
g_pMsgA=(DWORD)GetProcAddress(hDLL,"MessageBoxA");
目测弄成64位程序了, 然后就崩了