由于考虑到大家可能开发用户态的程序较多,但不见得有太多驱动的理解,所以今天尝试下从理论开始讲解。
首先说下,由于RP问题,最近重感冒,脑子有点昏,可能有些地方说的不是很清楚,如果有这种情况还望大家指出。
Ring0是什么?某种程度上说,Ring0就是内核,Ring3就是应用层,这是由Intel的x86处理器架构决定的,Intel处理器分为四个层,从Ring0到Ring3,大家可能有些疑惑了,我们为什么很少听到Ring1和Ring2这种说法呢?很简单,因为Intel设计了它,但现行的操作系统(简称OS)都没有采用,而仅仅是简单调用了Ring0和Ring3机制,分别用来存放操作系统和应用程序的数据,所以,我们也只提到了Ring0和Ring3。
驱动和Ring0有什么关系呢?驱动一旦被加载,就会运行在Ring0层,也就是和操作系统有了相同的权限,所以根本不需要我们去费尽心机在中断门或者调用门上面做手脚,大摇大摆加载进去就是了。而这个版块,除了提到驱动外,还有Rootkit,Rootkit从某种意义上来说,也是驱动的一种,只不过这种驱动针对性极强,专门HOOK关键函数进行隐藏。
那么,今天就以一个最基本的驱动作为结尾吧,实在抱歉只写了这么一点,一是头昏难受,二也不知道该怎么写下去,继续下去必定会涉及分页机制,但是这么讲必须要求读者对Win32汇编较为了解,如何让一个不怎么懂Win32汇编的读者看懂,也是需要考虑的内容之一。
unit driver;
interface
uses nt_status, ntoskrnl;
function _DriverEntry(DriverObject:PDriverObject;RegistryPath:PUnicodeString):NTSTATUS; stdcall;//定义入口点,注意那个下划线,语法
implementation
procedure DriverUnload(DriverObject:PDriverObject); stdcall;
begin
DbgPrint('DriverUnload');
end;
function _DriverEntry(DriverObject:PDriverObject;RegistryPath:PUnicodeString):NTSTATUS; stdcall;
begin
DbgPrint('Hello World');//驱动版的HelloWorld,DbgPrint相当于C语言中的Printf
DriverObject^.DriverUnload:=@DriverUnload;
Result:=STATUS_SUCCESS;//返回成功消息
end;
end.