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

本文介绍如何在Windows XP系统中使用Microsoft Research Detours工具包实现API Hook,通过注入DLL到目标进程并替换指定函数来改变其行为。文章详细展示了寻找目标窗口、获取进程ID、注入DLL以及替换函数的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shaoji ( 菜花书生的机机一级用户 该版得分小于等于100分    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();  
   
  }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值