这里的简单驱动保护就是简单的HOOK掉内核API的现象

找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节。5个字节就是一个简单的JMP指令。这里说一下JMP指令,如下:

001 JMP 002 这样我们就会跳到

001 (在此地址写入JMP指令)+ 002(我们要写入的JMP操作数) +5(jmp指令的字节数)这里、

就是说如果你要跳回NtOpenProcess的原地址,就应该向被HOOK后的地址处写入这样的指令   JMP ( NtOpenProcess的原地址-被HOOK后的地址 - 5 )

为什么要减5呢?

这么考虑,原地址为0,现在HOOK后为10,当你在HOOK的地址处写处JMP 0后,IP到15到了,所以要减5

不是很乱思路清晰一些就明白了:

这里有一个修改页面保护属性的过程。这里有以下几种方法:

1  修改注册表相应的键值这样改

HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\

EnforceWriteProtection=0

HKLM\SYSTEM\CurrentControlset\Control\SessionManger\MemoryManagement\

DisablePagingExecutive=1

2 一个寄存器cr0,32位寄存器、

它的第17位(WP位)如果为1、表示开启页面保护0则是去掉页面保护、

__asm    //去掉页保护

{

Cli  //表示将处理器标志寄存器的中断标志位清0,不允许中断

mov eax,cr0

and eax,not 10000h //and eax,0FFFEFFFFh

mov cr0,eax

}

__asm    //恢复页保护

{

mov eax,cr0

or  eax,10000h //or eax,not 0FFFEFFFFh

mov cr0,eax

sti

}

3通过内核API函数Memory Descriptor List(MDL)-正规做法    通过它来描述某一块内存可读或可写

现在说一下写入JMP指令注意的知识点、、、

1  汇编写入

2  指针写入  将其定义成一个结构体如下

typedef struct _JMPCODE

{

BYTE  Jmp_Code;

ULONG  Jmp_Addr;

}JMPCODE,*PJMPCODE;

(这里就需要 修改对齐方式   #pragma pack(1)     ......  恢复#pragma pack())

对齐标志改为1  本来是4,如果是4偏移就要加8,本来我们是加5的。

部分代码如下

PJMPCODE Real_Jmp;//将要写的jmp xxx指令

JMPCODE   Save_Jmp;//保护改成之前的5个字节的内容

Cur_ADDR = GetSSDT_Cur_ADDR();//获取当前的SSDT中函数的地址

Old_ADDR = GetSSDT_Old_ADDR(); //获取函数原地址

if (Cur_ADDR  !=  Old_ADDR)   //说明被HOOK了

{

//先保存要替换的5个字节的内容

Real_Jmp = (PJMPCODE) Cur_ADDR;

Save_Jmp. Jmp_Code  =  Real_Jmp -> Jmp_Code;

Save_Jmp. Jmp_Addr  =  Real_Jmp -> Jmp_Addr;

__asm    //去掉页保护

{

Cli  //表示将处理器标志寄存器的中断标志位清0,不允许中断

mov eax,cr0

and eax,not 10000h //and eax,0FFFEFFFFh

mov cr0,eax

}

Real_Jmp-> Jmp_Code =E9;//E9就是jmp的机器码

Real_Jmp-> Jmp_Addr = Old_ADDR - Cur_ADDR -5;  //这两条代码就是INLINE  HOOK的核心代码

__asm    //恢复页保护

{

mov eax,cr0

or  eax,10000h

mov cr0,eax

sti

}

}

在Unload里恢复如下也需要更改页面保护

然后反写之前保护时的语句即可

Real_Jmp-> Jmp_Code = Save_Jmp. Jmp_Code;

Real_Jmp-> Jmp_Addr = Save_Jmp. Jmp_Addr; //恢复原地址处的指令

思路大致这样,不是很难理解。

INLINE HOOK过简单驱动保护的理论知识和大概思路的更多相关文章

  1. 关于DDD领域驱动设计的理论知识收集汇总

    原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...

  2. [转]DDD领域驱动设计基本理论知识总结

    领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity i ...

  3. DDD领域驱动设计基本理论知识总结

    领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity i ...

  4. DDD领域驱动设计基本理论知识总结(转)

    领域驱动设计之领域模型 为什么建立一个领域模型是重要的 领域通用语言(UBIQUITOUS LANGUAGE) 将领域模型转换为代码实现的最佳实践 领域建模时思考问题的角度 领域驱动设计的经典分层架构 ...

  5. 过 DNF TP 驱动保护(一)

    过 DNF TP 驱动保护(一)   文章目录:                   01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...

  6. SSDT Hook实现简单的进程隐藏和保护【转载】

    原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...

  7. 在已有软件加壳保护 下实现 Inline hook

    如写的不好请见谅,本人水平有限. 个人简历及水平:. http://www.cnblogs.com/hackdragon/p/3662599.html 正常情况: 接到一个项目实现对屏幕输出内容的获取 ...

  8. 过 DNF TP 驱动保护(二)

    过 DNF TP 驱动保护(二)   文章目录:                   01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...

  9. [转] DDD领域驱动设计(三) 之 理论知识收集汇总

    最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...

随机推荐

  1. 剑指offer23:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。输出Yes OR No。

    1 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 2 思路和方法 二叉搜索树:二叉查找树(Bin ...

  2. session和cookie区别,多台WEB服务器如何共享session,禁用COOKIE后SESSION是否可用,为什么?

    答:session的运行机制: 用户A访问站点Y,如果站点Y指定了session_start();(以下假设session_start()总是存在)那么会产生一个session_id,这个sessio ...

  3. springboot application.properties配置大全

    springboot application.properties配置大全 官方文档 https://docs.spring.io/spring-boot/docs/current/reference ...

  4. C#应用笔记

    1.ref关键字.out关键字——引用传递参数 2.什么时候用DateReader,什么时候用DateSet呢? 3.is操作符.as操作符的使用 4.Eval方法和Bind方法的区别 5.Serve ...

  5. Eclipse MyEclipse 反编译.class文件 myeclipse source not found

    首先,需要下载两个必须的插件包. 一个是:准备反编译需要的jad.exe 下载地址:http://varaneckas.com/jad/ 二个是:反编译编辑器net.sf.jadclipse_3.3. ...

  6. 小知识:修改IDEA的模板

    小知识:修改IDEA的模板 有时候我们会发现,IDEA默认创建的模板并不是我们常用的.与其每次都在创建后进行修改,不如直接对模板进行修改. 给不知道怎么修改的同学指一下路: File->sett ...

  7. 关于SpringMVC的几件小事

    一.SpringMVC表单标签He处理静态资源 1.Spring的表单标签 通过SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷编辑和表单值的回显. ...

  8. java中数组的定义

    1. 一维数组 int[] arr = new int[3];//需要一个容器,但是暂时不给具体的数值 int[] arr = new int[3]{1,2,3};//直接给定具体数值 int[] a ...

  9. oracle索引查询

    /*<br>* *查看目标表中已添加的索引 * */ --在数据库中查找表名 select * from user_tables where  table_name like 'table ...

  10. 使用代码将github仓库里某个issue同步到CSDN博客上

    我是一个懒惰的程序员.我在github仓库里用issue的方式写了很多分享文章,想同步到CSDN上.但是我又不想一篇篇手动复制粘贴,因此想用代码来实现自动化. 例子: https://github.c ...