标题:通过覆盖系统函数的地址来实现HOOK API 中的MessageBoxProxy函数哪里被使用 ...
取消只看楼主
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
已结贴  问题点数:15 回复次数:4 
通过覆盖系统函数的地址来实现HOOK API 中的MessageBoxProxy函数哪里被使用了 ?
程序代码:
//
//write by Gxter
//
//通过覆盖系统函数的地址来实现HOOK API
//
#include "stdio.h"
#include "windows.h"
#include "tchar.h"

// "崩溃函数绝对地址"指00401020
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;
   

    printf("%08x\n", MessageBoxProxy);

    ::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;
}
上面的代码好像没有使用函数 MessageBoxProxy ,但是把这个函数去掉,又程序运行错误,不知道为什么 ?
搜索更多相关主题的帖子: HOOK API 函数 系统 地址 
2010-08-08 15:08
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
回复 3楼 东海一鱼
我把函数MessageBoxProxy的名字改成别的好像程序也是好的,这个硬编码地址很奇怪呀,怎么就能刚刚制定到这个函数地址?

但是随便在源代码中增加新的一个函数,这个程序就挂了!

另外,我在MessageBoxProxy函数中把该函数的入口地址打印出来,也不是这个 00401020 呀?!


[ 本帖最后由 vfdff 于 2010-8-8 17:39 编辑 ]

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-08 17:27
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
回复 5楼 东海一鱼
很明显 API messageBox 入口地址 77d507ea 和我打印的地址0040100a不一致的!
 单步调试时显示的却真是 00401020 ,怎么和我printf显示的值不一致呢 ?



[ 本帖最后由 vfdff 于 2010-8-8 20:16 编辑 ]

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-08 20:12
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
成Release编译的话,00401020也挂了,需要改成00401000 !


[ 本帖最后由 vfdff 于 2010-8-9 22:54 编辑 ]

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-09 22:51
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
是的,只顾问问题,差点把本质的问题给弄丢了
结果大家的指点与自己的实际测试,我知道这个地址并没有什么特别的地方,只是凑上去的而已

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2010-08-11 23:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-315129-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.076601 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved