编译环境是 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虚拟机自动化脱壳的方法