API Hook基本原理和实现

http://tech.ddvip.com   2008年01月10日    社区交流

内容摘要:将网络上几篇有代表性的api hook文章的精华进行了浓缩和适当简化,写成这篇介绍性文章。另外也希望初学者能够认真思考本文采用的循序渐进的分析思路,如何解决了一个未知的问题。文中借鉴的文献资料列于文末附录一节。

  dll基本文件:Hook.h,Hook.cpp,HookDll.def

  client验证方基本文件:HookTest.h,HookTest.cpp,ApiHookTest.cpp

API Hook基本原理和实现  

API Hook基本原理和实现

  6、  实现的功能

  对记事本的MessageBoxW函数进行了hook,先执行自定义的

int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR M1, LPCWSTR M2, UINT M3)
{
  return oldMessageBoxW(hWnd, M1, L"my api hook", M3);
}

  从这里可以看到,由于目标进程空间中的执行线程并不知道你已经改变了api函数的实际入口地址,它在调用时仍旧将参数一成不变的压入堆栈(这个说法是汇编代码时看到的等价情形),事实上你已经提前接收到了函数调用的所有参数。这里就是篇首帖子的回复了。

API Hook基本原理和实现  

  hook之前

API Hook基本原理和实现  

  hook以后

  示例代码

  1、client验证方的代码非常简单。建立一个Application工程,在窗体上放一个memo(提示信息),两个button(一个SetHook,另一个RemoveHook)。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  DWORD dwProcessId, dwThreadID;
  HWND hWnd = FindWindow("Notepad", NULL);
  if (!hWnd)
  {
    Memo1->Lines->Add("Nodepad is not found");
  }
  else
  {
    dwThreadID = GetWindowThreadProcessId(hWnd, &dwProcessId);
    Memo1->Lines->Add(dwThreadID);
    SetHook(dwThreadID);
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  RemoveHook();
}
//---------------------------------------------------------------------------

  2、api hook dll稍微复杂些,建立一个dll工程之后,修改之。代码中有一些函数并未用上,ReplaceApiAddress是核心函数,文章开始处有示例代码下载。

来源:www.ccrun.com    作者:wskjuf    责编:豆豆技术应用

正在加载评论...