首页
社区
课程
招聘
[原创]发一份目前可以读写DXF内存的驱动源码
发表于: 2016-8-22 01:41 27836

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

2016-8-22 01:41
27836
编译环境是 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


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 3
支持
分享
最新回复 (30)
雪    币: 7246
活跃值: (5073)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
源码中带有简单的调用例子.
有人会不创建线程读取的,麻烦告诉下呗
2016-8-22 01:42
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主分享技术帖
2016-8-22 01:45
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼主分享技术帖
2016-8-22 03:00
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢发布。。。。。。
2016-8-22 07:23
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
真实原理是system进程可以读写跟kernelmode不kernelmode没什么关系
2016-8-22 08:24
0
雪    币: 4840
活跃值: (2260)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark
2016-8-22 09:03
0
雪    币: 22
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
马克
2016-8-22 09:19
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
V总爆料了,大家都去模拟那进程访问把,就可以了
2016-8-22 09:40
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
以前csrss进程也可以读写,现在貌似也不行了。
2016-8-22 09:42
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
11
csrss进程也可以读写,只是需要是真的csrss。
PS:其实smss也能读写
2016-8-22 10:21
0
雪    币: 219
活跃值: (738)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
12
..你这个代码跟你这个没任何关系, 那是通过CR3来的,dxx 是 替换CR3来实现的,没用
2016-8-22 11:47
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
13
原理虽然不在这里 但是SYSTEM是被过滤的。
2016-8-22 12:27
0
雪    币: 44
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
果然一夜之间大神把所有方法都爆出来了,感情真的很牛呀。
2016-8-22 14:46
0
雪    币: 7246
活跃值: (5073)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
原来是这样,明白了,谢谢
2016-8-22 14:58
0
雪    币: 213
活跃值: (973)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
这个在TX白名单里面的进程是可以读取的
2016-8-22 14:59
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我用的是CsrGetProcessId得到的csrss进程ID
2016-8-22 15:37
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
18
其实注入模块到csrss里面 再直接ReadProcessMemory就可以了。
tx如果禁止csrss读取dxf内存,就会导致dxf进程报错,这个我试过,所以他必须过滤掉csrss smss这些system进程
2016-8-24 15:20
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
这种跳板如何保证效率

如果调试数据没问题

那种1秒几百次上千循环,那一语言那循环恐怖一B

基本要和系统那个读写一样效率,才能保证他们那些循环的效率
2016-8-24 15:28
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
忘记引用了
2016-8-24 15:29
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
21
活该谁让你用易语言写那种循环了。。。易语言本来就不适合用来写跟系统紧密相关的东西
2016-8-24 17:13
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
也就是市面上还有另外一种不是跳板的读写,要不易语言要死

猜测是模拟成系统白名单或者可信进程

决无可能是跳板

跳板注入,调试分析,都不错

强力读写就不行了
2016-8-25 04:57
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
23
进程名叫csrss.exe就行,CF的驱动有点弱智用PsGetProcessImageFileName判断csrss的
2016-8-25 22:08
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
那么弱。。。
2016-8-26 07:07
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
对于64位,某些地址写内存的时候,确实可以写进去,然后整个内存块的代码都跟着秒变了,接下来就会导致进程运行乱码而崩溃(暂停就不会崩溃)
由于未发现内核Hook,所以很可能被VT给隐藏了
结果是下cc断点也会秒崩溃,反调试和防止写内存两不误
2016-10-24 22:32
0
游客
登录 | 注册 方可回帖
返回
//