API挂接的一个例子

测试DLL的函数

APIHookDll.dll

 

void __stdcall PrintfHelloWorld()
{
 printf("Hello World");
}

 

APIHook.exe代码

#include <Windows.h>
//#include <Dbghelp.h>
#include <ImageHlp.h>
#include <WINNT.H>
#include "APIHookDll.h"
#pragma comment(lib, "ImageHlp")

void ReplaceIAEntryInOneMod(const char *pCallModeName, PROC pfnCurrent, PROC pfnReplaceFun, HMODULE hmodCaller)
{
 ULONG ulSize = 0;
 PIMAGE_IMPORT_DESCRIPTOR pImage = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToDataEx(hmodCaller, TRUE,
          IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize, NULL);
 if (!pImage)
 {
  return;
 }

 for (; pImage->Name; pImage++)
 {
  char *pFunName = (char *)((PBYTE) hmodCaller + pImage->Name);
  if ( strcmp( pCallModeName, pFunName) == 0 )
  {
   break;
  }
 }

 if ( NULL == pImage->Name)
 {
  return;
 }

 PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ( ((PBYTE) hmodCaller) + pImage->FirstThunk );
 for (; pThunk->u1.Function; pThunk++)
 {
  PROC *pfnExport = (PROC *) &(pThunk->u1.Function);
  BOOL bFound = (*pfnExport == pfnCurrent);
  if (bFound)
  {
   WriteProcessMemory(GetCurrentProcess(), pfnExport, &pfnReplaceFun, sizeof(pfnReplaceFun), NULL);

   return;
  }
 }
}

void PrintfHelloJYY()
{
 printf("Hello JYY /r/n");
}

int _tmain(int argc, _TCHAR* argv[])
{
 
 HMODULE hTestModule = GetModuleHandleW(L"APIHook.exe");
 PROC fnCurrent = GetProcAddress(GetModuleHandleW(L"APIHookDll.dll"), _T("PrintfHelloWorld"));

 if (!hTestModule)
 {
  return 1;
 }
 ReplaceIAEntryInOneMod("APIHookDll.dll", fnCurrent, (PROC) PrintfHelloJYY, hTestModule);
 PrintfHelloWorld();
 (*fnCurrent)();

 getchar();
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值