首页
社区
课程
招聘
[求助]蓝屏四天,欲哭。。。
发表于: 2011-2-26 00:53 7758

[求助]蓝屏四天,欲哭。。。

2011-2-26 00:53
7758
我本来是驱动初学不久,因为参加信息安全比赛做点东西,只能超越现阶段能力,其中就有SSDT HOOK文件操作,当然,HOOK 实现来自网上标准方法。但是问题来了:我在HOOK 了ZwWriteFile后,自己的实现老是蓝屏,开始比较简单,问题不大,后来加了一些代码,越蓝越离谱,最后竟然连我注释掉了一个没有用到的变量都会蓝屏。。。。下面是实现:
/****************************************************///HookNtWriteFile,HOOK写文件
HookZwWriteFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID Buffer,
IN ULONG Length,
IN PLARGE_INTEGER ByteOffset OPTIONAL,
IN PULONG Key OPTIONAL
)
{
    if (TurnOnFileMon==1)//如果功能开启的话
    {
       char aProcessName[PROCNAMELEN];
       UNICODE_STRING volumeDosName={0};  
       PCWSTR WriteFileName;
       PFILE_OBJECT fileobj;
       UNICODE_STRING uProcessPath={0};//进程路径
       ANSI_STRING aProcessPath={0};//进程路径
       if ( FileHandle != NULL)
       {
          /**************************************************************************///进程信息获取
          PCWSTR ProcessName = GetCurrentProcessFileName();
          RtlInitUnicodeString(&uProcessPath,ProcessName);
          RtlUnicodeStringToAnsiString(&aProcessPath,&uProcessPath,TRUE);
          /**************************************************************************/
          {
              ANSI_STRING apath;//文件路径,不含驱动器
              UNICODE_STRING upath;
              ANSI_STRING apathpre;//驱动器
              UNICODE_STRING upathpre;
              /****************************************///得到文件名
              ObReferenceObjectByHandle(FileHandle,GENERIC_READ,*IoFileObjectType,KernelMode,(PVOID *)&fileobj,NULL);
              WriteFileName=fileobj->FileName.Buffer;
              RtlInitUnicodeString(&upath,WriteFileName);
              RtlUnicodeStringToAnsiString(&apath,&upath,TRUE);
              /****************************************/
              {
                   IoVolumeDeviceToDosName(((PFILE_OBJECT)fileobj)->DeviceObject, &volumeDosName);
                   if(&volumeDosName!=NULL && (volumeDosName.Length<=6))
                   {
                        // 此处转换 盘符
                        RtlInitUnicodeString(&upathpre,volumeDosName.Buffer);
                        RtlUnicodeStringToAnsiString(&apathpre,&upathpre,TRUE);
                        KdPrint(("%s修改文件:%s%s \r\n",aProcessPath.Buffer,apathpre.Buffer,apath.Buffer));
                        
                        strcpy(cmpfile,apathpre.Buffer);
                        strcat(cmpfile,apath.Buffer);
                        ///////
                        memset(Dir_Path,0,256);
                        strcpy(Dir_Path,cmpfile);
                        GetDir();
                        
                        if(CmpDir(Dir_Path)==1)//目录比对
                        {   
                             strcpy(aPathName,apathpre.Buffer);
                             strcat(aPathName,apath.Buffer);

                             strcpy(aProcessName,aProcessPath.Buffer);
                             strcat(aProcessName,"##");
                             if (GoOrNot(aProcessName,aPathName))
                             {
                                return RealZwWriteFile(FileHandle, Event OPTIONAL, ApcRoutine OPTIONAL, ApcContext OPTIONAL, IoStatusBlock, Buffer, Length, ByteOffset OPTIONAL, Key OPTIONAL );
                             }
                             else
                             {
                                FileHandle = NULL;
                                return STATUS_ACCESS_DENIED;
                             }
                        }
                        
                        if(CmpFile(cmpfile)==1)//文件比对
                        {   
                             strcpy(aPathName,apathpre.Buffer);
                             strcat(aPathName,apath.Buffer);

                             strcpy(aProcessName,aProcessPath.Buffer);
                             strcat(aProcessName,"##");
                             if (GoOrNot(aProcessName,aPathName))
                             {
                                return RealZwWriteFile(FileHandle, Event OPTIONAL, ApcRoutine OPTIONAL, ApcContext OPTIONAL, IoStatusBlock, Buffer, Length, ByteOffset OPTIONAL, Key OPTIONAL );
                             }
                             else
                             {
                                FileHandle = NULL;
                                return STATUS_ACCESS_DENIED;
                             }
                        }
                        /*else
                            return RealZwWriteFile(FileHandle, Event OPTIONAL, ApcRoutine OPTIONAL, ApcContext OPTIONAL, IoStatusBlock, Buffer, Length, ByteOffset OPTIONAL, Key OPTIONAL );*/
                   }
                   /*else
                       return RealZwWriteFile(FileHandle, Event OPTIONAL, ApcRoutine OPTIONAL, ApcContext OPTIONAL, IoStatusBlock, Buffer, Length, ByteOffset OPTIONAL, Key OPTIONAL );*/
               }
           }
       }
       else
           return RealZwWriteFile(FileHandle, Event OPTIONAL, ApcRoutine OPTIONAL, ApcContext OPTIONAL, IoStatusBlock, Buffer, Length, ByteOffset OPTIONAL, Key OPTIONAL );
    }
    else
        return RealZwWriteFile(FileHandle, Event OPTIONAL, ApcRoutine OPTIONAL, ApcContext OPTIONAL, IoStatusBlock, Buffer, Length, ByteOffset OPTIONAL, Key OPTIONAL );
}

说明
1、GetDir();用来从文件全路径分离出不含文件名的路径
2、if(CmpDir(Dir_Path)==1)//目录比对
     if(CmpFile(cmpfile)==1)//文件比对
      用来进行链表比对,我在HookZwSetInformationFile也用到了,没有问 题
3、///进程信息获取那一段函数在别处也用到,应该没问题早期问题是用程序进行写操作没问题,但是打开我的电脑就蓝屏,后来一打开监控就蓝屏。。。。环境:虚拟机 WIN XP  SP3 +真机,谢谢了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
/****************************************///得到文件名
              ObReferenceObjectByHandle(FileHandle,0,0,KernelMode,(PVOID *)&fileobj,NULL);
这样试一下。我以前hook这个的时候老蓝屏,这样改就好了。
2011-2-26 03:59
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
3
还是蓝屏,蓝屏错误信息是a driver has overrun a stack-based buffer,跟堆栈有关?
2011-2-26 18:40
0
雪    币: 1149
活跃值: (833)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
4
lz 照片是你本人么?很是好奇。。。
2011-2-26 19:17
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
5
肯定不是啦…唉…蓝屏啊
2011-2-26 19:51
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
char aProcessName[PROCNAMELEN];   
临时变量放在栈中.内核栈只有12kb,你这一个aProcessName就占了几百字节,后边再下去就把栈给耗尽了.

改成PCHAR aProcessName = ExAllocatePool(...);
2011-2-26 21:23
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
7
感谢楼上,改了之后,用其他程序写文件都没问题,但貌似回到了最初的问题,那就是,开启监控,其他都好,但是一进我的电脑就蓝屏……已经初步确定是ZwCreatdFile的问题
2011-2-26 22:57
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
8
蓝屏信息有时是:check to be sure you have adequate disk spaces…
2011-2-27 01:10
0
雪    币: 1163
活跃值: (137)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
9
ProbeForRead( Buffer, Length, sizeof( UCHAR ) );
2011-2-27 03:37
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
10
其大致作用了解了,但不知道怎么用…请问这个驱动蓝屏跟这个有关吗
2011-2-27 08:34
0
雪    币: 862
活跃值: (329)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
11
其余都没问题,就是一开我的电脑就蓝屏,错误信息是check to be sure you have adequate disk spaces… ,是我的HookZwWriteFile有问题,但是不知道哪有问题,已经都改成PCHAR aProcessName = ExAllocatePool(...); 这样的了
2011-3-11 20:22
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
看DUMP文件 清楚指针和地址 清楚自己是否使用释放或者未释放的内存
这三点巩固后再来高驱动 事半功倍的

如果是超越能力其实可以考虑参加下一届信息竞赛?
现在SSDT现在实在太多了  这样对自己提高反而有点拔苗助长
2011-3-12 13:41
0
游客
登录 | 注册 方可回帖
返回
//