首页
社区
课程
招聘
[分享]最简单API HOOK DEMO
发表于: 2008-12-19 17:21 5780

[分享]最简单API HOOK DEMO

2008-12-19 17:21
5780
#include <stdio.h>
#include <windows.h>

typedef VOID (WINAPI *proc_ExitProcess)(IN UINT uExitCode);

proc_ExitProcess g_ExitProcess;

VOID WINAPI Hook_ExitProcess(IN UINT uExitCode)
{
        MessageBox(0, "Hook_ExitProcess", "hello hook", 0);
        g_ExitProcess(uExitCode);
}

int main(int argc, char* argv[])
{
        PIMAGE_DOS_HEADER imgDosHdr = (PIMAGE_DOS_HEADER)GetModuleHandle(NULL);
        PIMAGE_NT_HEADERS imgNtHdr = (PIMAGE_NT_HEADERS)((PBYTE)imgDosHdr + imgDosHdr->e_lfanew);
        PIMAGE_IMPORT_DESCRIPTOR importDes = (PIMAGE_IMPORT_DESCRIPTOR)((PBYTE)imgDosHdr + imgNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
        //对导入表进行检索
        printf("import table %8x %d\n", importDes, imgNtHdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size);
        for (; importDes->Name; importDes++)
        {
                //加载模块列表
                PCHAR modName = (PCHAR)imgDosHdr + importDes->Name;
                printf("%s %08x\n", modName, (PCHAR)imgDosHdr + importDes->OriginalFirstThunk);
                if (strnicmp(modName, "kernel32", 8) == 0)
                {
                        //指向一个IMAGE_THUNK_DATA的数据表
                        PIMAGE_THUNK_DATA orgTHunkData = (PIMAGE_THUNK_DATA)((PCHAR)imgDosHdr + importDes->OriginalFirstThunk);
                        PIMAGE_THUNK_DATA imgThunkData = (PIMAGE_THUNK_DATA)((PCHAR)imgDosHdr + importDes->FirstThunk);
                        for (; imgThunkData->u1.Function; imgThunkData++, orgTHunkData++)
                        {
                                //注意是imgThunkData是一个DWORD的联合数据结构
                                PIMAGE_IMPORT_BY_NAME impName = (PIMAGE_IMPORT_BY_NAME)((PCHAR)imgDosHdr + orgTHunkData->u1.AddressOfData);
                                if (strnicmp((PCHAR)impName->Name, "ExitProcess", 11) == 0)
                                {
                                        printf("%08x %d %s\n", imgThunkData->u1.Function, impName->Hint, impName->Name);
                                        g_ExitProcess = (proc_ExitProcess)imgThunkData->u1.Function;

                                        *(PULONG)(&imgThunkData->u1.Function) = (ULONG)Hook_ExitProcess;
                                }
                        }
                }
        }
        ExitProcess(0);        //测试HOOK_API
        return 0;
}

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
你怎么搞成全局的?XPSP2的数据执行保护会弹出来拦截,我用DLL加载成全局的,结果一拦截什么都弄不成!
2008-12-21 10:08
0
雪    币: 1233
活跃值: (907)
能力值: ( LV12,RANK:750 )
在线值:
发帖
回帖
粉丝
3
全局的貌似要用dll才行吧。你把dll注入到所有的进程,然后hook 看看,也许会成功的
DEP会弹出拦截???这个我机器上怎么没有出现???
2008-12-21 16:00
0
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
你的没弹出?HOOK API应该有IAT或JMP,JMP的修改DLL,而IAT修改的是EXE,修改EXE会弹出数据执行保护,当然我是SP2,有数据执行保护,你的没出现可能是没数据执行保护,或你关了它
2008-12-22 10:14
0
游客
登录 | 注册 方可回帖
返回
//