首页
社区
课程
招聘
挂钩API遇到困难
2006-7-11 05:45 4533

挂钩API遇到困难

2006-7-11 05:45
4533
#include<windows.h>
#include"hookAPIdll.h"
#include <ImageHlp.h>

#pragma data_seg("Shared")
HHOOK      glhHook=NULL;
HINSTANCE  hmodDll=NULL;
#pragma data_seg()
#pragma comment(linker,"/Section:Shared,rws")

LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller) ;

int WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, PVOID pvReserved)
        
{
   switch(fdwReason)
   {
       case DLL_PROCESS_ATTACH:

       case DLL_PROCESS_DETACH:
       break;
   }
  hmodDll = hinstDll;     
return TRUE ;        
}
      
EXPORT BOOL CALLBACK  sethook()
{
   glhHook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,hmodDll,0);     
   return 1;
}
//用来替换myTerminateProcess的。
EXPORT BOOL CALLBACK myTerminateProcess( HANDLE hProcess,UINT uExitCode )
{
   hProcess=NULL;
   uExitCode=NULL;
  MessageBox(NULL,"该进程不能被关闭","错误!",0);
return  1;
}

LRESULT WINAPI GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
HMODULE hmodCaller = GetModuleHandle("behook.exe");//想挂钩这个进程
   ReplaceIATEntryInOneMod("Kernel32.dll",GetProcAddress(GetModuleHandle("Kernel32"),"TerminateProcess"),(PROC)myTerminateProcess,hmodCaller);/*用myTerminateProcess来代替    TerminateProcess*/
    return CallNextHookEx((HHOOK)glhHook,nCode,wParam,lParam);
}

// ReplaceIATEntryInOneMod为改写IAT函数
void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName,
   PROC pfnCurrent, PROC pfnNew, HMODULE hmodCaller)
{
   ULONG ulSize;
   PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
      ImageDirectoryEntryToData(hmodCaller, TRUE,
      IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);

   if(pImportDesc == NULL)
      return;  
   for(; pImportDesc->Name; pImportDesc++)
   {
      PSTR pszModName = (PSTR)
        ((PBYTE) hmodCaller + pImportDesc->Name);
      if(lstrcmpiA(pszModName, pszCalleeModName) == 0)
         break;
   }

   if(pImportDesc->Name == 0)
      return;

   PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)
      ((PBYTE) hmodCaller + pImportDesc->FirstThunk);

  
   for(; pThunk->u1.Function; pThunk++)
   {
      PROC* ppfn = (PROC*) &pThunk->u1.Function;
      BOOL fFound = (*ppfn == pfnCurrent);

      if(fFound)
      {   
         WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,
            sizeof(pfnNew), NULL);
         return;  
      }
   }
}

本想挂钩掉behook.exe调用的 TerminateProcess函数,可是不行不知道那里出错了,请大家帮我改一改。谢谢!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 196
活跃值: (135)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
thinkSJ 4 2006-7-11 13:12
2
0
首先明确一下:你是用IAT替换的方式进行HOOK的,但如果在behook.exe中的TerminateProcess函数调用是通过GetProcAddress
函数动态加载的,那么这种方法就会失效,
LZ可以看一下是不是这个错误造成的...
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 6 2006-7-13 16:35
3
0
呵呵,莫不是behook.exe真的留了一手,用GetProcAddress

用上述代码HOOK behook.exe的其他函数可以通过吗?
游客
登录 | 注册 方可回帖
返回