首页
社区
课程
招聘
[原创]简单hook api 的实现
发表于: 2009-4-8 15:05 8571

[原创]简单hook api 的实现

2009-4-8 15:05
8571

小菜最近在学习pe文件结构和windows编程 就写了如下代码 检验一下学习成果
////////////////////////////////////
//HookDemo.cpp文件

#include <windows.h>
#include <stdio.h>

// 挂钩指定模块hMod对MessageBoxA的调用
BOOL SetHookApi(HMODULE hMod);
// 定义MessageBoxA函数原型
typedef int (WINAPI *PFNMESSAGEBOX)(HWND, LPCSTR, LPCSTR, UINT uType);
// 保存MessageBoxA函数的真实地址
PROC g_orgProc = (PROC)MessageBoxA;

void main()
{
        // 调用原API函数
        ::MessageBox(NULL, "原函数", "HookDemo", 0);
        // 挂钩后再调用
        SetHook(::GetModuleHandle(NULL));

        ::MessageBox(NULL, "原函数", "HookDemo", 0);
}

// 用于替换MessageBoxA的自定义函数
int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
        return ((PFNMESSAGEBOX)g_orgProc)(hWnd, "新函数", "HookDemo", uType);
}

BOOL SetHookApi(HMODULE hMod)
{
        IMAGE_DOS_HEADER* pDosHeader = (IMAGE_DOS_HEADER*)hMod;
        IMAGE_OPTIONAL_HEADER * pOptHeader =
                (IMAGE_OPTIONAL_HEADER *)((BYTE*)hMod + pDosHeader->e_lfanew + 24);
       
        IMAGE_IMPORT_DESCRIPTOR* pImportDesc = (IMAGE_IMPORT_DESCRIPTOR*)
                ((BYTE*)hMod + pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
       
        // 在导入表中查找user32.dll模块。因为MessageBoxA函数从user32.dll模块导出
        while(pImportDesc->FirstThunk)
        {
                char* pszDllName = (char*)((BYTE*)hMod + pImportDesc->Name);
                if(lstrcmpiA(pszDllName, "user32.dll") == 0)
                {
                        break;
                }
                pImportDesc++;
        }

        if(pImportDesc->FirstThunk)
        {
               
                // 一个IMAGE_THUNK_DATA就是一个双字,它指定了一个导入函数
                // 调入地址表其实是IMAGE_THUNK_DATA结构的数组,也就是DWORD数组
                IMAGE_THUNK_DATA* pThunk = (IMAGE_THUNK_DATA*)
                                ((BYTE*)hMod + pImportDesc->FirstThunk);
                while(pThunk->u1.Function)
                {
                        // lpAddr指向的内存保存了函数的地址
                        DWORD* lpAddr = (DWORD*)&(pThunk->u1.Function);
                        if(*lpAddr == (DWORD)g_orgProc)
                        {       
                                DWORD dwOldProtect;
                                MEMORY_BASIC_INFORMATION mb;
                                VirtualQuery(lpAddr, &mb, sizeof(mb));
                                VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);
                                // 修改IAT表项,使其指向我们自定义的函数,相当于“*lpAddr = (DWORD)MyMessageBoxA;”
                                DWORD* lpNewProc = (DWORD*)MyMessageBoxA;
                                ::WriteProcessMemory(::GetCurrentProcess(),
                                                lpAddr, &lpNewProc, sizeof(DWORD), NULL);
                                VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, 0);
                                return TRUE;
                        }
                       
                        pThunk++;
                }
        }
        return FALSE;
}


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
纯友情支持....
小菜学习了..
2009-4-8 15:12
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
支持~~不过关于hook的文章都以实例居多,很想看到点不一样的内容~
2009-4-8 16:12
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
4
这HOOK有点简单了 直接学高级的  
Object HOOK 、SSDT HOOK 、inline Hook 、IDT HOOK 、IRP HOOK、 SYSENTER HOOK、 IAT HOOK 、EAT HOOK..............其实HOOK还是比较好学的,难学的就是未导出的..
2009-4-8 16:19
0
雪    币: 1024
活跃值: (240)
能力值: ( LV12,RANK:310 )
在线值:
发帖
回帖
粉丝
5
刚开始 从简单的做起
2009-4-8 16:20
0
雪    币: 148
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
听不懂这语言.
谁帮我翻译成VB.谢谢
2009-4-8 16:22
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
准备把自己写的一个Hook总结发出来~~
2009-4-8 18:18
0
雪    币: 170
活跃值: (90)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
8
本来我想写hook小结的,每一个都配上例子,哎.....最近比较忙,想很久搜集的也差不多就是没动笔  
2009-4-8 21:27
0
雪    币: 178
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
look 了下!
2009-4-16 14:16
0
雪    币: 178
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
我现在也再看这方面的东西,我要hook OpenProcess进行保护进程,你会弄这个么?可以的话给我发个邮件好么?ddlddy@163.com
2009-4-16 14:27
0
雪    币: 419
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
hook 得漂亮最舒服了
2009-4-16 15:33
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
是全局HOOK,还是本地HOOK?
2009-4-19 13:42
0
雪    币: 339
活跃值: (10)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
13
如果讲解一下如何hook比较好,只是实例在细节上不是很清楚
2009-4-19 18:59
0
游客
登录 | 注册 方可回帖
返回
//