积累系统性知识
积聚技术精华
  首页    个人中心    撰写积文    建立课题    订立目标    整理积文    管理课题    管理目标    技能Get    代码积累 
WIN XP操作系统中任意进程的函数挂钩 ----API HOOK 之菜鸟篇
error997 (error997)    2014-11-20 20:31:14      目标    课题
   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();   
    
  }


转自 http://blog.csdn.net/y___y/article/details/1361262
(+0)技能Get

建议楼主:搜索关键字 |参考其他资源 |回复 |追问
  error997(error997):   个人中心    课题    目标    代码积累