博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Process Hacker源码中的用户态hook的做法
阅读量:2394 次
发布时间:2019-05-10

本文共 2358 字,大约阅读时间需要 7 分钟。

本篇文章主要介绍了"Process Hacker源码中的用户态hook的做法 ",主要涉及到Process Hacker源码中的用户态hook的做法 方面的内容,对于Process Hacker源码中的用户态hook的做法 感兴趣的同学可以参考一下。

processhacker-code-5632\1.x\trunk\NProcessHacker\hook.h

typedef struct _PH_HOOK{    PVOID Function;    PVOID Target;    BOOLEAN Hooked;    CHAR Bytes[5];} PH_HOOK, *PPH_HOOK;

这个结构体用来保存每个Hook的信息,Function是hook点的地址, Target是Trampoline的地址,Bytes用来备份Function点处原来的5个字节。

processhacker-code-5632\1.x\trunk\NProcessHacker\hook.c

VOID PHAPI PhInitializeHook(    PPH_HOOK Hook,    PVOID Function,    PVOID Target    ){    memset(Hook, 0, sizeof(PH_HOOK));    Hook->Function = Function;    Hook->Target = Target;}

初始化Hook结构体,指定hook点与Trampoline的地址。

NTSTATUS PHAPI PhHook(    PPH_HOOK Hook    ){    NTSTATUS status = STATUS_SUCCESS;    ULONG oldProtection;    PCHAR function;    /* Change the page protection of the target page so we can write to it. */    if (!VirtualProtect(Hook->Function, 5, PAGE_EXECUTE_READWRITE, &oldProtection))        return STATUS_ACCESS_VIOLATION;    __try    {        function = (PCHAR)Hook->Function;        /* Copy the original five bytes for unhooking. */        memcpy(Hook->Bytes, function, 5);        /* Hook the function by writing a jump instruction. */        Hook->Hooked = TRUE;        /* jmp Target */        *function = 0xe9;        *(PULONG_PTR)(function + 1) = (ULONG_PTR)Hook->Target - (ULONG_PTR)Hook->Function - 5;    }    __except (EXCEPTION_EXECUTE_HANDLER)    {        status = GetExceptionCode();    }    /* Restore the old page protection. */    VirtualProtect(Hook->Function, 5, oldProtection, NULL);    return status;}

用于完成对Hook点的5个字节的替换,替换成e9 XXXXXXXX[Trampoline与Hook点之间的偏移距离]。

NTSTATUS PHAPI PhUnhook(    PPH_HOOK Hook    ){    NTSTATUS status = STATUS_SUCCESS;    ULONG oldProtection;    /* Change the page protection of the target page so we can write to it. */    if (!VirtualProtect(Hook->Function, 5, PAGE_EXECUTE_READWRITE, &oldProtection))        return STATUS_ACCESS_VIOLATION;    __try    {        /* Unpatch the function by restoring the original first 5 bytes. */        memcpy(Hook->Function, Hook->Bytes, 5);        Hook->Hooked = FALSE;    }    __except (EXCEPTION_EXECUTE_HANDLER)    {        status = GetExceptionCode();    }    /* Restore the old page protection. */    VirtualProtect(Hook->Function, 5, oldProtection, NULL);    return status;}

Unhook的过程恰好相反,用备份的5个字节恢复Hook点。

转载地址:http://aehab.baihongyu.com/

你可能感兴趣的文章
高性能IO设计的Reactor和Proactor模式
查看>>
Bridge模式学习
查看>>
Virtual的一些总结
查看>>
Fedora13上折腾了下ACE
查看>>
tomcat keepAliveTimeout=0问题
查看>>
JDK1.6在SUSE11下问题跳变定时任务失效问题记录
查看>>
400 Bad request 一例
查看>>
linux文件锁定
查看>>
fedora4上安装gcc2.9,编译安装rainbow过程
查看>>
求质数算法的N种境界 (N > 10)
查看>>
一个简单的linux下原生socket的tcp程序及其修改
查看>>
图解USB安装Ubuntu Server10.04.3
查看>>
《编程珠玑》学习总结1—bitmap
查看>>
SHELL脚本并发问题一则记录
查看>>
面试题总结——位的一些东西
查看>>
LD_LIBRARY_PATH设置不当导致的自动安装失败
查看>>
2012微软暑期实习笔试
查看>>
int_size_is_32(),判断int是否为32位
查看>>
2012百度实习生笔试
查看>>
《编程珠玑》学习总结2-变位词
查看>>