INLINE HOOK过简单驱动保护的理论知识和大概思路
这里的简单驱动保护就是简单的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过简单驱动保护的理论知识和大概思路的更多相关文章
- 关于DDD领域驱动设计的理论知识收集汇总
原文:关于DDD领域驱动设计的理论知识收集汇总 最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一 ...
- [转]DDD领域驱动设计基本理论知识总结
领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity i ...
- DDD领域驱动设计基本理论知识总结
领域驱动设计之领域模型 加一个导航,关于如何设计聚合的详细思考,见这篇文章. 2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity i ...
- DDD领域驱动设计基本理论知识总结(转)
领域驱动设计之领域模型 为什么建立一个领域模型是重要的 领域通用语言(UBIQUITOUS LANGUAGE) 将领域模型转换为代码实现的最佳实践 领域建模时思考问题的角度 领域驱动设计的经典分层架构 ...
- 过 DNF TP 驱动保护(一)
过 DNF TP 驱动保护(一) 文章目录: 01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...
- SSDT Hook实现简单的进程隐藏和保护【转载】
原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...
- 在已有软件加壳保护 下实现 Inline hook
如写的不好请见谅,本人水平有限. 个人简历及水平:. http://www.cnblogs.com/hackdragon/p/3662599.html 正常情况: 接到一个项目实现对屏幕输出内容的获取 ...
- 过 DNF TP 驱动保护(二)
过 DNF TP 驱动保护(二) 文章目录: 01. 博文简介: 02. 环境及工具准备: 03. 分析 TP 所做的保护: 04. 干掉 NtOpenProc ...
- [转] DDD领域驱动设计(三) 之 理论知识收集汇总
最近一直在学习领域驱动设计(DDD)的理论知识,从网上搜集了一些个人认为比较有价值的东西,贴出来和大家分享一下: 我一直觉得不要盲目相信权威,比如不能一谈起领域驱动设计,就一定认为国外的那个Eric ...
随机推荐
- Numbers(CodeForces-128D)【思维/list】
题目链接:https://vjudge.net/problem/CodeForces-128D 题意:给出一组数,要求将这些数排列成一个环,满足每相邻两个数的差值为1,问能否完成. 思路:先取出最小的 ...
- 20190716-Python网络数据采集/第 2 章 复杂HTML解析
# P29/9# 解析,要考虑到可持续性问题,对方反爬修改后,仍继续有效,方为优秀代码# 解析一个目标网页前,需要做到以下几点:(1)明确目标内容:(2)寻找“打印此页”的链接,或查看网站有无HTML ...
- ThreadLocal使用场景,原理
ThreadLocal 1. 先说下 ThreadLocal不能解决多线程间共享数据,他是一个隔离多线程间共享数据的好帮手 2. ThreadLocal是本地线程共享数据 3. 他是以空间换时间 sy ...
- DFA与动态规划
1.牛客练习赛45 A 给定字符串, 求字符不相邻的"QAQ"子序列个数. $dp[i][0]$ 只匹配一个'Q'的方案数的前缀和. $dp[i][1]$ 只匹配"QA& ...
- 数据库优化方案之SQL脚本优化
随着数据库数据越来越大,数据单表存在的数据量也就随之上去了,那么怎么样让我们的脚本查询数据更快呢? 在这个地方我们主要提到两个数据库类型: 1.MSSQL(该数据库我们通过执行计划来查看数据库性能在哪 ...
- php 压缩接口
function rtnJson($obj) { if (!headers_sent() && // 如果页面头部信息还没有输出 extension_loaded("zlib ...
- C++反汇编第二讲,反汇编中识别虚表指针,以及指向的虚函数地址
讲解之前,了解下什么是虚函数,什么是虚表指针,了解下语法,(也算复习了) 开发知识为了不码字了,找了一篇介绍比较好的,这里我扣过来了,当然也可以看原博客链接: http://blog.csdn.net ...
- 电脑无法上网,DNS出现fec0:0:0:ffff::1%1问题
具体描述:qq,微信可用网,但其他不能用. 一.win+r 输入cmd 打开命令行:ipconfig /all 查看DNS 二.打开文本编辑器,输入如下文本: @Echo onpushd\window ...
- java Calendar Date 获取指定日期所在月或年的第一天和最后一天
一.获取传入日期所在月的第一天 public static Date getFirstDayDateOfMonth(final Date date) { final Calendar cal = Ca ...
- jq国际化i18n
1.(main.js或)ajax.js引入文件 import './jquery.i18n.properties.min' //https://github.com/jquery-i18n-prope ...