
驱动
文章平均质量分 62
swanabin
这个作者很懒,什么都没留下…
展开
-
DbgPrint/KdPrint输出格式控制
在驱动编程学习中,往往需要通过DbgPrint或者KdPrint来输出调试信息,对于Check版本,KdPrint只是DbgPrint的一个宏定义,而对于Free版本,KdPrint将被优化掉。这些输出信息可以通过DebugView对内核的监控来看到。KdPrint is identical to the DbgPrint routine in code that is compiled原创 2013-07-11 12:07:25 · 666 阅读 · 0 评论 -
重载内核全程分析笔记
重载内核内容:1、 将内核文件加载到内存2、 进行基址重定位3、 重定位ssdt结构4、 Hook KiFastCallEntry,让RING3进程调用走新内核下面一步一步的进行分析1、 加载内核文件我们要加载哪一个文件呢?答案是:ntkrnlpa.exe,我测试的系统的XP sp3,该文件所在目录为C:\WINDOWS\system32\ntkrnlpa.e转载 2014-02-25 17:27:15 · 1667 阅读 · 0 评论 -
Windows内核驱动开发入门学习资料
声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处;本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任。(本资料由代码疯子整理)一、书籍推荐《Windows驱动开发技术详解》作者:张帆、史彩成;出版社:电子工业出版社《天书夜读:从汇编语言到Windows内核编程》作者:谭文、邵坚磊;出版社:转载 2014-02-27 11:12:01 · 1169 阅读 · 0 评论 -
KiFastCallEntry() 机制分析
概述Win32 子系统 API 调用ntdll!ZwWriteFile() 函数ntdll!KiFastSystemCall() 函数_KUSER_SHARED_DATA 结构切入 KiFastCallEntry() 函数读取 TSS 信息KTRAP_FRAME 结构系统服务例程号与 ServiceTableServiceTableServiceTable entry读取目标例转载 2014-02-28 15:21:18 · 1097 阅读 · 0 评论 -
Windows内存管理(1)--分配内核内存 和 使用链表
1. 分配内核内存Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约。和应用程序一样,局部变量是存放在栈空间中的。但栈空间不会像应用程序那么大,所以驱动程序不适合递归调用或者局部变量是大型数据结构。如果需要大型数据结构,我们可以在堆中申请。堆中申请的函数有以下几个:(1)PVOID ExAllocatePool( I转载 2014-02-28 10:23:05 · 1685 阅读 · 0 评论 -
Windows内存管理(2)--Lookaside结构 和 运行时函数
1. Lookaside结构频繁的申请和回收内存,会导致在内存上产生大量的内存“空洞”,从而导致最终无法申请内存。DDK为程序员提供了Lookaside结构来解决这个问题。我们可以将Lookaside对象看成是一个内存容器。在初始化的时候,它先向Windows申请了一块比较大的内存。以后程序员每次申请内存的时候,不是直接向Windows申请内存,而是想Lookaside对象申请内转载 2014-02-28 10:23:34 · 1057 阅读 · 0 评论 -
使用 Lookaside List 分配内存
使用 Lookaside List 分配内存概述lookaside list 节点结构节点内存块 size初始化节点分配内存释放内存动态调整 lookaside list 节点深度1. 概述windows 提供了一种基于 lookaside list 的快速内存分配方案,区别于一般的使用 ExAllocatePoolWithTag() 系列函数的内存分配方式。每次从 loo转载 2014-02-28 10:31:38 · 5685 阅读 · 0 评论 -
Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT
1. 检查内存可用性在驱动程序开发中,对内存的操作要格外小心。如果某段内存是只读的,而驱动程序试图去写操作,会导致系统的崩溃。DDK提供了两个函数,帮助程序员在不知道某段内存是否可读写的情况下,试探这段内存的可读写性。VOID ProbeForRead( IN CONST VOID *Address, IN SIZE_T Length,转载 2014-02-28 10:24:02 · 886 阅读 · 0 评论 -
驱动和应用层的三种通信方式
驱动程序和客户应用程序经常需要进行数据交换,但我们知道驱动程序和客户应用程序可能不在同一个地址空间,因此操作系统必须解决两者之间的数据交换。驱动层和应用层通信,主要是靠DeviceIoControl函数,下面是该函数的原型:BOOL DeviceIoControl ( HANDLE hDevice, // 设备句柄 DWORD dwIoControlCode, // IOCTL请求转载 2014-03-03 11:45:00 · 9062 阅读 · 0 评论 -
在驱动和应用程序间共享内存
在不同的场合,很多驱动编写人员需要在驱动和用户程序间共享内存。两种最容易的技术是: l 应用程序发送IOCTL给驱动程序,提供一个指向内存的指针,之后驱动程序和应用程序就可以共享内存。(应用程序分配共享内存) l 由驱动程序分配内存页,并映射这些内存页到指定用户模式进程的地址空间,并且将地址返回给应用程序。(驱动程序分配共享内存) 使用IOCTL共享Buffer:转载 2014-03-03 11:46:19 · 1302 阅读 · 1 评论 -
KdPrint/DbgPrint and UNICODE_STRING/ANSI_STRING
typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer;} UNICODE_STRING;typedef UNICODE_STRING *PUNICODE_STRING;typedef struct _STRING { USHORT Len转载 2014-04-11 16:54:09 · 1622 阅读 · 0 评论 -
Windows 驱动模型的发展历史
直接从win95/98说起,因为之前的系统基本上没有保护模式的概念,程序员可以直接修改任意内存的数据。在95/98中采用的内核开发模型是VxD(虚拟设备驱动),在dos时期,程序认为它们拥有系统的一切,严格来说95/98是建立在dos的基础上的操作系统,当dos程序移植到 windows中,windows必须提供一个虚拟的设备供程序访问,也就是真实机器的替身,例如,当一个dos程序和键盘通信的时候转载 2014-11-22 15:01:07 · 2140 阅读 · 0 评论 -
微软引入了两种新的网络过滤系统,WFP和NDISfilter
Windows 8是微软公司推出的最新的客户端OS,内部名称Windows NT 80。相对于Windows NT 5.x,其网络结构变化非常大,原有的TDI,NDIS系统挂接方法不再适用。在Windows8系统中,微软引入了两种新的网络过滤系统,WFP和NDISfilter。WFP (Windows Filtering Platform)其包含从用户态到核心态的一系列应用转载 2014-11-22 10:19:21 · 10951 阅读 · 0 评论 -
Windows驱动_WFP之一WFP是什么
现在的网络安全问题,越来越受到重视,微软在VISTA以后,使用了WFP平台来代替之前XP和03中的基于包过滤的技术,比如Transport Driver Interface(TDI)过滤,Network Driver Interface Specification(NDIS)过滤,Winsock layered Service Providers(LSP).WFP是一组API和系统服务,它给网络过转载 2014-11-22 10:57:08 · 3064 阅读 · 0 评论 -
windows 驱动开发 DDK与WDK WDM的区别
最近尝试去了解WINDOWS下的驱动开发,现在总结一下最近看到的资料。 1.首先,先从基础的东西说起,开发WINDOWS下的驱动程序,需要一个专门的开发包,如:开发JAVA程序,我们可能需要一个JDK,开发WINDOWS应用程序,我们需要WINDOWS的SDK,现在开发WINDOWS下的驱动程序,我们需要一个DDK/WDK。 2.DDK(Driver Developer Kit转载 2014-11-22 14:54:10 · 6161 阅读 · 0 评论 -
对A盾原理的小小总结,膜拜A神
A盾的原理是在驱动加载时重载os内核,获取原始ssdt表的地址。应用层点击查询的代码在文件A-ProtectView.cpp中,每种点击操作调用相应的query查询函数,在query函数里 ReadFile。读操作的Handle是A盾自定义的操作码,类似DeviceIoControl的控制码,比如handle 为LIST_SSDT,LIST_INLINEHOOK等。驱动加载时hoo转载 2014-02-24 15:19:55 · 5175 阅读 · 1 评论 -
部分主流杀软驱动挂钩分析
本帖最后由 shulun743 于 2014-1-24 12:27 编辑主要说32位系统:挂钩方式,现在常用的就是挂钩ssdt,shadown ssdt,inline hook挂钩文件系统过滤驱动和HOOK NT!KiFastCallEntry!不具体讨论HOOK和INLINE HOOK的区别了!就是蓝屏不蓝屏的问题!主要讨论挂钩位置的问题:分为两大阵营:1转载 2014-02-24 15:08:52 · 991 阅读 · 0 评论 -
注册表中路径的写法
注册表中路径的写法实际上,因为用户模式下的应用程序总是由某个 “ 当前用户 ” 打开的,因此在用户模 式下可以直接访问 HKEY_CLASSES_ROOT 和 HKEY_CURRENT_USER ,但工作在内核模式下的驱动程序不属于任何一个用户,因此不能直接访问这两个根键。如果对象类型为注册表键,则对象名字应该起始于“\Registry”。例如:键原创 2013-07-06 11:47:26 · 2052 阅读 · 0 评论 -
监视系统中进程的创建和终止
原理很简单,主要功能通过一个内核驱动中使用PsSetCreateProcessNotifyRoutine 函数来实现。效果也不错首先新建一个驱动程序工程,在DriverEntry例程中调用PsSetCreateProcessNotifyRoutine函数向系统添加一个回调函数,并创建一个系统事件对象,当系统中有进程新建或者进程终止,回调函数将会被调用,而在进程回调函数中,保存信息并出发系统转载 2013-07-30 16:54:22 · 1121 阅读 · 0 评论 -
城里城外看SSDT
引子2006年,中国互联网上的斗争硝烟弥漫。这时的战场上,先前颇为流行的窗口挂钩、API挂钩、进程注入等技术已然成为昨日黄花,大有逐渐淡出之势;取而代之的,则是更狠毒、更为赤裸裸的词汇:驱动、隐藏进程、Rootkit……前不久,我不经意翻出自己2005年9月写下的一篇文章《DLL的远程注入技术》,在下面看到了一位名叫L4bm0s的网友说这种技术已经过时了。虽然我也曾想过拟出若干辩解转载 2013-07-30 17:17:15 · 763 阅读 · 0 评论 -
驱动层hook系统函数的时,如何屏蔽掉只读属性?
对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向只读页面执行写操作;当该位复位时则反之。因此,在写前把设置该位就可以climov eax, cr0and eax, -65537 ; fffeffffHmov cr0, eax原创 2013-08-17 16:07:07 · 1156 阅读 · 0 评论 -
探索NDIS HOOK新的实现方法(1)
NDIS HOOK是专业级防火墙使用的一种拦截技术,NDIS HOOK的重点是如何获得特定协议对应NDIS_PROTOCOL_BLOCK指针,获得了该指针,接下来就可以替换该协议所注册的收发函数,而达到拦截网络数据的目的。 获 得NDIS_PROTOCOL_BLOCK指针的方法一般是用NdisRegisterProtocol注册一个新的协议,所获得的协议句柄实际上就是一 个NDIS转载 2013-07-10 12:17:47 · 899 阅读 · 0 评论 -
SSDT
SSDT就是一张存于系统内核中的一张表。这个表的作用就是指向一些函数的地址。比如我们调用OPENPROCESS,最终会调用SSDT表中的122号服务。哈~~原创 2013-08-17 10:59:56 · 704 阅读 · 0 评论 -
简单HOOK SSDT实现文件防删除
http://www.rosoo.net/a/201001/8347.html转载 2013-08-17 12:08:49 · 949 阅读 · 0 评论 -
Rootkit之SSDT hook(通过CR0)
SSDT即System Service Dispath Table,它是一个表,这个表中有内核调用的函数地址。KeServiceDescriptorTable:是由内核(Ntoskrnl.exe)导出的一个表,这个表是访问SSDT的关键,具体结构是typedef struct ServiceDescriptorTable {PVOID ServiceTableBase;PVOID转载 2013-08-17 15:00:57 · 1107 阅读 · 0 评论 -
Zw函数与Nt函数的分别与联系
in ring3:lkd> ? ntdll!ZwOpenProcessEvaluate expression: 2089999739 = 7c92dd7blkd> ?ntdll!NtOpenProcessEvaluate expression: 2089999739 = 7c92dd7b可以看到,在ntdll中,ZwOpenProcess和NtOpenProcess其实是同转载 2013-08-17 11:36:13 · 943 阅读 · 0 评论 -
#define SYSTEMSERVICE(_func) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_func+1) 这
这个跟KeServiceDescriptorTable的结构有关下面是KeServiceDescriptorTable的结构定义KeServiceDescriptorTabletypedef struct _KSERVICE_TABLE_DESCRIPTOR { PULONG_PTR Base; PULONG Count; ULONG Limit; PUCHAR Number;} K原创 2013-08-17 14:15:15 · 1869 阅读 · 0 评论 -
Rootkit之SSDT hook(通过CR0)
CR0当中有一个写保护位,是保护内存不可写属性的,为了能够写入内核,只能把它的保护给咔嚓掉了,不过……如果做完了手脚但不还原写保护属性的话,极有可能会BOSD.原创 2013-08-17 10:25:39 · 1149 阅读 · 0 评论 -
SSDT
2、系统服务调度表SSDT及SSSDT Shadow系统服务:由操作系统提供的一组函数(内核函数),API可以间接或者直接的调用系统服务。操作系统以动态链接库(DLL)的形式提供API。SSDT:系统服务调度表(System Service Dispatch Table),该表可以基于系统服务编号进行索引,来定位函数内存地址。SSPT:系统服务参数表(System Service转载 2013-08-17 12:31:04 · 3414 阅读 · 0 评论 -
win7+vs2010配置驱动开发环境(问题种种版...)
本来按照这个来做,能跑通helloworld,可是复杂的驱动就会出错....不知道什么原因,后来就直接用命令行来编译的。--------------------------------------------------------------------------------------------------------------------- 这个学期和老师做转载 2014-02-08 11:08:42 · 1167 阅读 · 0 评论 -
修改ActiveProcessLinks链表隐藏进程
在Windows内核中有一个活动进程链表AcvtivePeorecssList。它是一个双向链表,保存着系统中所有进程的EPROCESS结构。特别地,进程的EPROCESS结构包含一个具有指针成员FLINK和BLINK的LIST_ENTRY结构,这两个指针分别指向当前进程的前方和后方进程。当某些模块需要获得系统中运行的所有进程信息时,就会遍历这个链表。若在PsActviePoroessList链表转载 2014-02-21 18:08:17 · 2685 阅读 · 0 评论 -
EPROCESS 结构
每个进程都有一个 EPROCESS 结构,里面保存着进程的各种信息,和相关结构的指针。EPROCESS 结构位于系统地址空间,所以访问这个结构需要有ring0的权限。使用 Win2k DDK 的 KD (内核调试器)我们可以得到 EPROCESS 结构的定义。注意下面的是 Win2k Build 2195 下的 EPROCESS 结构定义。kd> !strct eprocess!s转载 2016-07-05 15:48:07 · 11892 阅读 · 0 评论