您的位置:首页 > 其它

WIN XP操作系统中任意进程的函数挂钩 ----API HOOK 之菜鸟篇

2006-11-01 20:02 453 查看
shaoji (菜花书生的机机)

2003-12-17 12:17:56 在 VC/MFC / 进程/线程/DLL 提问

API HOOK 菜鸟篇之WIN XP操作系统函数挂钩
--------------挂钩任意进程的任意函数
第一步:工具准备
1、VC++开发工具,2、Detours工具(Microsoft Research Detours Package,Version 1.5)包含Detours.h和连接 Detours.lib 。
第二步:具体实现
1。注入DLL到目标进程。如:

#include "stdafx.h"
#include "HookOther.h"
#include "HookOtherDlg.h"
#include "detours.h"
#include "tlhelp32.h"

//查找名称为hookWindow对应字符串的窗口,hookWindow为要挂钩的进程。
HWND thread_hwnd=::FindWindow(NULL,hookWindow);
if (NULL==thread_hwnd)
{
//没找到相应的程序,则退出钩子安装程序
::MessageBox(NULL,"被挂钩的窗口找不到","窗口没找到",MB_OK);
return false;
}
//Snapshot拍一张系统所有进程的快照,找出要挂钩的进程

PROCESSENTRY32 pe32={0};
pe32.dwSize=sizeof(PROCESSENTRY32);
DWORD Process_id;
HANDLE hSnapshot;
BOOL bFind=FALSE;
//PROCESSENTRY32:描述了一个被指定进程所应用的模块的struct
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

BOOL bOk = Process32First( hSnapshot, &pe32);
while (bOk&&(!bFind))
{
if (0==::lstrcmpiA(pe32.szExeFile, hookMoudle))
{
//得到要挂钩的进程ID,为OpenProcess要的参数做准备
Process_id=pe32.th32ProcessID;
::MessageBox(NULL,pe32.szExeFile,"被挂钩进程 为",MB_OK);
bFind=TRUE;
}
bOk = Process32Next(hSnapshot, &pe32);
}
if (NULL==Process_id)
{
::MessageBox(NULL,"被挂钩进程ID为空","进程ID为空",MB_OK);
return false;
}
::CloseHandle(hSnapshot);
HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,Process_id);
if (NULL==hProcess)
{
::MessageBox(NULL,"被挂钩进程为空","hProcess为空",MB_OK);
return false;
}

if (!DetourContinueProcessWithDllA(hProcess, szDllPath))
{
::MessageBox(NULL,"DetourContinueProcessWithDll_fail","Failed",MB_OK);
return false;
}

2。替换目标进程的函数。在HOOKDLL.dll的DllMain函数中实现,
如下:

// HookDll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "ImageHlp.h"
#include "detours.h"
//
#pragma comment(lib,"ImageHlp") //定义全局共享数据段

#pragma data_seg("Shared")
HMODULE hmodCaller=NULL; //要调用函数的模块
PROC pfnOld=NULL; //原函数地址
PROC pfnNew=NULL; //新函数地址
#pragma data_seg()

#pragma comment(linker,"/Section:Shared,rws") //设置全局共享数据段的属性

//to do handle

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{

if (ul_reason_for_call==DLL_PROCESS_ATTACH)
{
if (!(pfnOld=::GetProcAddress(::GetModuleHandle ("DialogDll.dll"),"ShowDlg")))

return FALSE;
if (!(pfnNew=::GetProcAddress(::GetModuleHandle("HookDll.dll"),"HookDialog")))
return FALSE;
DetourFunction((PBYTE)pfnOld,(PBYTE)pfnNew); //替换函数

}
return TRUE;

}

//new dialog
//新的对话框函数,用来替换旧对话框
void HookDialog()
{
//弹出新的对话框
::MessageBox(NULL,"这是新的对话框from Other DLL","Other DLL Dialog",MB_OK);
//调用原来的旧对话框
pfnOld();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐