Win64 驱动内核编程-31.枚举与删除映像回调
枚举与删除映像回调
映像回调可以拦截 RING3 和 RING0 的映像加载。某些游戏保护会用此来拦截黑名单中的驱动加载,比如 XUETR、WIN64AST 的驱动。同理,在反游戏保护的过程中,也可以拦截游戏驱动的加载。
跟进程/线程回调类似,映像回调也存储在数组里。这个数组的“符号名”是PspLoadImageNotifyRoutine。我们可以在 PsSetLoadImageNotifyRoutine 中找到它:
实现的代码如下:
ULONG64 FindPspLoadImageNotifyRoutine()
{
ULONG64 i=0,pCheckArea=0;
UNICODE_STRING unstrFunc;
RtlInitUnicodeString(&unstrFunc, L"PsSetLoadImageNotifyRoutine");
pCheckArea = (ULONG64)MmGetSystemRoutineAddress (&unstrFunc);
DbgPrint("PsSetLoadImageNotifyRoutine: %llx",pCheckArea);
for(i=pCheckArea;i<pCheckArea+0xff;i++)
{
if(*(PUCHAR)i==0x48 && *(PUCHAR)(i+1)==0x8d && *(PUCHAR)(i+2)==0x0d) //lea rcx,xxxx
{
LONG OffsetAddr=0;
memcpy(&OffsetAddr,(PUCHAR)(i+3),4);
return OffsetAddr+7+i;
}
}
return 0;
}
void EnumLoadImageNotify()
{
int i=0;
BOOLEAN b;
ULONG64 NotifyAddr=0,MagicPtr=0;
ULONG64 PspLoadImageNotifyRoutine=FindPspLoadImageNotifyRoutine();
DbgPrint("PspLoadImageNotifyRoutine: %llx",PspLoadImageNotifyRoutine);
if(!PspLoadImageNotifyRoutine)
return;
for(i=0;i<8;i++)
{
MagicPtr=PspLoadImageNotifyRoutine+i*8;
NotifyAddr=*(PULONG64)(MagicPtr);
if(MmIsAddressValid((PVOID)NotifyAddr) && NotifyAddr!=0)
{
NotifyAddr=*(PULONG64)(NotifyAddr & 0xfffffffffffffff8);
DbgPrint("[LoadImage]%llx",NotifyAddr);
}
}
}
执行结果如下:
用这三种回调(CreateProcess、CreateThread、LoadImage)来做监控其实并不怎么靠谱,因为系统里存在一个开关,叫做 PspNotifyEnableMask,如果它的值被设置为 0,那么所有的相关操作都不会经过回调。换句话说,如果 PspNotifyEnableMask等于 0,那么所有的进程、线程、映像回调都会失效。不过这个变量并没有在导出函数中直接出现,所以找到它略难。
宋孖健,13
Win64 驱动内核编程-31.枚举与删除映像回调的更多相关文章
- Win64 驱动内核编程-32.枚举与删除注册表回调
枚举与删除注册表回调 注册表回调是一个监控注册表读写的回调,它的效果非常明显,一个回调能实现在SSDT 上 HOOK 十几个 API 的效果.部分游戏保护还会在注册表回调上做功夫,监控 service ...
- Win64 驱动内核编程-30.枚举与删除线程回调
枚举与删除线程回调 进程回调可以监视进程的创建和退出,这个在前面的章节已经总结过了.某些游戏保护的驱动喜欢用这个函数来监视有没有黑名单中的程序运行,如果运行则阻止运行或者把游戏退出.而线程回调则通常用 ...
- Win64 驱动内核编程-33.枚举与删除对象回调
转载:http://www.voidcn.com/article/p-wulgeluy-bao.html 枚举与删除对象回调 对象回调存储在对应对象结构体里,简单来说,就是存储在 ObjectType ...
- Win64 驱动内核编程-28.枚举消息钩子
枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之 ...
- Win64 驱动内核编程-3.内核里使用内存
内核里使用内存 内存使用,无非就是申请.复制.设置.释放.在 C 语言里,它们对应的函数是:malloc.memcpy.memset.free:在内核编程里,他们分别对应 ExAllocatePool ...
- Win64 驱动内核编程-8.内核里的其他常用
内核里的其他常用 1.遍历链表.内核里有很多数据结构,但它们并不是孤立的,内核使用双向链表把它们像糖 葫芦一样给串了起来.所以遍历双向链表能获得很多重要的内核数据.举个简单的例子,驱 动对象 Driv ...
- Win64 驱动内核编程-7.内核里操作进程
在内核里操作进程 在内核里操作进程,相信是很多对 WINDOWS 内核编程感兴趣的朋友第一个学习的知识点.但在这里,我要让大家失望了,在内核里操作进程没什么特别的,就标准方法而言,还是调用那几个和进程 ...
- Win64 驱动内核编程-2.基本框架(安装.通讯.HelloWorld)
驱动安装,通讯,Hello World 开发驱动的简单流程是这样,开发驱动安装程序,开发驱动程序,然后安装程序(或者其他程序)通过通讯给驱动传命令,驱动接到之后进行解析并且执行,然后把执行结果返回. ...
- Win64 驱动内核编程-18.SSDT
SSDT 学习资料:http://blog.csdn.net/zfdyq0/article/details/26515019 学习资料:WIN64内核编程基础 胡文亮 SSDT(系统服务描述表),刚开 ...
随机推荐
- java 给时间增加时间得到一个新的时间(日期)
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd") LocalDate expirationDate String exp ...
- 使用wireshark 抓取 http https tcp ip 协议进行学习
使用wireshark 抓取 http https tcp ip 协议进行学习 前言 本节使用wireshark工具抓包学习tcp ip http 协议 1. tcp 1.1 tcp三次握手在wire ...
- 给出镜像FreeBSD 基本要求
硬盘 ports 500G update 500G portsnap 500G pkg arm64 amd64 i386 11-12-13 4TB 网络流量一个月专线大概2w RMB CPU 内存 其 ...
- 关于github的使用学习心得
先写先介绍一下如何用github上创建一个项目吧. 用户登录后的界面如上所示.右下角是我们已经建好的库.点击其中任何一个就可以查看相应的库了.如果要新建一个项目的话,就点击Start a projec ...
- Flutter学习简记
StatefulWidget和StatelessWidget StatefulWidget : 具有可变状态的窗口部件,也就是你在使用应用的时候就可以随时变化,比如我们常见的进度条,随着进度不断变化. ...
- CSS中的块级元素,行内元素,行内块元素
博客转载于:https://blog.csdn.net/swebin/article/details/90405950 块级元素 block 块级元素,该元素呈现块状,所以他有自己的宽度和高度,也就是 ...
- P1601_A+B Problem(高精)(JAVA语言)
思路:BigInteger first blood! //四行搞定 题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] ...
- [LeetCode]1. 两数之和(难度:简单)
题目: 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标.你可以假设每种输入只会对应一个答案.但是,数组中同一个元素在答案里不能重复 ...
- for what? while 与 until 差在哪?-- Shell十三问<第十三问>
for what? while 与 until 差在哪?-- Shell十三问<第十三问> 最后要介绍的是 shell script 设计中常见的"循环"(loop). ...
- 201871010203-陈鹏昱 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
项目 内容 课程班级博客链接 班级博客 这个作业要求链接 作业要求 我的课程学习目标 学习软件工程的理论和知识,掌握软件开发流程,增强实践能力 这个作业在哪些方面帮助我实现学习目标 体验软件项目开发中 ...