用驱动遍历驱动

X86 win7 平台

驱动

#include <ntifs.h>

#define DEVICE_NAME L"\\Device\\wangliang"
#define SYM_NAME L"\\??\\wangliang"

#define _COMM_ID 0x12345678

typedef struct _KLDR_DATA_TABLE_ENTRY {
	LIST_ENTRY InLoadOrderLinks;
	LIST_ENTRY exp;
	ULONG un;
	ULONG NonPagedDebugInfo;
	ULONG DllBase;
	ULONG EntryPoint;
	ULONG SizeOfImage;
	UNICODE_STRING FullDllName;
	UNICODE_STRING BaseDllName;
	ULONG Flags;
	USHORT LoadCount;
	USHORT __Undefined5;
	ULONG  __Undefined6;
	ULONG  CheckSum;
	ULONG  TimeDateStamp;
} KLDR_DATA_TABLE_ENTRY, * PKLDR_DATA_TABLE_ENTRY;


NTKERNELAPI NTSTATUS ObReferenceObjectByName(
	__in PUNICODE_STRING ObjectName,
	__in ULONG Attributes,
	__in_opt PACCESS_STATE AccessState,
	__in_opt ACCESS_MASK DesiredAccess,
	__in POBJECT_TYPE ObjectType,
	__in KPROCESSOR_MODE AccessMode, 
	__inout_opt PVOID ParseContext,
	__out PVOID* Object 
);


extern POBJECT_TYPE* IoDriverObjectType;

typedef struct _CommPackage {
	ULONG64 id;
	ULONG64 pid;
	CHAR name[64];
}CommPackage, * PCommPackage;

typedef NTSTATUS(NTAPI* CommCallback)(PCommPackage package);

CommCallback gCommCallback = NULL;


NTSTATUS DefDispatch(DEVICE_OBJECT* DeviceObject, IRP* Irp)
{
	Irp->IoStatus.Status = STATUS_SUCCESS;
	IoCompleteRequest(Irp, 0);
	return STATUS_SUCCESS;
}

NTSTATUS ReadDispatch(DEVICE_OBJECT* DeviceObject, IRP* Irp)
{
	//DbgBreakPoint();
	
	PIO_STACK_LOCATION ioStack = IoGetCurrentIrpStackLocation(Irp);
	LARGE_INTEGER ByteOffset = ioStack->Parameters.Read.ByteOffset;
	int Length = ioStack->Parameters.Read.Length;
	PCommPackage package = Irp->UserBuffer;
	NTSTATUS status = STATUS_UNSUCCESSFUL;
	

	PKLDR_DATA_TABLE_ENTRY ldr = (PKLDR_DATA_TABLE_ENTRY)DeviceObject->DeviceExtension;
	PKLDR_DATA_TABLE_ENTRY pre = (PKLDR_DATA_TABLE_ENTRY)ldr->InLoadOrderLinks.Flink;
	PKLDR_DATA_TABLE_ENTRY next = (PKLDR_DATA_TABLE_ENTRY)pre->InLoadOrderLinks.Flink;

	if (package->pid > 1) {
		ULONG64 i = (ULONG64)1;
		for (; i < package->pid; i++) {
			next = (PKLDR_DATA_TABLE_ENTRY)next->InLoadOrderLinks.Flink;
		}
	}
	if (Length == sizeof(CommPackage) ) {

		UNICODE_STRING  driverName1 = next->FullDllName;
		PDRIVER_OBJECT Driver = NULL;
		ANSI_STRING ansi_buffer_target = { 0 };

		NTSTATUS status = ObReferenceObjectByName(&driverName1, FILE_ALL_ACCESS, 0, 0, *IoDriverObjectType, KernelMode, NULL, &Driver);//通过驱动的到驱动的对象

		if (package->id == _COMM_ID) {

			RtlUnicodeStringToAnsiString(&ansi_buffer_target, &driverName1, TRUE);
			strcpy(package->name, ansi_buffer_target.Buffer);
			RtlFreeAnsiString(&ansi_buffer_target);

		}
	
	};
	
	Irp->IoStatus.Information = 0;
	Irp->IoStatus.Status = status;
	IoCompleteRequest(Irp, 0);
	
	return status;
}
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
	UNICODE_STRING symName = { 0 };
	RtlInitUnicodeString(&symName, SYM_NAME);
	IoDeleteSymbolicLink(&symName);

	IoDeleteDevice(pDriver->DeviceObject);
	DbgPrint("END\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
	PKLDR_DATA_TABLE_ENTRY ldr = (PKLDR_DATA_TABLE_ENTRY)pDriver->DriverSection;

	UNICODE_STRING unName = { 0 };
	RtlInitUnicodeString(&unName, DEVICE_NAME);

	UNICODE_STRING symName = { 0 };
	RtlInitUnicodeString(&symName, SYM_NAME);

	PDEVICE_OBJECT pDevice = NULL;

	NTSTATUS status = IoCreateDevice(pDriver, sizeof(PKLDR_DATA_TABLE_ENTRY)+1, &unName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &pDevice);//创建一个驱动设备使用的设备对象
	
	if (!NT_SUCCESS(status))
	{
		DbgPrint("[db]:%x\r\n", status);
		return status;
	}

	memcpy(pDevice->DeviceExtension, ldr, sizeof(PKLDR_DATA_TABLE_ENTRY));
	status = IoCreateSymbolicLink(&symName, &unName);
	
	if (!NT_SUCCESS(status))
	{
		IoDeleteDevice(pDevice);
		DbgPrint("[db]:%x\r\n", status);
		return status;
	}

	pDevice->Flags &= ~DO_DEVICE_INITIALIZING;
	pDevice->Flags |= DO_BUFFERED_IO;

	pDriver->MajorFunction[IRP_MJ_CREATE] = DefDispatch;
	pDriver->MajorFunction[IRP_MJ_CLOSE] = DefDispatch;
	pDriver->MajorFunction[IRP_MJ_READ] = ReadDispatch;

	pDriver->DriverUnload = DriverUnload;
	
	return STATUS_SUCCESS;
}

R3

#include <stdio.h>
#include <Windows.h>

#define SYM_NAME   "\\\\.\\wangliang"

typedef struct _CommPackage {
	ULONG64 id;
	ULONG64 pid;
	CHAR name[64];
}CommPackage, * PCommPackage;

#define _COMM_ID 0x12345678

int main()
{
	CommPackage packag;
	packag.id = _COMM_ID;
	packag.pid = (ULONG64)1;
	for (int i = 0; i < 64; i++) {
		packag.name[i] = 0;
	}
	HANDLE hDevice = CreateFileA(SYM_NAME, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	
	
	if (hDevice == NULL || hDevice == INVALID_HANDLE_VALUE)
	{
		printf("%d", hDevice);
		system("pause");
		return 0;
	}

	DWORD p = 0;
	

	ReadFile(hDevice, &packag, sizeof(CommPackage), &p, NULL);
	char First[64] = {0};
	strcpy_s(First, 64, packag.name);
	printf("%s\r\n", packag.name);
	
	do{
		
		packag.pid = packag.pid + 1;
		for (int i = 0; i < 64; i++) {
			packag.name[i] = 0;
		}
		ReadFile(hDevice, &packag, sizeof(CommPackage), &p, NULL);
		printf("%s\r\n", packag.name);
		Sleep(1000);
	} while (strcmp(First, packag.name) != NULL);
		

	CloseHandle(hDevice);
	
	system("pause");
	return 0;
}

效果图

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用详细: 1.工具有一个隐含快捷键alt+f,这个快捷键的作用是选择窗口,选择了以后工具的区域1就会变成“窗口句柄+进程ID+进程句柄+OK”如果打开失败了,那就变成“error”了。 2.区域6的作用是显示遍历结果,这个窗口的数据不是时时更新的,并且软件关闭后不会记录,除右键菜单外还支持快捷操作 (1)左键双击-记录鼠标选择行所有信息到区域3(当前激活的) (2)DELETE-删除鼠标选择行 3.区域2的作用是归类当前TAB标签,可以在软件目录下opmem.ini文件设置其标签名称,方法为在“[setup]”下添加“char_tab1=人物信息”标签1就变成了人物信息,如果是“char_tab2”那么就是第二个标签的标题,这几个标签是可以切换的,且各自独立。 4.区域3的作用是分类记录已经分析完成的内存信息(这些信息重器软件是保存的),其中软件读取的地址为偏移栏目下的基址+偏移,除右键菜单外还支持DELETE键,还有就是内存锁定功能(把地址栏的勾打上),锁定功能这里要提及一下,软件会锁定你修改成的值,其它就没什么了。 5.区域4的作用是设置遍历参数,这个栏目属于最基础的,所以就不多说了,就是设置了信息然后单击开始遍历就可以了。 6.区域5的作用是设置过滤条件和信息,在这个栏目设置了以后电击开始过滤就会根据你设置的条件和信息对区域6的信息进行过滤,下面详细介绍每个过滤条件以及对应的过滤信息的设置。组1:单-过滤对象为区域6的单字信息,双-过滤对象为区域6的双字信息,四-过滤对象为区域6的四字信息,A-过滤对象为区域6的文本A信息,U-过滤对象为区域6的文本U信息 组2:%d-代表读取的内存信息用十进制表示 %x-代表读取的内存信息用十六进制表示 组3:大-过滤条件是比搜索1框内输入数字大的保留,小于或等于的删除,小-过滤条件是比搜索1框内输入数字小的保留,大于或等于的删除,间-过滤条件是比搜索1框内输入数字小或者比搜索2框内输入数字大的删除,其余的保留,等-过滤条件是等于搜索1框内输入数字的保留,其余的删除,增-过滤条件是以当前读取的数据进行参考,重新读取偏移的地址,如果偏移地址的数据大于当前的则保留,其余的删除,减-过滤条件是以当前读取的数据进行参考,重新读取偏移的地址,如果偏移地址的数据小于当前的则保留,其余的删除 同-过滤条件是以当前读取的数据进行参考,重新读取偏移的地址,如果偏移地址的数据和当前的相同则保留,其余的删除,变-过滤条件是以当前读取的数据进行参考,重新读取偏移的地址,如果偏移地址的数据和当前的不相同则保留,其余的删除。 7.CALL相关这个按钮和开始搜索这个按钮的功能还没有写,在此希望哪位同行发一份CE的源码让我学习,我会增加CE的功能于这款软件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值