覆盖地址HOOK API

前天看到kruglinski的一段程序,我看了一下今天花了一下午的时间来自己实现了一个。不过我的没有用动态地址的方法,而是自己去写了静态的地址到里面灵活性没有他的大不过功能上面还是差不多的。下面我简单讲一下我的原理。

跳转的具体原理
就是用两句汇编句:

   mov eax , 12345678   (自定义函数的地址,每个机器各不相同是需要手动调整)
   jmp eax

汇编代码:

e8 78 56 34 12  //第2,3,4,5是需要手工调整的
ff e0

1。计算出地址“冒名顶替函数”的入口地址。
2。得要HOOK的API函数的地址。
3。保存API函数的入口内容。
4。修改API函数的入口内容。
5。再在“冒名顶替函数”里面实现完其他功能后,把原来的API函数的入口内容给回去。

代码如下:

//
//write by Gxter
//
//通过覆盖系统函数的地址来实现HOOK API
//
#include "stdio.h"
#include "windows.h"
#include "tchar.h"


BYTE addr_old[8] = {0};
BYTE addr_new[8] = { 0xB8, 0x20, 0x10, 0x40, 0x00, 0xFF, 0xE0, 0x00 }; //第2,3,4,5是需要手工调整的(重要的步骤)
DWORD pfnMsgBox=0;  //API函数地址


int WINAPI MessageBoxProxy(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType)
{
int ret = 0;

  DWORD dwOldProtect;
  MEMORY_BASIC_INFORMATION    mbi;

  ::VirtualQuery((void *)pfnMsgBox, &mbi, sizeof(mbi));
  ::VirtualProtect((void *)pfnMsgBox, 8, PAGE_READWRITE, &dwOldProtect);

  // 写入原来的执行代码
  ::WriteProcessMemory(::GetCurrentProcess(),
        (void *)pfnMsgBox,
        addr_old,
        sizeof(DWORD)*2,
        NULL);

  ::VirtualProtect((void *)pfnMsgBox, 8, mbi.Protect, 0);

ret=MessageBox(hWnd,"gxter","gxter",uType);

return ret;
}

//----------------------------------------------程序入口
int main()
{
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION    mbi;

MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);
pfnMsgBox=(DWORD)GetProcAddress(GetModuleHandle(_T("user32.dll")),_T("MessageBoxA"));
printf("api入口地址: %x/n",pfnMsgBox);


VirtualQuery( (void *)pfnMsgBox, &mbi, sizeof(mbi) );
//修改我们要改的地址的页属性,为可读可写
VirtualProtect( (void *)pfnMsgBox, 8, PAGE_READWRITE, &dwOldProtect);

// 保存原来的执行代码
memcpy(addr_old, (void *)pfnMsgBox, 8);

// 写入新的执行代码
WriteProcessMemory(   GetCurrentProcess(),
        (void *)pfnMsgBox,
              addr_new,
        sizeof(DWORD)*2,
        NULL);
//修改为原来的属性属性
VirtualProtect((void *)pfnMsgBox, 8, mbi.Protect, 0);

//当调用这个函数的时候就跳到我的函数上面了
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);


getchar();
return 0;
}

//--------------------------------the  end-----------------------------


用心飞翔!
 
Gxter
版主



发贴 255
积分 5
注册 2004-11-19
状态 离线
[2 楼] Posted:2006-1-25 06:26 PM                 编辑  报告 
关于这个文章后来人私下里问我,那个地址是怎么回事!

这是我在写《覆盖地址HOOK API》这个学习笔记的同时写的另一篇东西。

《自定义函数和API函数的跳转》

//
//write by Gxter
//
//title:自定义函数的跳转过程,和API函数的跳转过程
//
//说明:程序里面的地址是每个机器都不尽相同的,但道理都是一样的。

#include "stdio.h"
#include "windows.h"

void fun();  

int main()
{
fun();

getchar();
return 0;
}

void fun()
{
printf("write by Gxter!");
}

//自定义函数的跳转是程序中的跳转指令,然后由跳转指令跳转到函数的执行体。
/*

1。主程序中:00401038   E8 C8 FF FF FF     call    @ILT+0(_fun) (00401005)

2。跳转指令:00401005   E9 B6 00 00 00     jmp    fun (004010c0)

3。函数执行体:004010C0 55                 push   ebp

//自定义函数是根据地址直接跳转

*/

//-----------------------------------the end------------------------------------------

//
//write by Gxter
//
//title:自定义函数的跳转过程,和API函数的跳转过程
//
//说明:程序里面的地址是每个机器都不尽相同的,但道理都是一样的。


#include "stdio.h"
#include "tchar.h"
#include "windows.h"

int main()
{
MessageBox(NULL,_T("Hook Demo!"),_T("API Hook"),MB_ICONINFORMATION);

getchar();
return 0;
}


//API函数调用过程
/*

1。主程序中:00401038 FF 15 94 52 42 00    call   dword ptr [__imp__MessageBoxA@16 (00425294)]
  地址004252B4中的内容  "6544  77E1"
(是根据地址的内容里面的地址跳转)
  
2。API函数的执行体:77E16544 55            push        ebp

*/

//--------------------------------the end------------------------------------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值