欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]发一份目前可以读写DXF内存的驱动源码

[原创]发一份目前可以读写DXF内存的驱动源码

编译环境是 VS2013+WDK8.1
测试环境  XP32
弄这个过保护的都知道,现在驱动动不动上千一个月,源码动不动上万,穷鬼买不起,只能自己查资料,慢慢弄.基本的读写是没问题了,但是有个特别别扭的问题,发出来,希望有好心人能指点下该怎么弄.
源码只是自己拿来测试的,所以写得不是很规范,不过也就那么几行代码,所以也不算很乱.
代码基本上是  从 Tesla.Angela。 那里抄的.
http://bbs.pediy.com/showthread.php?t=187348
代码只完成了读取部分,写入部分自己参照  Tesla.Angela 教程里面的 [5-5]强制读写进程内存.pdf课程修改加入即可,改改估计WIN 64位系统应该也可以实现.
发出来主要是学习,我对驱动也是什么都不懂,查了几天的资料,也只能写这样吧 .
说说遇到的别扭的问题.
测试发现,userMode的时候,读取到的内存都是 乱码,只有KernelMode的时候读取到的才是真实的内存数据.
所以源码中,在 调用 DeviceIoControl 进来的时候,创建内核线程来 读取内存,这样就能读写到了.
但是,看着总是很别扭,尝试修改线程 PreviousMode ,但是没有用,也不知道是不是这样修改,至少修改后 ExGetPreviousMode()得到的结果却是是 kernelmode了 .

NTSTATUS DispatchRoutine( 	PDEVICE_OBJECT pdo,	PIRP Irp)

{

	NTSTATUS status;

	PIO_STACK_LOCATION pisl;

	ULONG cbin;

	ULONG cbout;

	ULONG code;

	ULONG info = 0;

	CHAR InputData[40] = {0};

	PVOID OutBuffer ;

	PCHAR buffer;

	LONG len = 0, pid = 0, add = 0;

	status = STATUS_SUCCESS;

	pisl = IoGetCurrentIrpStackLocation(Irp);

//	pisl->DeviceObject->CurrentIrp->RequestorMode = 0;

	//得到输入缓冲区大小

	cbin = pisl->Parameters.DeviceIoControl.InputBufferLength;

	//得到输出缓冲区大小

	cbout = pisl->Parameters.DeviceIoControl.OutputBufferLength;

	//得到IOCTL码

	code = pisl->Parameters.DeviceIoControl.IoControlCode;

	//	DbgPrint("%d-%d-%d", IOCTL_SET_ADAPTOR_MAC, IOCTL_SET_DISK_SERIAL, code);

	switch (code)

	{						// process request

	case IOCTL_READ: //只是测试,所以只弄了读内存的部分,写内存的看看教程自己加也不会难

		{

			if (cbin == 12)

			{

				//PKTHREAD XXX = KeGetCurrentThread();

				//*((char*)XXX + 0x140) = KernelMode; 这里修改PreviousMode,但是测试没有用

				//KeSetPriorityThread(XXX, LOW_REALTIME_PRIORITY);

				//KeSetBasePriorityThread(XXX, LOW_REALTIME_PRIORITY);

				//DbgPrint("Mode = %d - %X", ExGetPreviousMode(), *((char*)XXX + 0x140));

				RtlCopyMemory(&pid, (char*)pisl->Parameters.DeviceIoControl.Type3InputBuffer + 0, 4);

				RtlCopyMemory(&add, (char*)pisl->Parameters.DeviceIoControl.Type3InputBuffer + 4, 4);

				RtlCopyMemory(&len, (char*)pisl->Parameters.DeviceIoControl.Type3InputBuffer + 8, 4);

				DbgPrint("IOCTL_READ : %d - %08X -%d", pid, add, len);

				OutBuffer = Irp->UserBuffer;

				if (len<12)

				{

					buffer = (PVOID)ExAllocatePool(PagedPool, 12);

				}

				else

				{

					buffer = (PVOID)ExAllocatePool(PagedPool, len);

				}

				RtlCopyMemory(buffer, pisl->Parameters.DeviceIoControl.Type3InputBuffer,12);

				CreateThreadTest(buffer); //创建内核线程来读取内存

				RtlCopyMemory(OutBuffer, buffer, len);

				ExFreePool(buffer);

			//	test(pid);

			//	*((char*)XXX + 0x140) = UserMode; //还原 PreviousMode

			}

			info = cbout;

			break;

		}

	}

	Irp->IoStatus.Status = status;

	Irp->IoStatus.Information = info;

	IoCompleteRequest(Irp, IO_NO_INCREMENT);

	return STATUS_SUCCESS;

}

好心人来指点下
WRMemory3.rar

上传的附件 WRMemory3.rar
1.png

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功