远程DLL中怎么设置全局钩子
远程DLL中如何设置全局钩子。
我写了个DLL,然后用另一个程序将它当作远程线程注入到NOTEPAD.exe中,在DLL实现全局HOOK,在HOOKPROC中实现替换MESSAGEBOXA的前5字节为跳转到新API。
DLL代码如下:
// Test_DLL.cpp : Defines the entry point for the DLL application.
//
#include <windows.h>
#include "stdafx.h "
#pragma comment(lib, "ImageHlp ") //定义全局共享数据段
#pragma data_seg( "Shared ")
HMODULE g_hinstDll=NULL;
HHOOK g_hHook=NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws ") //设置全局共享数据段的属性
FARPROC pfMessageBoxA;
int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
BYTE OldMessageBoxACode[5],NewMessageBoxACode[5];//新旧API内存镜像前5字节
HMODULE hModule;
DWORD dwIdOld,dwIdNew;
BOOL bHook=false;
BOOL InstallHook();
BOOL UnInstallHook();
BOOL HookOn();
BOOL HookOff();
LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam);
/////////////////////////
// DllMain
/////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if(!InstallHook())
{
MessageBoxA(NULL, "Error ", "InstallHook ",MB_OK);
return(false);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if(g_hHook) UnInstallHook();
break;
}
return TRUE;
}
/////////////////////////
// InstallHook 安装一个全局消息钩子
/////////////////////////
BOOL InstallHook()//输出安装空的钩子函数
{
g_hinstDll=LoadLibrary( "Test_DLL.dll ");//远程线程中不能再载入DLL,所以此处使用DLL中Hook()
g_hHook=SetWindowsHookEx ( WH_GETMESSAGE,(HOOKPROC)HookProc,g_hinstDll,0 );//钩子所监视的线程的线程号。0为全局钩子,监视全部线程
if (!g_hHook)
{
MessageBoxA(NULL, "SET ERROR ", "SET ERROR ",MB_OK);
return(false);
}
return(true);
}
/////////////////////////
// HookProc 在进程内准备好跳转到新API地址的代码
/////////////////////////
LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam)//空的钩子函数
{
hModule=LoadLibrary( "user32.dll ");
pfMessageBoxA=GetProcAddress(hModule, "MessageBoxA ");// 获取目标API的地址
NewMessageBoxACode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令
_asm
{
lea eax,MyMessageBoxA
mov ebx,pfMessageBoxA
sub eax,ebx
sub eax,5
mov dword ptr [NewMessageBoxACode+1],eax
}//写入地址到替换代码的缓存
dwIdNew=GetCurrentProcessId();//得到所属进程的ID*/
if (!HookOn())
MessageBoxA ( NULL, "HookOn失败 ", "HookOn失败 ", MB_OK );
return(CallNextHookEx(g_hHook,nCode,wParam,lParam));
}
/////////////////////////
// HookOn 修改进程中API的前5个字节,写入跳转到新API的代码
/////////////////////////
BOOL HookOn()
{
MessageBoxA(NULL, "开始修改 ", "HookOn开始修改 ",MB_OK);
HANDLE hProc;
我写了个DLL,然后用另一个程序将它当作远程线程注入到NOTEPAD.exe中,在DLL实现全局HOOK,在HOOKPROC中实现替换MESSAGEBOXA的前5字节为跳转到新API。
DLL代码如下:
// Test_DLL.cpp : Defines the entry point for the DLL application.
//
#include <windows.h>
#include "stdafx.h "
#pragma comment(lib, "ImageHlp ") //定义全局共享数据段
#pragma data_seg( "Shared ")
HMODULE g_hinstDll=NULL;
HHOOK g_hHook=NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws ") //设置全局共享数据段的属性
FARPROC pfMessageBoxA;
int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);
BYTE OldMessageBoxACode[5],NewMessageBoxACode[5];//新旧API内存镜像前5字节
HMODULE hModule;
DWORD dwIdOld,dwIdNew;
BOOL bHook=false;
BOOL InstallHook();
BOOL UnInstallHook();
BOOL HookOn();
BOOL HookOff();
LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam);
/////////////////////////
// DllMain
/////////////////////////
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if(!InstallHook())
{
MessageBoxA(NULL, "Error ", "InstallHook ",MB_OK);
return(false);
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
if(g_hHook) UnInstallHook();
break;
}
return TRUE;
}
/////////////////////////
// InstallHook 安装一个全局消息钩子
/////////////////////////
BOOL InstallHook()//输出安装空的钩子函数
{
g_hinstDll=LoadLibrary( "Test_DLL.dll ");//远程线程中不能再载入DLL,所以此处使用DLL中Hook()
g_hHook=SetWindowsHookEx ( WH_GETMESSAGE,(HOOKPROC)HookProc,g_hinstDll,0 );//钩子所监视的线程的线程号。0为全局钩子,监视全部线程
if (!g_hHook)
{
MessageBoxA(NULL, "SET ERROR ", "SET ERROR ",MB_OK);
return(false);
}
return(true);
}
/////////////////////////
// HookProc 在进程内准备好跳转到新API地址的代码
/////////////////////////
LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam)//空的钩子函数
{
hModule=LoadLibrary( "user32.dll ");
pfMessageBoxA=GetProcAddress(hModule, "MessageBoxA ");// 获取目标API的地址
NewMessageBoxACode[0]=0xe9;//jmp MyMessageBoxA的相对地址的指令
_asm
{
lea eax,MyMessageBoxA
mov ebx,pfMessageBoxA
sub eax,ebx
sub eax,5
mov dword ptr [NewMessageBoxACode+1],eax
}//写入地址到替换代码的缓存
dwIdNew=GetCurrentProcessId();//得到所属进程的ID*/
if (!HookOn())
MessageBoxA ( NULL, "HookOn失败 ", "HookOn失败 ", MB_OK );
return(CallNextHookEx(g_hHook,nCode,wParam,lParam));
}
/////////////////////////
// HookOn 修改进程中API的前5个字节,写入跳转到新API的代码
/////////////////////////
BOOL HookOn()
{
MessageBoxA(NULL, "开始修改 ", "HookOn开始修改 ",MB_OK);
HANDLE hProc;