首页
社区
课程
招聘
[求助] 在内核用NrCreateFile创建一个文件, 返回0xc000000d.
发表于: 2012-5-29 18:34 7339

[求助] 在内核用NrCreateFile创建一个文件, 返回0xc000000d.

2012-5-29 18:34
7339
在sstd里。  hook  NtCreateFile,  如果生产的 .txt 文件。 就文件路径记录在 C:\CreateFile.txt 里.
       在调用 NtCreateFile ,失败! 具体代码如下:

   
     
NTSTATUS myNtCreateFile(
        __out     PHANDLE FileHandle,
        __in      ACCESS_MASK DesiredAccess,
        __in      POBJECT_ATTRIBUTES ObjectAttributes,
        __out     PIO_STATUS_BLOCK IoStatusBlock,
        __in_opt  PLARGE_INTEGER AllocationSize,
        __in      ULONG FileAttributes,
        __in      ULONG ShareAccess,
        __in      ULONG CreateDisposition,
        __in      ULONG CreateOptions,
        __in_opt  PVOID EaBuffer,
        __in      ULONG EaLength
        )
{
        NTSTATUS status;
        const wchar_t* pFileName;
        status=OldNtCreateFile(
                __out     FileHandle,
                __in      DesiredAccess,
                __in      ObjectAttributes,
                __out     IoStatusBlock,
                __in_opt  AllocationSize,
                __in      FileAttributes,
                __in      ShareAccess,
                __in      CreateDisposition,
                __in      CreateOptions,
                __in_opt  EaBuffer,
                __in      EaLength);
        if( ObjectAttributes && ObjectAttributes->ObjectName &&
                wcsstr( ObjectAttributes->ObjectName->Buffer, L".txt") ) {
                // PutFile(L"\\??\\C:\\CreateFile.txt", ObjectAttributes->ObjectName->Buffer, ObjectAttributes->ObjectName->Lenght  ,FILE_OPEN_IF );
                PutFile(L"\\??\\C:\\CreateFile.txt", L"\r\n", 4 ,FILE_OPEN_IF );
                KdPrint( ("NtCreateFile %wZ\n", *(ObjectAttributes->ObjectName) ) );
        }
        return status;

        pFileName = fsGetFilenameByHandle( FileHandle );
        if( pFileName ) {
        }
        if(FsGetFilenameByHandle(FileHandle,FILER_SRING_NAME))
        {
                DbgPrint("open by myNtCreateFile");
        }

NTSTATUS PutFile( const WCHAR* filename, const void* buffer, ULONG buffersize, ULONG uOpenFlag )
{
        NTSTATUS                        rc,s;
        HANDLE                                hStream;
        OBJECT_ATTRIBUTES        ObjectAttr;
        UNICODE_STRING                FileName;
        CHAR                                str[256];
        PFILE_OBJECT ObjectHeader;
        IO_STATUS_BLOCK                ioStatusBlock;     
        IO_STATUS_BLOCK file_status;
        FILE_STANDARD_INFORMATION fsi;
        FILE_POSITION_INFORMATION fpi;

        RtlInitUnicodeString( &FileName, filename );
        InitializeObjectAttributes( &ObjectAttr, &FileName,
                OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,        NULL);       
        rc = NtCreateFile( &hStream, GENERIC_ALL,
                &ObjectAttr,               
                &ioStatusBlock,
                NULL,
                FILE_ATTRIBUTE_NORMAL,
                FILE_SHARE_READ,
                uOpenFlag,
                FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
                NULL,
                0);

        if ( rc != STATUS_SUCCESS )
        {
                DbgPrint( "comint32:() NtCreateFile() failed.rc = %0x, status = %0x" , rc, ioStatusBlock.Status );
                return( STATUS_UNSUCCESSFUL );
        }
        //////////////////////////////////////////////////////////////////////////
        if( FILE_CREATE != uOpenFlag ) {
                //获取文件基本信息
                ZwQueryInformationFile(hStream, &file_status, &fsi, sizeof(FILE_STANDARD_INFORMATION), FileStandardInformation);
                fpi.CurrentByteOffset = fsi.EndOfFile;    //设置文件指针信息结构中的当前偏移的值 为获取的标准信息结构的文件偏移的尾部   
                //使用文件指针信息结构去设置当前打开的文件对象文件信息
                ZwSetInformationFile(hStream, &file_status, &fpi, sizeof(FILE_POSITION_INFORMATION), FilePositionInformation);

        }

        s = ObReferenceObjectByHandle(hStream, FILE_READ_DATA,0 ,KernelMode, &ObjectHeader, NULL);
        if (NT_SUCCESS(s))
        {
        //        ObjectHeader = IoGetRelatedDeviceObject(ReferencedObject);
                if (ObjectHeader->Type == FILE_DEVICE_DATALINK)   //是文件对象 FILE_DEVICE_DATALINK
                {
                        DbgPrint("file object name: %ws\n",ObjectHeader->FileName.Buffer);
                }
        }
        ///////

        rc = NtWriteFile(
                hStream,
                NULL,
                NULL,
                NULL,
                &ioStatusBlock,
                buffer,
                buffersize,
                NULL,
                NULL );

        if ( rc != STATUS_SUCCESS )
        {
                        DbgPrint( "comint32: NtWriteFile() failed.\n" );
                //        _snprintf( string, 255, "comint32: rc = %0x, status = %0x\n", rc, ioStatusBlock.Status );
                //        DbgPrint( string );
                ZwClose( hStream );
                return( STATUS_UNSUCCESSFUL );
        }

        ZwClose( hStream );
        return( STATUS_SUCCESS );
}
           在putFile 调用时NtCreateFile , 返回0xC0000005, 无效的参数,请问要如何解决?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
2
FILE_SHARE_READ | FILE_SHARE_WRITE试下
2012-5-29 21:52
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
NtCreateFile 换成 ZwCreateFile 看看
2012-5-29 23:06
0
雪    币: 127
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
同LS哥们。。
2012-5-29 23:39
0
雪    币: 114
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
推荐使用Zw那个函数,而且是另外开个线程去写,因为函数运行在特定的中断请求级别上,如果不知道代码,网上有现成的,去搜下rootkit,windows内核安全那本书的源码,上面有完整的事例子。
2012-5-30 00:44
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
基础不扎实啊,改成Zw,原因是Nt系列的不会去检查previous mode
具体情况本论坛找下这两个不同开头函数得区别…
2012-5-30 03:09
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
因为查了相关的资料说是。 NtXXX函数,可以绕过SSDT 的HOOK. 使用ZwXXX函数,是不可以的.
所以打算这个NtXXX函数来实现,这个写操作~
比较奇怪的是。 在 DriverEntry 里调用此函数,是可以成功写入的。在 myHook函数,是失败,
中级别都是PASSIVE_LEVEL , 请解释这是由于什么问题引起的?
2012-5-30 03:27
0
雪    币: 127
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
用Zw*是因为它会建立陷阱帧,改变当前线程的KTHREAD的previous mode,然后调用对应的Nt*,Nt*几乎都是代码开头验证previous mode,如果previous mode是用户模式,那么要用MmProbeForXXX之类的检查参数的。如果是previous mode内核模式,那么便不检查。 你在那个HOOK了ntcreatefile,用户模式来调用createfile,进入你的HOOK,previous mode为usermode,但是你putfile调用ntcreatefile 所用的参数是内核空间的,mmprobeforXXX你逆过没?专门拿来验证ring3空间的~你一个内核模式的空间被mmprobeforxxx验证,然后就被refuse了~

当然咯,你可以用zw去处理,但是要处理重入问题(参数标记啊,工作线程啊,很简单的),也可以依然用nt去处理,不过要手动该搞previous mode,对了~还可以用IoCreateFile……

printf("星际迷航的演员演技太搓了,还没苍老师牛!");


吐槽完毕,睡觉~
2012-5-30 04:51
0
雪    币: 219
活跃值: (798)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
9
InitializeObjectAttributes
2012-5-30 07:03
0
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
10
BS LS来刷贴
2012-5-30 14:20
0
游客
登录 | 注册 方可回帖
返回
//