paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
阅读:3845回复:20

文件过滤驱动是否能在系统启动的时候创建读写自己的日志文件?百分相送,需要完整的例子。

楼主#
更多 发布于:2005-02-03 16:43
文件过滤驱动是否能在系统启动的时候创建读写自己的日志文件,例如拦截IRP_MJ_CREATE,当系统调用KERNEL32.dll时候进入我的MyCreate函数中,这个时候我将文件名写入日志,这个时候会蓝屏并自动reboot,有谁知道为什么?怎么解决这个问题?百分相送,需要完整的例子。filter@redsec.org

注释:当启动启动完也就是显示出桌面的时候读写日志文件操作一切正常,读写操作用ZwCreateFile,ZwWriteFile,ZwReadFile函数完成。
驱动启动类型为start:0



[编辑 -  2/7/05 by  paladinii]

最新喜欢:

likepslikeps cyliucyliu
Ideas for life!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-03 21:03
怎么没人应答阿?再加100分。牛人们现身吧。别告诉我这个问题在这里解决不了,还得去OSR?
Ideas for life!
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-04 00:20
首先,文件过滤驱动应该不能引导启动。你可以把START 设置为 1 由I/O系统启动。

我以前写过一个把IRP_MJ_CREATE里拦截到文件名写到一个你指定的文件中。我是用一个系统线程来写文件。这种方法是可以实现的。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-04 09:52
谢谢duanran的回答,能不能把你的例子发给我参考一下,或者写文件的线程的片断也可。谢谢! paladin@redsec.org
Ideas for life!
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-04 13:49
typedef struct _FILELIST {
     TCHAR  szFullPathName[PATH_LEN + 1];
     LIST_ENTRY FileListNext;
}FILELIST, *PFILELIST;

typedef struct _GLOBALS_FILELIST_INFO {
  HANDLE       g_FileListHandle;
  PVOID        g_ThreadObject;
  BOOLEAN      g_ThreadShouldStop;
  KEVENT       g_FileListEvent;
  LIST_ENTRY   g_FileListHead;
  KSPIN_LOCK   g_FileListSpinLock;
}GLOBALS_FILELIST_INFO, *PGLOBALS_FILELIST_INFO;

static GLOBALS_FILELIST_INFO   g_FileList_Info;


VOID
FileListThread (IN PVOID Context)
{
 ULONG uWriteSize = PATH_LEN * sizeof(TCHAR);
 PLIST_ENTRY  ListEntry = NULL;
 PFILELIST    pFileListNode = NULL;
 IO_STATUS_BLOCK IoStatusBlock;
 PGLOBALS_FILELIST_INFO pFileListInfo = (PGLOBALS_FILELIST_INFO)Context;
 
 KeSetPriorityThread(
             KeGetCurrentThread(),
             LOW_REALTIME_PRIORITY);

              
 while( TRUE )
 {
      KeWaitForSingleObject(
              &pFileListInfo->g_FileListEvent,
              Executive,
              KernelMode,
              FALSE,
              NULL );
     
      while( ListEntry = ExInterlockedRemoveHeadList (
                &pFileListInfo->g_FileListHead,
                &pFileListInfo->g_FileListSpinLock) )
      {
           pFileListNode = (PFILELIST)CONTAINING_RECORD(ListEntry, FILELIST, FileListNext);
           
           ZwWriteFile(
                         pFileListInfo->g_FileListHandle,
                         NULL,
                         NULL,
                         NULL,
                         &IoStatusBlock,
                         pFileListNode->szFullPathName,
                         uWriteSize,
                         NULL,
                         NULL );
                  
                   ExFreePool(pFileListNode);      
      }
      if( pFileListInfo->g_ThreadShouldStop ) {
        ZwClose(pFileListInfo->g_FileListHandle);
        PsTerminateSystemThread(STATUS_SUCCESS);
      }                                
 }
}


NTSTATUS FileListOpenFile(WCHAR *wFileName)
{
    NTSTATUS ntstatus = STATUS_SUCCESS;
    UNICODE_STRING uniFileName;
    IO_STATUS_BLOCK IoStatusBlock;
    OBJECT_ATTRIBUTES ObjectAttributes;
  
    RtlInitUnicodeString(&uniFileName, wFileName);
    
    InitializeObjectAttributes(
        &ObjectAttributes,
        &uniFileName,
        OBJ_CASE_INSENSITIVE,
        NULL,
        NULL
    );

    ntstatus = ZwCreateFile(&g_FileList_Info.g_FileListHandle,
        GENERIC_READ | GENERIC_WRITE,
        &ObjectAttributes,
        &IoStatusBlock,
        0,
        FILE_ATTRIBUTE_NORMAL,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        FILE_OVERWRITE_IF,
        FILE_SYNCHRONOUS_IO_NONALERT,
        NULL,
        0
    );
    
    if( !NT_SUCCESS(ntstatus) ) {
        //DbgPrint("Cannot ZwCreateFile %S : 0x%x\n", wFileName, ntstatus);  
    }                      
 return ntstatus;
}  

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
    .............
    
    
    ntStatus = FileListOpenFile(wFileName);
    if (!NT_SUCCESS(ntStatus)){
      //DbgPrint("Cannot Open FileList.lst\n");
    }
    
    KeInitializeSpinLock(&g_FileList_Info.g_FileListSpinLock);
    KeInitializeEvent(
        &g_FileList_Info.g_FileListEvent,
        SynchronizationEvent,
        FALSE );
    InitializeListHead(&g_FileList_Info.g_FileListHead);
    
    g_FileList_Info.g_ThreadShouldStop = FALSE;
 
    ntStatus = PsCreateSystemThread(
                 &thread_handle,
                 (ACCESS_MASK) 0L,
                  NULL,
                  NULL,
                  NULL,
                  FileListThread,
                  &g_FileList_Info );
    if (!NT_SUCCESS(ntStatus)){
      //DbgPrint("FileMon: Create System Thread Failed\n");
    }
  
    ntStatus = ObReferenceObjectByHandle(
                 thread_handle,
                 THREAD_ALL_ACCESS,
                 NULL,
                 KernelMode,
                 &g_FileList_Info.g_ThreadObject,
                 NULL );
    if (!NT_SUCCESS(ntStatus))
    {
        ZwClose(thread_handle);
        g_FileList_Info.g_ThreadShouldStop = TRUE;

        KeSetEvent(
            &g_FileList_Info.g_FileListEvent,
            (KPRIORITY) 0,
            FALSE);
    }

    ZwClose(thread_handle);  
}

IRP_MJ_CREATE Routine 里加入下面代码

  if( IsTerminateThread == FALSE )
  {
      pFileListNode = (PFILELIST)ExAllocatePool(NonPagedPool, sizeof(FILELIST));
 if( pFileListNode != NULL )
 {                        
     memset(pFileListNode->szFullPathName, 0, sizeof(pFileListNode->szFullPathName));
     
     // fullPathName 是在IRP_MJ_CREATE中得到的文件完整路径
     _tcsncpy(pFileListNode->szFullPathName, fullPathName, PATH_LEN);
           
     ExInterlockedInsertTailList(
     &g_FileList_Info.g_FileListHead,
     &pFileListNode->FileListNext,
     &g_FileList_Info.g_FileListSpinLock );
                             
     KeSetEvent(
               &g_FileList_Info.g_FileListEvent,
                (KPRIORITY) 0,
                FALSE);
 }
else
{
   g_FileList_Info.g_ThreadShouldStop = TRUE;

      KeSetEvent(
           &g_FileList_Info.g_FileListEvent,
           (KPRIORITY) 0,
            FALSE);
}
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-04 17:43
会不会有IRP_MJ_CREATE重入的问题?
恳请把完整的代码发给我的邮箱里 谢谢!

对了,先给分,目前只能给50分,我会再开几个贴子,到时你只要随便留言我就会给分的。

[编辑 -  2/4/05 by  paladinii]
Ideas for life!
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-02-04 23:50
你说的很对。
所以我在驱动入口中用ZwCreateFile来打开你要写的文件,然后用全局变量来保存句柄。系统线程只用来写文件,这样就避开IRP_MJ_CREATE的重入问题了。
你用FILEMON把我贴子中的代码加入相应的地方就可以了。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-02-05 09:26
ok, 我去试试。
Ideas for life!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-02-06 13:22
还有个问题,如果我每次要打开的文件都不同该怎么处理呢?或者说我想截获类似kernel32.DLL等这样的系统文件调用,然后我先去打开该文件,然后才向下传递给底层的文件驱动。这个时候该怎么处理呢?
另外,怎样保证我的过滤驱动在kernel32.dll之前启动,请高人指点,分数仍然有效。想要多少分都可以,只要有本事拿就行。最好附有例子代码或者发到我信箱。 filter@redsec.org

[编辑 -  2/6/05 by  paladinii]

[编辑 -  2/7/05 by  paladinii]
Ideas for life!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-02-07 18:37
大家是不是都准备过年了?自己顶!
祝大家新春愉快,身体健康!
来年到这里转转,有能耐的给回个贴子,很急阿!大虾们。
Ideas for life!
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-02-08 17:36
自己构造IRP。
设置驱动是IO系统启动,并加入FILE SYSTEM组,应该可以保证在KERNEL.DLL之前启动。我曾经可以记录到KERNEL.DLL的加载。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-02-09 13:55
感谢楼上兄弟,不过能否说的详细点?
设置驱动是IO系统启动,并加入FILE SYSTEM组,应该可以保证在KERNEL.DLL之前启动。我曾经可以记录到KERNEL.DLL的加载。
Ideas for life!
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-02-10 21:47
在你的驱动注册表键值里。start = 1 Group = FILE SYSTEM

这里需要注意几个问题,我是曾经遇到过的,我也一起贴上来。

驱动的启动类型为I/O启动时(Start = 1),在驱动入口点需要注意以下问题:
   当I/O系统启动Start为1的驱动时,这时windows系统正在完成Ntoskrnl第二个启动阶段的工作,在此时注册表只有HAREWARE和SYSTEM两个键值。对象管理器创建了名字空间跟目录、ObjectType目录、\??目录和链接到\??目录的\DosDevices。
  
   所以在写驱动入口例程时,我们不能对注册表其他键值进行访问;不能创建命名对象因为这时对象管理器名字空间没有BaseNameObjects这个目录。
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-02-16 10:39
 duanran:
驱动的启动类型为I/O启动时(Start = 1),在驱动入口点需要注意以下问题:
当I/O系统启动Start为1的驱动时,这时windows系统正在完成Ntoskrnl第二个启动阶段的工作,在此时注册表只有HAREWARE和SYSTEM两个键值。对象管理器创建了名字空间跟目录、ObjectType目录、??目录和链接到??目录的DosDevices。


这些你是怎么知道的?是自己总结的经验?跟踪调试的结论还是看其他的资料得出的?有没有相关的资料或者书籍介绍一下,谢谢!
Ideas for life!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-02-16 18:49
自己顶!!!

[编辑 -  2/19/05 by  paladinii]
Ideas for life!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-02-19 18:54
各位大虾有好招没有??
Ideas for life!
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-02-26 10:26
自己在顶!
Ideas for life!
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-03-02 08:50
duanran: [quote]驱动的启动类型为I/O启动时(Start = 1),在驱动入口点需要注意以下问题:
当I/O系统启动Start为1的驱动时,这时windows系统正在完成Ntoskrnl第二个启动阶段的工作,在此时注册表只有HAREWARE和SYSTEM两个键值。对象管理器创建了名字空间跟目录、ObjectType目录、??目录和链接到??目录的DosDevices。


这些你是怎么知道的?是自己总结的经验?跟踪调试的结论还是看其他的资料得出的?有没有相关的资料或者书籍介绍一下,谢谢! [/quote]
是啊,教我们学习的方法和解决我们的问题是同样重要的。大侠能告诉方法么?
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-03-02 09:21
呵呵,我问的这个问题有点弱了。自己问完才发现难怪没有人回答。cicada, 我来给你回答吧。
Windows Internals 有详细的介绍I/O管理器、对象管理器怎么来创建名字空间。最后,详细介绍了系统引导的过程。建议你看看这本书。
Ideas for life!
xuAmigo
驱动小牛
驱动小牛
  • 注册日期2004-11-11
  • 最后登录2006-01-12
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-06-25 14:46
我参考了这里的代码,但结果是ZwCreateFile()打开文件成功,但ZwWriteFile()不成功,不知为什么
上一页
游客

返回顶部