[内核编程] 4.5 HOOK分发函数】的更多相关文章

4.5 HOOK分发函数 本节开始深入的探讨键盘的过滤与反过滤.有趣的是,无论是过滤还是反过 滤,其原理都是进行过滤.取胜的关键在于:谁将第一个得到信息. 黑客可能会通过修改一个已经存在的驱动对象(比如前面的KbdClass)的分 发函数指针来实现过滤所有请求的目的.黑客将这些函数指针替换成自己的黑客 驱动中的函数,这样请求将被黑客的程序首先截获.然后通过调用原来被替换过 的旧的函数指针来让Windows的击键过程正常的运作下去. 4.5.1 获得类驱动对象 当然,首先要获得键盘类驱动对象,才能…
4.5 HOOK分发函数 本节开始深入的探讨键盘的过滤与反过滤.有趣的是,无论是过滤还是反过 滤,其原理都是进行过滤.取胜的关键在于:谁将第一个得到信息. 黑客可能会通过修改一个已经存在的驱动对象(比如前面的KbdClass)的分 发函数指针来实现过滤所有请求的目的.黑客将这些函数指针替换成自己的黑客 驱动中的函数,这样请求将被黑客的程序首先截获.然后通过调用原来被替换过 的旧的函数指针来让Windows的击键过程正常的运作下去. 4.5.1 获得类驱动对象 当然,首先要获得键盘类驱动对象,才能…
最近在阅读<寒江独钓_Windows内核安全编程>一书的过程中,发现修改类驱动分发函数这一技术点,书中只给出了具体思路和部分代码,没有完整的例子. 按照作者的思路和代码,将例子补充完整,发现将驱动安装在WIN7 32位环境下,键盘失效. 经调试发现,可能的原因是替换了\\Driver\\Kbdclass类驱动的所有分发函数导致,如果只替换分发IRP_MJ_READ的函数,不会有问题,以下为代码 //替换分发函数 来实现过滤 #include <wdm.h> #include <…
我自己在看<寒江独钓>这本书的时候,书中除了给出了利用过滤的方式来拦截键盘数据之外,也提到了另外一种方法,就是hook键盘分发函数,将它替换成我们自己的,然后再自己的分发函数中获取这个数据的方式,但是书中并没有明确给出代码,我结合书中所说的一些知识加上网上找到的相关资料,自己编写了相关代码,并且试验成功了,现在给出详细的方法和代码. 用这种方式时首先根据ObReferenceObjectByName函数来根据对应的驱动名称获取驱动的驱动对象指针.该函数是一个未导出函数,在使用时只需要先声明即可…
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函数)指针的个数为:IRP_MJ_MAXINUM_FUNCTION,保存在一个数组中,编写驱动程序,实质上就是自己编写处理I/O请求IRP包的派遣函数,可以使用for循环将所有的派遣函数注册到同一个派遣函数.分发函数类似MFC消息机制中的回调函数,它的名字也是程序员自定义的,但是参数确定.卸载函数通过…
1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTATUS status; -. return status; } 如果碰到一个函数返回了奇特的NTSTATUS值,正确的方法是在WDK的头文件比如(NTSTATUS.h)中去寻找答案. 2.字符串 驱动里的字符串一般用这个结构来容纳. typedef struct _UNICODE_STRING{ US…
---恢复内容开始--- 1) C++的"高级"特性,是它的优点也是它的缺点,微软对于使用C++写内核程序即不推崇也不排斥,使用C++写驱动需注意: a)New等操作符不能直接使用,如果要使用,必须进行重载. b)标准C接口的声明,在包含头文件以及入口例程的前面要声明extern "C" c)类的静态成员函数的使用:在类内部声明一个静态函数作为分发函数Dispatch,这个静态函数当做普通的C函数调用,而C++声明的非静态函数调用该函数进行分配. 这一部分读下来,其…
(原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用windows运用层API函数 很多C标准函数失去意义,如printf,fopen,fwrite等,它们有专门的内核函数 很多单纯的C标准,如string.h(不涉及I/O及网络等)等还是适用 可以使用标准C语言,但是用浮点数之前要特殊处理 WDK提供大量System Routine以供调用,相当于运用层…
目录 一丶驱动是如何运行的 1.服务注册驱动 二丶Ring3跟Ring0通讯的几种方式 1.IOCTRL_CODE 控制代码的几种IO 2.非控制 缓冲区的三种方式. 三丶Ring3跟Ring0开发区别 1.什么是Ring3 什么是Ring0 四丶IRQL中断级别 五丶驱动函数的分类 六丶编写内核中的注意事项 一丶驱动是如何运行的 1.服务注册驱动 我们编写驱动.一定要知道驱动是如何运行的 首先在我们安装一个驱动的时候,会创建一个服务.(注册表) 在 HKEY_LOCAL_MACHINE\SYS…
/* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDEVICE_OBJECT DeviceObject; //驱动设备对象 PDRIVER_EXTENSION DriverExtension; //驱动扩展指针 UNICODE_STRING DriverName; //驱动程序的名字 PDRIVER_UNLOAD DriverUnload; //驱动的…