做个记录~
地址:0×7ffa4512

阅读全文

irp是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP,不同的IRP会根据类型被分派到不同的派遣例程中进行处理。

irp相当于ring3下的消息,应用程序对驱动程序进行操作的时候会发出相应的消息,驱动程序根据这些消息做出相应的操作。这些操作通过我们自己编写的派遣函数来决定执行什么样的操作。

看下面流程:

1.为不同的irp类型设置派遣函数

2.编写派遣函数来处理收到不懂类型的irp的不同操作

3.创建设备与符号链接

4.在卸载历程中删除设备与符号链接

流程很简单,但是处理起来就不那么简单了。

代码如下:

阅读全文

, , , ,

在内核模式下创建线程和用户模式下创建线程有所不同,在用户模式下创建线程线程函数执行完自动返回,在内核模式下需要调用API来结束一个线程。

下面编写一个新建一个线程来输出”welcome to www.lingdux.com

首先确认流程如下:

1.定义线程函数MyThread()用来实现输出”welcome to www.lingdux.com\n”。

2.线程函数中使用PsTerminateSystemThread()函数来终止线程。

3.使用PsCreateSystemThread()函数来创建线程并运行线程函数。

实现代码如下:

 

#include “ntddk.h”

阅读全文

, , , ,

创建设备与符号连接是为了驱动程序和应用程序的交互。

流程很简单:

1.用IoCreateDevice()函数创建设备对性。

2.用IoCreateSymbolicLink()函数来绑定设备和符号链接。

3.卸载时用IoDeleteSymbolicLink删除符号连接。

4.然后用IoDeleteDevice来删除设备。

完整代码如下:

#include “ntddk.h”

阅读全文

, , , ,

对注册表的操作的和对文件的操作差不多 ,但是还是有些区别,下面就写一个对注册表操作的例子,这个是修改360安全卫士的注册表选项,使其木马防火墙失效。(在ring3下是不行的,驱动才行得通,即使360开自我保护也无所谓)

首先明确一下流程:

1.定义一个操作对象OBJECT_ATTRIBUTES

2.用InitializeObjectAttributes()函数初始化这个对象

3.用ZwOpenKey()函数来打开注册表打开360的选项

4.用ZwSetValueKey()函数来把360木马防火墙的的键值设置成空

5用ZwClose()函数来关闭打开的注册表

代码如下:

阅读全文

, , , , , ,

驱动中文件的操作和在ring3下对文件的操作有所不同,ring3下直接输文件路径就可以对文件操作了,在驱动中应该先为文件初始化一个对象,然后对这个对象操作,下面来编写一个驱动实现创建一个文件并写入字符串“www.lingdux.com”

首先确定一下流程:

1.定义一个操作对象OBJECT_ATTRIBUTES

2.用InitializeObjectAttributes()函数初始化这个对象

3.用ZwCreateFile()函数来创建一个文件

4.用ZwWriteFile()函数写入字符串

5. 关闭打开的文件ZwClose();

实现代码如下:

阅读全文

, , , ,

在驱动编程中,处理字符串最好用UNICODE_STRING,UNICODE_STRING是一个结构,查看MSDN如下:

typedef struct _UNICODE_STRING{

USHORT length;\\字符串的长度

USHORT MaxnumLength;\\整个缓冲区的最大长度

PWSTR Buffer;\\缓冲

}UNICODE_STRING *PUNICODE_STRING;

字符串不是以00结尾,而是用一个结构来指定字符串的长度。

DDK提供了一个函数用于初始化字符串

VOID RtlInitUnicodeString(

IN OUT PUNICODE_STRING DestiantionString,//定义的字符串结构指针

IN PCWSTR SourceString//字符串

);

阅读全文

, , , , ,

编译环境用xp下VC6+DDK

新建一个文件夹当作工程目录,路径是E:\lingdux\

从别的工程copy过来两个文件,

一个是makefile,它用来指定文件之间的依赖关系,确定项目中哪些文件时需要重新编译的,那些事已经编译过的。里面的内容不用改,直接默认就OK

另一个是source,它用来保存一些配置信息,内容如下:

TARGETNAME=lingdux  这句用来指定目标程序存放的路径

TARGETTYPE=DRIVER 这句是指定目标类型,DRIVER为驱动程序

TARGETPATH=Driver 这句指定编译时的中间文件存放的路径

SOURCES=lingdux.c  这句指定了源文件

在工程目录想创建一个空文件命名lingdux.c,双击用VC6打开,开始写代码~!

遵循C语言,只有一个入口函数DriverEntry,有两个参数

NTSTATUS Driver Entry(IN PDRIVER_OBJECT DriverObject, 第一个是PDRIVER_OBJECT类型 系统进程调用的驱动对象
                            IN OUNICODE_STRING RegistryPath)  第二个是IN OUNICODE_STRING类型  字符串类型,注册路径

返回值类型为NTSTATUS,系统状态。

输出函数为DbgPrint(),包含的头文件是ntddk.h 

阅读全文

, , , ,