HOOK WINDOWS API 一例

 
// godll.cpp : 定义 DLL 应用程序的入口点。
//

#include "stdafx.h"
#include 
 
 
  
  
#pragma   comment(lib,"ImageHlp.lib")

 

#pragma data_seg(".mydata")
POINT g_point;
int g_px=-1;
int g_py=-1;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.mydata,rws")

HANDLE g_hInstance = NULL;
PROC bak_addr = NULL;

 

 
BOOL WINAPI MyGetCursorPos(
  LPPOINT lpPoint   // address of structure for cursor position
  ){
   if(g_px == -1 ){
    typedef BOOL (WINAPI *OldGetCursorPosFun)(LPPOINT);
    OldGetCursorPosFun ofun = (OldGetCursorPosFun)bak_addr;
    ofun(lpPoint);
   }else{
    lpPoint->x = g_px;
    lpPoint->y = g_py;
   }

   return TRUE;
}

 


extern "C" __declspec(dllexport)
void GetPoint(LPPOINT p){
 p->x = g_px;
 p->y = g_py;
}


extern "C" __declspec(dllexport)
void SetPoint(LPPOINT p){
 g_px = p->x;
 g_py = p->y;
}

 

 


//hook api
//PCSTR modelStr : model 名称. 如 NULL 、 objsys.dll
//PCSTR byHookDllStr: model 内的 dll 名称. 如User32.dll
//PCSTR byHookFunStr: 被hook api 的名称
//PROC pfnNew  : 替代函数的地址
//返回旧函数 的址。
//extern "C" __declspec(dllexport)
PROC HookApi(PCSTR modelStr , PCSTR byHookDllStr , PCSTR byHookFunStr , PROC pfnNew){

 //读取 model 基地址
 LPVOID base = (LPVOID)GetModuleHandleA(modelStr);
 if(base == NULL){
  //MessageBoxA(NULL,"find model base addr err!",modelStr,0);
        return NULL;
 }
 
 //找到该 dll 的IAT
 ULONG ulSize;
 PIMAGE_IMPORT_DESCRIPTOR pImportTable = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToData(base,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&ulSize);

 if( pImportTable == NULL ){
  MessageBox(NULL,L"pImportTable is null",NULL,0);
        return NULL;
 }

 //在 ImportTable 中 找到需要  hook 的 dll
    for(;pImportTable->Name;pImportTable++){
        PSTR pszModName = (PSTR) ( (PBYTE)base + pImportTable->Name );
        if( lstrcmpiA( pszModName, byHookDllStr ) == 0 )
   break ; // if found
    }

 if( pImportTable->Name == 0 ){
  MessageBoxA(NULL,"not found by hook dll. ",byHookDllStr,0);
        return NULL;
    }

 PIMAGE_THUNK_DATA pOrigThunk = (PIMAGE_THUNK_DATA)((PBYTE)base + pImportTable->OriginalFirstThunk);
 PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ( (PBYTE)base + pImportTable->FirstThunk );
    for( ;pThunk->u1.Function;pThunk++,pOrigThunk++){
  PROC *ppfnEntry = (PROC*) &(pThunk->u1.Function);
  PROC bak = (PROC)(*ppfnEntry);

  PIMAGE_IMPORT_BY_NAME pByName =(PIMAGE_IMPORT_BY_NAME)((PBYTE)base + pOrigThunk->u1.AddressOfData);
  if(lstrcmpiA((char*)pByName->Name , byHookFunStr) == 0) {

   MEMORY_BASIC_INFORMATION memInfo; 
   VirtualQuery( ppfnEntry, &memInfo, sizeof( memInfo ));

   DWORD dwOldProtect = 0;
   if(VirtualProtect(memInfo.BaseAddress,memInfo.RegionSize,PAGE_READWRITE,&dwOldProtect)==0){
    MessageBox(NULL,L"VirtualProtect[1] is Err!",NULL,0);
    return NULL;
   }
    
   if(WriteProcessMemory(GetCurrentProcess(),ppfnEntry,&pfnNew,sizeof(pfnNew),NULL) == 0){
    MessageBox(NULL,L"WriteProcessMemory Err!",NULL,0);
   } 
    
   if(VirtualProtect(memInfo.BaseAddress,memInfo.RegionSize,PAGE_READONLY,&dwOldProtect )==0){
    MessageBox(NULL,L"VirtualProtect[2] is Err!",NULL,0);
   }  
 
   return bak;
        }  
    }

 //MessageBox(NULL,L"not found PIMAGE_THUNK_DATA",NULL,0);
 return NULL;
}

 

 


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  reason,
                       LPVOID lpReserved
      )
{

 switch (reason){

  case DLL_PROCESS_ATTACH:

   g_hInstance = hModule;
   if(bak_addr==NULL){
    bak_addr = HookApi("objsys","user32.dll","GetCursorPos",(PROC)MyGetCursorPos); 
    //bak_addr = HookApi(NULL,"user32.dll","GetCursorPos",(PROC)MyGetCursorPos); 
   }
    
   break;

  case DLL_PROCESS_DETACH:   //当 dll 卸载 时 需要恢复, 原 dll 功能地址
   if(bak_addr!=NULL){
    //HookApi(NULL,"user32.dll","GetCursorPos",bak_addr); 
    HookApi("objsys","user32.dll","GetCursorPos",bak_addr); 
    bak_addr = NULL;
   }
   break;
 }

 return TRUE;
}

 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值