exe程序在xp下运行需要设置的地方
// ConsoleApplication6.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
typedef int(__stdcall *MessageBox_type)
(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
);
MessageBox_type old_MessageBoxA; //定义函数指针,保存原MessageBox函数的地址,用于函数退出时恢复操作
#pragma pack(1) //以1个字节的方式对齐
typedef struct _JMPCODE
{
BYTE jmp;
DWORD addr;
}JMPCODE, *PJMPCODE;
_declspec(naked) //生成干净的汇编代码,不需要编译器添加堆栈平衡代码
VOID _stdcall my_MessageBox(
HWND hWnd,
LPCTSTR lpText,
LPCTSTR lpCaption,
UINT uType
)
{
__asm
{
mov edi,edi
push ebp
mov ebp, esp
}
printf("InLineHook正在执行my_MessageBox");
printf("取得的数据:%x,%s,%s,%x", hWnd, lpText, lpCaption, uType);
__asm
{
mov ebx, old_MessageBoxA
add ebx, 5
jmp ebx
}
}
VOID InLine_HookMessageBoxA()
{
JMPCODE jcode;
//取得MessageBoxA函数当前地址
HMODULE h = LoadLibraryA("user32.dll");
//获得在user32.dll中的地址
old_MessageBoxA = (MessageBox_type)(GetProcAddress(h, "MessageBoxA"));
jcode.jmp = 0xe9; //e9相当于汇编语言中的JMP指令
//my_MessageBox = 将要跳转到的地址,MessageBoxA = 原始地址
jcode.addr = (DWORD)(&my_MessageBox) - (DWORD)(&MessageBoxA) - 5; //获取JMP后面的绝对地址
//将jcode的地址写MessageBoxA的地址上
WriteProcessMemory(GetCurrentProcess(), &MessageBoxA, &jcode, sizeof(JMPCODE), NULL);
CloseHandle(h);
}
int _tmain(int argc, _TCHAR* argv[])
{
InLine_HookMessageBoxA();
MessageBoxA(NULL, "PNDGMCSY", "PNDGMCSY", MB_OK);
system("pause");
return 0;
}