首页
论坛
专栏
课程

[求助]驱动加载后删除sys文件

2018-9-18 16:48 4086

[求助]驱动加载后删除sys文件

2018-9-18 16:48
4086

Win64, 我观察了一下PCHunter64.exe, 他好像在启动时会从 exe中解压 extract 出一个 PCHunter64ap.sys来,然后加载驱动到内核。加载之后就把sys文件删除了。我看到过中间解压出来的  PCHunter64ap.sys 瞬间出现在硬盘上,后来又不见了。做的比较隐秘。


我自己加载驱动的话,也就是 OpenSCManager,  CreateService / OpenService , then StartService 这套。但是我发现我的helloworld.sys被加载后,但我删除不了硬盘上的sys文件。 朋友们能不能说一下, PCHunter是怎么做到的?


另外除了以上这套,还有什么加载驱动的方法,比如传说中能绕过NtLoadDriver的,Win64中。



[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (14)
萌克力 2018-9-18 16:54
2
0
w7加载了可以直接删 
lononan 2018-9-18 17:24
3
0
https://bbs.pediy.com/thread-136033.htm
放学打我不 1 2018-9-18 20:04
4
0
PUNICODE_STRING pusDriverPath = NULL;
pusDriverPath = &((PKLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection)->FullDllName;
DelDriverFile(pusDriverPath);


NTSTATUS DelDriverFile(PUNICODE_STRING pUsDriverPath)
    {
        IO_STATUS_BLOCK IoStatusBlock;
        HANDLE FileHandle;
        OBJECT_ATTRIBUTES ObjectAttributes;
        InitializeObjectAttributes(
            &ObjectAttributes,
            pUsDriverPath,
            OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
            0,
            0);

        NTSTATUS Status = IoCreateFileEx(&FileHandle,
            SYNCHRONIZE | DELETE,
            &ObjectAttributes,
            &IoStatusBlock,
            nullptr,
            FILE_ATTRIBUTE_NORMAL,
            FILE_SHARE_DELETE,
            FILE_OPEN,
            FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT,
            nullptr,
            0,
            CreateFileTypeNone,
            nullptr,
            IO_NO_PARAMETER_CHECKING,
            nullptr);

        if (!NT_SUCCESS(Status))
        {
            return Status;
        }

        PFILE_OBJECT FileObject;
        Status = ObReferenceObjectByHandleWithTag(FileHandle,
            SYNCHRONIZE | DELETE,
            *IoFileObjectType,
            KernelMode,
            'eliF',
            reinterpret_cast<PVOID*>(&FileObject),
            nullptr);
        if (!NT_SUCCESS(Status))
        {
            ObCloseHandle(FileHandle, KernelMode);
            return Status;
        }

        const PSECTION_OBJECT_POINTERS SectionObjectPointer = FileObject->SectionObjectPointer;
        SectionObjectPointer->ImageSectionObject = nullptr;

        // call MmFlushImageSection, make think no backing image and let NTFS to release file lock
        CONST BOOLEAN ImageSectionFlushed = MmFlushImageSection(SectionObjectPointer, MmFlushForDelete);

        ObfDereferenceObject(FileObject);
        ObCloseHandle(FileHandle, KernelMode);

        if (ImageSectionFlushed)
        {
            // chicken fried rice
            Status = ZwDeleteFile(&ObjectAttributes);
            if (NT_SUCCESS(Status))
            {
                return Status;
            }
        }
        return Status;
    }
切糕茶叶蛋 2018-9-20 13:04
5
0
@放学打我不, 太感谢了,正是我需要的。
还有,有没有办法不在硬盘上释放sys映像,而通过内存方式加载驱动啊?就跟进程空间注入一样,手动virtualalloc writememory & symbol relocation 来模拟LoadLibrary。

btw, 大神你的资料是哪来的?我想系统性地学习一下软驱动。 (与物理设备无关)
轩辕之风 1 2018-9-20 13:33
6
0
直接去写services注册表(当然你得有权限写才行)重启也可以加载,走IopInitializeBuiltinDriver
除了这些,你还可以利用Ring0的任意代码执行漏洞,把代码写入内核空间去执行
wowocock 1 2018-9-20 16:21
7
0
blackbone
放学打我不 1 2018-9-20 17:00
8
0
切糕茶叶蛋 @放学打我不, 太感谢了,正是我需要的。 还有,有没有办法不在硬盘上释放sys映像,而通过内存方式加载驱动啊?就跟进程空间注入一样,手动virtualalloc writememory & ...
1.利用下capcom.sys 但是capcom.sys落盘了
2.写一个loader.sys loader里面使用wsk 从网络下载驱动文件不落盘 直接在内存中 然后你懂的 结果loader.sys落盘了
哎呀 好烦 都落盘了.
shayi 9 2018-9-20 17:20
9
0
原理:
加载后通过 PCHunter64ap.sys 的驱动对象,取得完整文件名称,然后调用  DelDriverFile() 删除磁盘上驱动文件。

DelDriverFile() 用 IoCreateFileEx() 打开 PCHunter64ap.sys 的驱动文件 ->  ObReferenceObjectByHandleWithTag() 引用其 FileObject -> 取得 SectionObject 指针,并将 ImageSectionObject 置 NULL -> 让 MmFlushImageSection() 冲刷掉 ImageSection 释放文件锁 (可能类似禁用 PCHunter64ap.sys 映射文件)-> 解引 FileObject,关闭句柄 -> 一旦冲刷成功,通过  ZwDeleteFile() 删除文件。
最后于 2018-9-20 17:24 被shayi编辑 ,原因:
Ox9A82 3 2018-9-20 17:22
10
0
shayi 原理: 加载后通过 PCHunter64ap.sys 的驱动对象,取得完整文件名称,然后调用 DelDriverFile() 删除磁盘上驱动文件。 DelDriverFile() 用 IoC ...
shayi 9 2018-9-20 17:26
11
0
Ox9A82
看4楼大神源码说故事罢了
放学打我不 1 2018-9-20 17:38
12
0
绕过NtLoadDriver win64上方法有点少吧
你可以用内核帮你load
调用FilterLoad 不过你的注册表要注意下 因为只加载minifilter驱动
原理就是发送一个ioctl到内核 然后内核帮你从内核调用zwloaddriver
卸载调用FilterUnload
切糕茶叶蛋 2018-9-21 15:09
13
0
放学打我不 绕过NtLoadDriver win64上方法有点少吧 你可以用内核帮你load 调用FilterLoad 不过你的注册表要注意下 因为只加载minifilter驱动 原理就是发送一个ioctl ...
嗯,大致明白了,总之直接 Ring3 层发起的API是不行的。 
总之要么先写个驱动进内核,一进内核态就权力无限自由发挥了,所以相当于自己在内核中加了一个内存 Loader。
要么借助已有的 capcom.sys等的跳板,原理同上。
木志本柯 2019-2-8 16:16
14
0
楼主用什么工具看的,居然能看见PCHunter64释放驱动的瞬间???
bxb 2019-2-11 16:01
15
0

最后于 2019-2-13 11:14 被bxb编辑 ,原因:
游客
登录 | 注册 方可回帖
返回