最近看了以前论坛上的一位大牛写的一篇文章:另一中读写进程内存空间的方法,上面提到的方法很简单,只要切换页目录基址就可以了,我于是乎就开始动手写代码了,可是运行起来就蓝屏了,奇怪的是,并不是每一次运行都蓝屏,只有蓝屏以后再重启了进入桌面之后如果系统不提示错误(也就是不弹出一个系统出错的对话框:说什么系统刚从一个严重的错误中恢复过来),那么再次运行这个驱动就会又一次蓝屏,如果系统提示出错,那么再一次运行这个驱动就不会蓝屏,而且能实现预期的功能.大家说是不是很奇怪呢????
不知道啥原因啊???望高手指点一二啊
蓝屏之后:屏幕上的有一行信息是:DRIVER_IRQL_LESS_OR_EQUAL(应该是这个,现在又不蓝屏了,我看不到了,真郁闷
)
附上驱动代码,代码很短的:
#include <ntddk.h>
VOID NT_unload(IN PDRIVER_OBJECT pDriverObject)
{
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pdriverobj,IN PUNICODE_STRING pregstring)
{
int pEPROCESS,p,_cr3;
pdriverobj->DriverUnload=NT_unload;
pEPROCESS=(int)IoGetCurrentProcess();
p=pEPROCESS;
do
{
p=*(int *)(p+0x88)-0x88; //这一句得到进程EPROCESS的指针
//下面是找111.exe这个进程,找到之后就把0x400000这个地址处的4个字节都写成0
if(strcmp((char *)(p+0x174),"111.exe")==0)
{
p=*(int *)(p+0x18); //这一句得到页目录的基址
__asm
{
cli
mov eax,cr3
mov _cr3,eax
mov eax,p
mov cr3,eax
}
p=0x400000;
__try
{
*(int *)p=0;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
DbgPrint("读写0x400000地址时发生错误\n");
}
__asm
{
mov eax,_cr3
mov cr3,eax
sti
}
break;
}
}while(p!=pEPROCESS);
return STATUS_SUCCESS;
}
这段代码运行起来还有个情况,我说一下:上面加了异常处理的模块,还是会蓝屏,难道给CR3寄存器赋值也会蓝屏??????
一定要先运行111.exe这个程序,然后在启动驱动程序
程序的功能是:找111.exe这个进程,找到之后就把0x400000这个地址处的4个字节都写成0
我也调试了,还是找不原因哦!!!!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!