Windows编写driver
1. 编译
Pspeek.cpp
#include <ntddk.h> #define DANIEL_LIST_PROCESS 0x8001 PDRIVER_OBJECT daniel_DriverObject;
PDEVICE_OBJECT daniel_DeviceObject; NTSTATUS daniel_DispatchCreate(
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION stackLocation;
PIO_SECURITY_CONTEXT securityContext; stackLocation = IoGetCurrentIrpStackLocation(Irp);
securityContext = stackLocation->Parameters.Create.SecurityContext; DbgPrint("###############\n");
DbgPrint("Daniel PsPeek daniel_DispatchCreate\n");
DbgPrint("###############\n"); Irp->IoStatus.Status = status;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT); return status;
} NTSTATUS KphDispatchDeviceControl(
__in PDEVICE_OBJECT DeviceObject,
__in PIRP Irp
)
{
NTSTATUS status;
PIO_STACK_LOCATION stackLocation;
PVOID originalInput;
ULONG inputLength;
ULONG ioControlCode;
KPROCESSOR_MODE accessMode;
UCHAR capturedInput[16 * sizeof(ULONG_PTR)];
PVOID capturedInputPointer; stackLocation = IoGetCurrentIrpStackLocation(Irp);
originalInput = stackLocation->Parameters.DeviceIoControl.Type3InputBuffer;
inputLength = stackLocation->Parameters.DeviceIoControl.InputBufferLength;
ioControlCode = stackLocation->Parameters.DeviceIoControl.IoControlCode;
accessMode = Irp->RequestorMode; // Probe and capture the input buffer.
if (accessMode != KernelMode)
{
__try
{
ProbeForRead(originalInput, inputLength, sizeof(UCHAR));
memcpy(capturedInput, originalInput, inputLength);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
status = GetExceptionCode();
goto ControlEnd;
}
}
else
{
memcpy(capturedInput, originalInput, inputLength);
} capturedInputPointer = capturedInput; // avoid casting below switch (ioControlCode)
{
case DANIEL_LIST_PROCESS:
{
status = STATUS_SUCCESS;
}
break;
default:
status = STATUS_INVALID_DEVICE_REQUEST;
break;
} ControlEnd:
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT); return status;
} VOID daniel_DriverUnload(
__in PDRIVER_OBJECT DriverObject
)
{
PAGED_CODE(); IoDeleteDevice(daniel_DeviceObject);
} extern "C" NTSTATUS DriverEntry(
__in PDRIVER_OBJECT DriverObject,
__in PUNICODE_STRING RegistryPath)
{
NTSTATUS status;
UNICODE_STRING deviceName;
PDEVICE_OBJECT deviceObject; PAGED_CODE(); DbgPrint("###############\n");
DbgPrint("Daniel PsPeek DriverEntry\n"); DbgPrint("Current Pid: %d\n", PsGetCurrentProcessId());
DbgPrint("###############\n"); daniel_DriverObject = DriverObject; // Create the device. RtlInitUnicodeString(&deviceName, L"\\Device\\DanielPsPeekDriver"); status = IoCreateDevice(
DriverObject,
0,
&deviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&deviceObject
); if (!NT_SUCCESS(status))
return status; daniel_DeviceObject = deviceObject; // Set up I/O. DriverObject->MajorFunction[IRP_MJ_CREATE] = daniel_DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = KphDispatchDeviceControl;
DriverObject->DriverUnload = daniel_DriverUnload; deviceObject->Flags &= ~DO_DEVICE_INITIALIZING; return status;
}
sources
TARGETNAME=Pspeek
TARGETPATH=obj
TARGETTYPE=DRIVER SOURCES=Pspeek.cpp
mk.bat
set setenv_script=D:\WinDDK\7600.16385.1\bin\setenv.bat
set ddk_path=D:\WinDDK\7600.16385.1\
set config=chk
set platform=x86
set os=WXP %setenv_script% %ddk_path% %config% %platform% %os% && H: && cd %cd% && build
2. 加载
ld.bat
sc stop Pspeek
sc delete Pspeek
copy /y "F:\pspeek.sys" "C:\WINDOWS\system32\pspeek.sys"
sc create Pspeek binPath= "C:\WINDOWS\system32\pspeek.sys" type= kernel start= auto error= ignore DisplayName= "Daniel Process Peek Driver"
sc start Pspeek
在Windows 7下,需要使用"管理员权限"才能执行上述脚本。
3. 枚举进程列表
void GatherProcessListByEPROCESS()
{
HANDLE pid = PsGetCurrentProcessId();
DbgPrint("Current Pid: %d\n", pid);
PEPROCESS eprocess;
PsLookupProcessByProcessId(pid, &eprocess); DbgPrint("_EPROCESS: 0x%08x\n", eprocess); _LIST_ENTRY active_process_node = {0,0};
memcpy(&active_process_node, (CHAR*)eprocess + 0x88, 8); DbgPrint("Active Process List Node: [0x%08x, 0x%08x]\n", active_process_node.Blink, active_process_node.Flink); DbgPrint("VirtualSize: 0x%08x \n", *(ULONG*)((CHAR*)eprocess + 0xb0));
}
上面代码与WinDbg的验证一致,因此Windows下获取内核相关的数据与Linux并无太大差别。
void PProcess(char* eprocess)
{
DbgPrint("%16s: 0x%08x\n", "_EPROCESS", eprocess);
DbgPrint("%16s: %s\n", "ImageName", eprocess + 0x174); DbgPrint("\n");
} void GatherProcessListByEPROCESS()
{
HANDLE pid = PsGetCurrentProcessId();
DbgPrint("Current Pid: %d\n", pid); PEPROCESS eprocess;
PsLookupProcessByProcessId(pid, &eprocess); _LIST_ENTRY active_process_node = {0,0};
memcpy(&active_process_node, (CHAR*)eprocess + 0x88, 8); _LIST_ENTRY* head = active_process_node.Flink; PProcess((char*)eprocess);
for (_LIST_ENTRY* cur=head;
cur->Flink != head;
cur = cur->Flink)
{
PProcess((char*)cur - 0x88);
}
}
Windows编写driver的更多相关文章
- 为不同版本的 Windows 编写驱动程序
MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554887(v=vs.85).aspx 创建驱动程序项目时,指定 ...
- Pywinauto在Windows Twain Driver自动化测试中的应用研究
摘 要: 以Python为基础,结合对Twain Driver测试工具的具体需求,将Pywinauto引入到Twain Driver的自动化测试中.介绍了Pywinauto的基本概念,通过测试用例说 ...
- Windows编写bat执行文件
1:建立TXT文件 Rem nping用来测试IP地址的连通性 Rem nping --tcp -p 80 --flags rst --ttl 2 192.168.1.1 date 2:重命名为bat ...
- Windows编写的shell脚本,在linux上无法执行
前两天由于要查一个数据库的binlog日志,经常用命令写比较麻烦,想着写一个简单的脚本,自动去刷一下数据库的binlog日志,就直接在windows上面写了,然后拷贝到linux中去运行,其实很简单的 ...
- 解决Ubuntu下的Eclipse打开Windows编写的java代码的中文乱码
其实所有的中文乱码 问题都是编码不同所导致的.这里要想让eclipse能正常显示出汉字,就要修改它的字符编码 步骤如下: 1 ,点击菜单栏中的Window(窗口),选择Preferences(首选项) ...
- windows编写sh脚本在linux上不能执行
报错:/bin/sh^M:bad interpreter: 编码没有被识别, vi *.sh Esc 输入 :set fileformat 查看文件格式(显示 fileformat=dos) Esc ...
- 解决windows 10由于签名原因无法安装ADB driver 的问题
ADB Driver Installer (Automatically) In Windows 8 (8.1) or 10 64-bit you are unable to install unsig ...
- 深入解析Windows操作系统笔记——CH2系统结构
2.系统结构 本章主要介绍系统的总体结构,关键部件之间的交互,以及运行在什么环境. 2.系统结构 2.1 需求和设计目标 2.2 操作系统模型 2.3 总体结构 2.3.1 可移植性 2.3.2 对称 ...
- Windows操作系统
Microsoft Windows,是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家 ...
随机推荐
- [Java聊天室server]实战之三 接收循环
前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识.但学习之前,更 ...
- C#学习大纲
一.C#: 1.进制转换 2.vs界面内容 熟悉软件 3.数据类型 :引用类型 值类型 4.变量 (存储数据)一个变量存储一个数据 5.类型转换 6.运算符:算数运 ...
- jar 启动脚本
前段时间用springboot做项目后,每次重新发布都好麻烦, 所以写了个脚本来配合jenkins 发布: #!/bin/bash APP_NAME=application.jar function ...
- python中单下划线(_)和双下划线(__)的特殊用法
单下划线开头(_) 在模块中使用单下划线开头 模块中使用单下划线(_)开头定义函数.全局变量和类不能被模块外部以: from module import *形式导入. 但可以用:from module ...
- javaweb各种框架组合案例(四):maven+spring+springMVC+spring data jpa(hibernate)【失败案例】
一.失败案例 1. 控制台报错信息 严重: Exception sending context initialized event to listener instance of class org. ...
- Oracle 数据库恢复命令
前提是oracle服务能正常启动,但是客户端怎么都连接不上. 首先打开命令行,输入:sqlplus / as sysdba; 回车 连上数据库后,屏幕会显示:已连接到空闲例程. 接下来在SQL> ...
- AbstractQueuedSynchronizer简单使用
AQS是JUC中很多同步组件的构建基础,简单来讲,它内部实现主要是状态变量state和一个FIFO队列来完成,同步队列的头结点是当前获取到同步状态的结点,获取同步状态state失败的线程,会被构造成一 ...
- 使用jstack排查线程问题
以一个例子来演示排查服务器cpu占用率过高的问题. 准备 将下面的代码文件上传到服务器上,然后使用javac编译,并使用java命令将程序跑起来. public class JStackCase { ...
- Docker常规操作
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11601853.html Docker 常⽤命令 镜像相关 • docker pull <imag ...
- 如何使用Keka for Mac提取受密码保护的文件?用Keka提取文件的格式
如何使用Keka for Mac提取受密码保护的文件?keka Mac是很多人喜欢的压缩解压工具,以小巧,使用简单,界面简洁受到很多Mac用户的喜欢,你还可以使用它提取文件,下面我们就来介绍一下关于用 ...