15,471
社区成员
发帖
与我相关
我的任务
分享
//Dll文件
HHOOK g_hHook = NULL;
HINSTANCE g_hInstance = NULL;
PROC g_oldProc = (PROC)OpenProcess;
typedef HANDLE (WINAPI *OPENPROCESS)(DWORD, BOOL, DWORD);
HANDLE WINAPI MyOpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId)
{
MessageBox(NULL, "Test", NULL, MB_OK);
return ((OPENPROCESS)g_oldProc)(dwDesiredAccess, bInheritHandle, dwProcessId);
}
int InitHook(char *DllName, PROC OldFunAddr, PROC NewFunAddr)
{
HMODULE lpBase = GetModuleHandle(NULL);
IMAGE_DOS_HEADER *dosHeader;
IMAGE_NT_HEADERS *ntHeader;
dosHeader=(IMAGE_DOS_HEADER*)lpBase;
ntHeader=(IMAGE_NT_HEADERS32*)((BYTE*)lpBase+dosHeader->e_lfanew);
IMAGE_IMPORT_DESCRIPTOR *pImportDesc=(IMAGE_IMPORT_DESCRIPTOR*)((BYTE*)lpBase+ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
while(pImportDesc->FirstThunk)
{
char* pszDllName = (char*)((BYTE*)lpBase + pImportDesc->Name);
if(lstrcmpiA(pszDllName, DllName) == 0)
{
break;
}
pImportDesc++;
}
DWORD* lpAddr;
IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)((BYTE*)lpBase + pImportDesc->FirstThunk);
while(pThunk->u1.Function)
{
lpAddr = (DWORD*)&(pThunk->u1.Function);
if(*lpAddr == (DWORD)OldFunAddr) //位置a
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery(lpAddr, &mbi, sizeof(mbi));
::VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
WriteProcessMemory(GetCurrentProcess(),lpAddr, &NewFunAddr, sizeof(DWORD), NULL);
::VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, 0);
}
pThunk++;
}
return 0;
}
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance = (HINSTANCE)hModule;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
InitHook("Kernel32.dll", g_oldProc, (PROC)MyOpenProcess);
break;
}
return TRUE;
}
//导出函数
void SetHook(BOOL bSet)
{
if (bSet)
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, g_hInstance, NULL);
else
UnhookWindowsHookEx(g_hHook);
}
///////////////////////////////////////////////////////////////////////
//主程序
typedef void (*SetHook)(BOOL bSet);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HMODULE hModule = LoadLibrary("ApiHook.dll");
if(hModule==NULL)
return 0;
SetHook SetApiHook = (SetHook)GetProcAddress(hModule, "SetHook");
if(SetApiHook == NULL)
return 0;
SetApiHook(TRUE); //执行后explorer.exe挂掉
Sleep(60000);
SetApiHook(FALSE);
return 0;
}