ここのサイトを参考にしています。http://ruffnex.oc.to/kenji/text/api_hook
自分なりに頑張って見ましたがだめです。
PFNVirtualProtectが定義されていないなど
エラーが出ます。
/////////////////////////////////////////////////////////////////////
// ex2.cpp
// APIフックサンプルプログラム
// WindowsXP, VC++.NET
/////////////////////////////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN
#define STRICT
#include <stdio.h>
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <tlhelp32.h>
#include <Dbghelp.h>
// ImageDirectoryEntryToData
#pragma comment(lib, "Dbghelp.lib")
// ひとつのモジュールに対してAPIフックを行う関数
void ReplaceIATEntryInOneMod(
PCSTR pszModuleName,
PROC pfnCurrent,
PROC pfnNew,
HMODULE hmodCaller)
{
ULONG ulSize;
PIMAGE_IMPORT_DESCRIPTOR pImportDesc;
pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(
hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);
if (pImportDesc == NULL)
{
return;
}
while(pImportDesc->Name)
{
PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name);
if (lstrcmpiA(pszModName, pszModuleName) == 0)
{
break;
}
pImportDesc++;
}
if (pImportDesc->Name == 0)
{
return;
}
PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)
((PBYTE) hmodCaller + pImportDesc->FirstThunk);
while(pThunk->u1.Function)
{
PROC *ppfn = (PROC*) &pThunk->u1.Function;
BOOL fFound = (*ppfn == pfnCurrent);
if (fFound)
{
DWORD dwDummy;
VirtualProtect(ppfn, sizeof(ppfn), PAGE_EXECUTE_READWRITE, &dwDummy);
WriteProcessMemory(
GetCurrentProcess(), ppfn, &pfnNew, sizeof(pfnNew), NULL);
return;
}
pThunk++;
}
return;
}
// すべてのモジュールに対してAPIフックを行う関数
void ReplaceIATEntryInAllMods(
PCSTR pszModuleName,
PROC pfnCurrent,
PROC pfnNew)
{
// モジュールリストを取得
HANDLE hModuleSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPMODULE, GetCurrentProcessId());
if(hModuleSnap == INVALID_HANDLE_VALUE)
return;
MODULEENTRY32 me;
me.dwSize = sizeof(me);
BOOL bModuleResult = Module32First(hModuleSnap, &me);
// それぞれのモジュールに対してReplaceIATEntryInOneModを実行
while(bModuleResult) {
ReplaceIATEntryInOneMod(pszModuleName, pfnCurrent, pfnNew, me.hModule);
bModuleResult = Module32Next(hModuleSnap, &me);
}
CloseHandle(hModuleSnap);
}
// フックする関数のプロトタイプを定義
typedef int (WINAPI *PFNMESSAGEBOXA)(HWND, LPCSTR, LPCSTR, UINT);
typedef int (WINAPI *PFNMESSAGEBOXW)(HWND, LPCSTR, LPCSTR, UINT);
typedef int (WINAPI *PFNVIRTUALPROTECT)(LPVOID, DWORD, DWORD, PDWORD);
int WINAPI Hook_VirtualProtect(
LPVOID lpAddress,
DWORD dwSize,
DWORD flNewProtect,
PDWORD lpflOldProtect)
{
// オリジナルVirtualProtectを呼び出す
PROC pfnOrig = GetProcAddress(
GetModuleHandleA("kernel32.dll"), "MessageBoxA");
int nResult = ((PFNVirtualProtect) pfnOrig)
(lpAdddress,dwSize,flNewProtect,lpflOldProtect);
return nResult;
}
int WINAPI Hook_MessageBoxA(
HWND hWnd,
LPCSTR pszText,
LPCSTR pszCaption,
UINT uType)
{
// オリジナルMessageBoxAを呼び出す
PROC pfnOrig = GetProcAddress(
GetModuleHandleA("user32.dll"), "MessageBoxA");
int nResult = ((PFNMESSAGEBOXA) pfnOrig)
(hWnd, pszText, ("I am Hook_MessageBoxA"), uType);
return nResult;
}
int WINAPI Hook_MessageBoxW(
HWND hWnd,
LPCSTR pszText,
LPCSTR pszCaption,
UINT uType)
{
// オリジナルMessageBoxWを呼び出す
PROC pfnOrig = GetProcAddress(
GetModuleHandleA("user32.dll"), "MessageBoxW");
int nResult = ((PFNMESSAGEBOXW) pfnOrig)
(hWnd, pszText, L("I am Hook_MessageBoxW"), uType);
return nResult;
}
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
PROC pfnOrig;
pfnOrig = ::GetProcAddress(
GetModuleHandleA("kernel32.dll"), "VirtualProtect");
ReplaceIATEntryInAllMods(
"kernel32.dll", pfnOrig, (PROC)Hook_VirtualProtect);
pfnOrig = ::GetProcAddress(
GetModuleHandleA("user32.dll"), "MessageBoxA");
ReplaceIATEntryInAllMods(
"user32.dll", pfnOrig, (PROC)Hook_MessageBoxA);
pfnOrig = ::GetProcAddress(
GetModuleHandleA("user32.dll"), "MessageBoxW");
ReplaceIATEntryInAllMods(
"user32.dll", pfnOrig, (PROC)Hook_MessageBoxW);
MessageBox(GetActiveWindow(),
_T("メッセージボックス表示のテスト"), _T("テスト"), MB_OK);
unsigned long d;
int a = 0,b = 0,c = 0;
unsigned long code[32] = {0};
printf("VirtualAlloc : %s\n\n",VirtualProtect(
code,
32,
PAGE_EXECUTE_READWRITE,
&d) != 0 ? "[OK]" : "[FALSE]");
printf("INPUT [a,b,c] : ");
scanf_s("%d,%d,%d",&a,&b,&c);
code[0] = 0x0424448B; // MOV EAX,DWORD PTR SS:[ESP+4]
code[1] = 0x08244C8B; // MOV ECX,DWORD PTR SS:[ESP+8]
code[2] = 0x9090C13B; // CMP EAX,ECX
code[3] = 0x9090047E; // JLE SHORT ; EIP+4
code[4] = 0x9090C88B; // MOV ECX,EAX
code[5] = 0x0C24548B; // MOV EDX,DWORD PTR SS:[ESP+C]
code[6] = 0x9090CA3B; // CMP ECX,EDX
code[7] = 0x9090147E; // JLE SHORT ; EIP+C
code[8] = 0x90909056; // PUSH ESI
code[9] = 0x9090F28B; // MOV ESI,EDX
code[10] = 0x9090D18B; // MOV EDX,ECX
code[11] = 0x9090CE8B; // MOV ECX,ESI
code[12] = 0x9090905E; // POP ESI
code[13] = 0x90C0AF0F; // IMUL EAX,EAX
code[14] = 0x90C9AF0F; // IMUL ECX,ECX
code[15] = 0x90D2AF0F; // IMUL EDX,EDX
code[16] = 0x9090C103; // ADD EAX,ECX
code[17] = 0x9090C22B; // SUB EAX,EDX
code[18] = 0x9090D8F7; // NEG EAX
code[19] = 0x9090C01B; // SBB EAX,EAX
code[20] = 0x90909040; // INC EAX
code[21] = 0x909090C3; // RETN
printf("\nRETURN : %s\n",
((int(*)(int,int,int))code)(a,b,c) == 0 ? "[FALSE]" : "[OK]");
return 0;
}
きたないですがよろしくお願いします。