首页
论坛
课程
招聘
[求助]一个用驱动读写其它进程地址空间时发生的奇怪问题
2009-3-20 14:00 4388

[求助]一个用驱动读写其它进程地址空间时发生的奇怪问题

2009-3-20 14:00
4388
最近看了以前论坛上的一位大牛写的一篇文章:另一中读写进程内存空间的方法,上面提到的方法很简单,只要切换页目录基址就可以了,我于是乎就开始动手写代码了,可是运行起来就蓝屏了,奇怪的是,并不是每一次运行都蓝屏,只有蓝屏以后再重启了进入桌面之后如果系统不提示错误(也就是不弹出一个系统出错的对话框:说什么系统刚从一个严重的错误中恢复过来),那么再次运行这个驱动就会又一次蓝屏,如果系统提示出错,那么再一次运行这个驱动就不会蓝屏,而且能实现预期的功能.大家说是不是很奇怪呢????
不知道啥原因啊???望高手指点一二啊
蓝屏之后:屏幕上的有一行信息是: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
我也调试了,还是找不原因哦!!!!

[培训] 优秀毕业生寄语:恭喜id咸鱼炒白菜拿到远超3W月薪的offer,《安卓高级研修班》火热招生!!!

收藏
点赞0
打赏
分享
最新回复 (5)
雪    币: 225
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mtvwr 活跃值 2009-3-20 14:09
2
0
补充一下啊,我的系统XP SP3(原来是XP2,后来升级的)哦,家庭版的(home edition),是正版的系统
雪    币: 667
活跃值: 活跃值 (56)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
轩辕小聪 活跃值 7 2009-3-20 14:10
3
0
晕,这个代码当时放出来的时候,就只是个POC。
虽然切换了cr3,但是如果访问的地址刚好是在虚拟内存文件中还没有切换到物理内存(你的0x400000是用户态程序地址,这种可能性是存在的),就会出错。而且这种缺页错误,SEH是拦不住的。
雪    币: 225
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mtvwr 活跃值 2009-3-20 14:15
4
0
我的代码是运行DriverEntry例程中的啊,这个时候IRQL=PASSIVE_LEVEL,书上说只有IRQL=DISPATCH_LEVEL的时候,访问不在内存中的页才会导致蓝屏.
请大侠在解释一下我的提问
雪    币: 667
活跃值: 活跃值 (56)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
轩辕小聪 活跃值 7 2009-3-20 14:26
5
0
__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
      }

你在写内存时中断还是禁止的,想想逻辑性都有问题,没中断,哪来的DbgPrint?……
雪    币: 225
活跃值: 活跃值 (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
mtvwr 活跃值 2009-3-20 15:18
6
0
依你之见该怎么弄呢????
游客
登录 | 注册 方可回帖
返回