irp是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP,不同的IRP会根据类型被分派到不同的派遣例程中进行处理。
irp相当于ring3下的消息,应用程序对驱动程序进行操作的时候会发出相应的消息,驱动程序根据这些消息做出相应的操作。这些操作通过我们自己编写的派遣函数来决定执行什么样的操作。
看下面流程:
1.为不同的irp类型设置派遣函数
2.编写派遣函数来处理收到不懂类型的irp的不同操作
3.创建设备与符号链接
4.在卸载历程中删除设备与符号链接
流程很简单,但是处理起来就不那么简单了。
代码如下:
阅读全文
irp, 学习, 派遣函数, 笔记, 驱动
在内核模式下创建线程和用户模式下创建线程有所不同,在用户模式下创建线程线程函数执行完自动返回,在内核模式下需要调用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”
阅读全文
学习, 笔记, 符号连接, 设备, 驱动

应观众要求,升级到v2,添加了关闭360系统防火墙功能。
在木马之前运行,360的木马防火墙和系统防火墙就关闭了,就不会拦截我们的马儿了~!
体积92k,大了点,无壳的,使用时自己加个压缩壳吧。
应该xp系统有效
怎么使用呢,捆绑,rar什么的,自己发挥吧。
有bug在我博客留言……
阅读全文
360, 关闭, 木马, 系统, 防火墙
对注册表的操作的和对文件的操作差不多 ,但是还是有些区别,下面就写一个对注册表操作的例子,这个是修改360安全卫士的注册表选项,使其木马防火墙失效。(在ring3下是不行的,驱动才行得通,即使360开自我保护也无所谓)
首先明确一下流程:
1.定义一个操作对象OBJECT_ATTRIBUTES
2.用InitializeObjectAttributes()函数初始化这个对象
3.用ZwOpenKey()函数来打开注册表打开360的选项
4.用ZwSetValueKey()函数来把360木马防火墙的的键值设置成空
5用ZwClose()函数来关闭打开的注册表
代码如下:
阅读全文
360, 学习, 木马, 注册表, 笔记, 防火墙, 驱动
驱动中文件的操作和在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
阅读全文
学习, 程序, 笔记, 编写, 驱动