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();
}
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();
}
相关文章推荐
- WIN XP操作系统中任意进程的函数挂钩 ----API HOOK 之菜鸟篇
- so注入(inject)和挂钩(hook) 以及同进程动态库so文件的函数hook方法介绍
- 进程通信----共享内存以及mmap函数实现共享内存
- 2003年的代码-隐藏任意文件/目录-禁止访问任意文件/目录-隐藏任意注册表子键-禁止访问任意注册表子键-隐藏任意进程[NT系列]-自启动任意进程[95系列]-自定义可信赖进程(可以访问被保护的文件/目录,和/或者子键),并采用CRC32校验
- 设计一个函数求任意多个长整形的和
- exit()函数与_exit()函数及return关键字的区别: exit()和_exit()函数都可以用于结束进程,不过_exit()调用之后会立即进入内核,而exit()函数会先执行一些清理
- 简单分析Python中用fork()函数生成的子进程
- PHP-CGI 进程 CPU 100% 与 file_get_contents 函数的关系
- [转]跨进程API Hook(初稿)
- Linux 内核--fork()函数创建进程 (续)之copy_mem(int nr, struct task_struct *p)
- linux进程编程(二)-- waitpid()函数使用
- windows进程函数介绍【一】
- 有意思的进程创建函数fork() && fork() || fork() .
- php的POSIX 函数以及进程测试的深入分析
- Android菜鸟的成长笔记(22)——Android进程间传递复杂数据(AIDL)
- sched_yield()函数 高级进程管理
- 获取任意格式的new date,如yyyy-mm-dd、yyyy-mm等等,只需要SimpleDateFormat的formate(Date)和parse(String)两个函数即可
- 菜鸟C++自学笔记【包含函数的结构】
- 菜鸟前端日记6 (原生JS--函数基础)
- Linux的进程调度时机(Schedule函数何时调用)