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

  1. typedef struct _PH_HOOK
  2. {
  3. PVOID Function;
  4. PVOID Target;
  5. BOOLEAN Hooked;
  6. CHAR Bytes[5];
  7. } PH_HOOK, *PPH_HOOK;

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

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

  1. VOID PHAPI PhInitializeHook(
  2. PPH_HOOK Hook,
  3. PVOID Function,
  4. PVOID Target
  5. )
  6. {
  7. memset(Hook, 0, sizeof(PH_HOOK));
  8. Hook->Function = Function;
  9. Hook->Target = Target;
  10. }

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

  1. NTSTATUS PHAPI PhHook(
  2. PPH_HOOK Hook
  3. )
  4. {
  5. NTSTATUS status = STATUS_SUCCESS;
  6. ULONG oldProtection;
  7. PCHAR function;
  8.  
  9. /* Change the page protection of the target page so we can write to it. */
  10. if (!VirtualProtect(Hook->Function, 5, PAGE_EXECUTE_READWRITE, &oldProtection))
  11. return STATUS_ACCESS_VIOLATION;
  12.  
  13. __try
  14. {
  15. function = (PCHAR)Hook->Function;
  16. /* Copy the original five bytes for unhooking. */
  17. memcpy(Hook->Bytes, function, 5);
  18. /* Hook the function by writing a jump instruction. */
  19. Hook->Hooked = TRUE;
  20. /* jmp Target */
  21. *function = 0xe9;
  22. *(PULONG_PTR)(function + 1) = (ULONG_PTR)Hook->Target - (ULONG_PTR)Hook->Function - 5;
  23. }
  24. __except (EXCEPTION_EXECUTE_HANDLER)
  25. {
  26. status = GetExceptionCode();
  27. }
  28.  
  29. /* Restore the old page protection. */
  30. VirtualProtect(Hook->Function, 5, oldProtection, NULL);
  31.  
  32. return status;
  33. }

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

  1. NTSTATUS PHAPI PhUnhook(
  2. PPH_HOOK Hook
  3. )
  4. {
  5. NTSTATUS status = STATUS_SUCCESS;
  6. ULONG oldProtection;
  7.  
  8. /* Change the page protection of the target page so we can write to it. */
  9. if (!VirtualProtect(Hook->Function, 5, PAGE_EXECUTE_READWRITE, &oldProtection))
  10. return STATUS_ACCESS_VIOLATION;
  11.  
  12. __try
  13. {
  14. /* Unpatch the function by restoring the original first 5 bytes. */
  15. memcpy(Hook->Function, Hook->Bytes, 5);
  16. Hook->Hooked = FALSE;
  17. }
  18. __except (EXCEPTION_EXECUTE_HANDLER)
  19. {
  20. status = GetExceptionCode();
  21. }
  22.  
  23. /* Restore the old page protection. */
  24. VirtualProtect(Hook->Function, 5, oldProtection, NULL);
  25.  
  26. return status;
  27. }

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

Process Hacker源码中的用户态hook的做法的更多相关文章

  1. Eclipse与Android源码中ProGuard工具的使用

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  2. 访何红辉:谈谈Android源码中的设计模式

    最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计 ...

  3. Android 源码中的设计模式

    最近看了一些android的源码,发现设计模式无处不在啊!感觉有点乱,于是决定要把设计模式好好梳理一下,于是有了这篇文章. 面向对象的六大原则 单一职责原则 所谓职责是指类变化的原因.如果一个类有多于 ...

  4. Eclipse与Android源码中ProGuard工具的使用(代码混淆)

    由于工作需要,这两天和同事在研究android下面的ProGuard工具的使用,通过查看android官网对该工具的介绍以及网络上其它相关资料,再加上自己的亲手实践,算是有了一个基本了解.下面将自己的 ...

  5. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  6. Spring Boot源码中模块详解

    Spring Boot源码中模块详解 一.源码 spring boot2.1版本源码地址:https://github.com/spring-projects/spring-boot/tree/2.1 ...

  7. 002-创建型-04-建造者模式(Builder)、JDK1.7源码中的建造者模式、Spring中的建造者模式

    一.概述 建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象 ...

  8. 07 flask源码剖析之用户请求过来流程

    07 Flask源码之:用户请求过来流程 目录 07 Flask源码之:用户请求过来流程 1.创建ctx = RequestContext对象 2. 创建app_ctx = AppContext对象 ...

  9. 挖掘隐藏在源码中的Vue技巧!

    前言 最近关于Vue的技巧文章大热,我自己也写过一篇(vue开发中的"骚操作"),但这篇文章的技巧是能在Vue的文档中找到蛛丝马迹的,而有些文章说的技巧在Vue文档中根本找不到踪迹 ...

随机推荐

  1. js 判断对象的长度

    Object.size = function(obj) { var size = 0, key; for (key in obj) { if (obj.hasOwnProperty(key)) siz ...

  2. Java + selenium 元素定位(4)之By CSS

    这篇我要介绍元素定位的倒数第二个方法啦,就是基于CSS的元素定位.关于一些CSS的知识,我这里就不累赘的讲了,以后可能会单独写一篇关于CSS的介绍.当然个人推荐如果之前完全没有CSS只是储备的,可以选 ...

  3. WEBRTC三种类型(Mesh、MCU 和 SFU)的多方通信架构

    WebRTC 本身提供的是 1 对 1 的通信模型,在 STUN/TURN 的辅助下,如果能实现 NAT 穿越,那么两个浏览器是可以直接进行媒体数据交换的:如果不能实现 NAT 穿越,那么只能通过 T ...

  4. SetViewportOrgEx和SetWindowOrgEx

    在MM_TEXT映射模式下使用这两个函数. 对于 BOOL SetViewportOrgEx( HDC hdc, // 设备内容HANDLE int X, // 新Viewport的x坐标 int Y ...

  5. Springboot2.x整合Redis(一)

    备注: springboto整合redis依赖于spring-boot-starter-data-redis这个jar 一,项目环境和依赖 1.POM.xml配置 <parent> < ...

  6. is not an enclosing class

    public class A {public class B { }}; 需要实例B类时,按照正逻辑是,A.B ab = new A.B();那么编译器就会出现一个错误–“is not an encl ...

  7. XMPP即时通讯协议使用(十)——好友关系状态

    sub  ask  recv 订阅 询问 接受 含义 substatus -1-  应该删除这个好友          Indicates that the roster item should be ...

  8. elasticsearch 英文数字组合字符串模糊检索

    不分词,然后用wildcard查询 { "query": { "wildcard": { "字段名": "*123*" ...

  9. win10下RabbitMQ的安装和配置

    在win10环境下安装RabbitMQ的步骤 第一步:下载并安装erlang 原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang. 下载 ...

  10. 2018-8-10-win10-uwp-httpClient-登陆CSDN

    title author date CreateTime categories win10 uwp httpClient 登陆CSDN lindexi 2018-08-10 19:16:53 +080 ...