首页
社区
课程
招聘
[求助]驱动加载后删除sys文件
发表于: 2018-9-18 16:48 10612

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

2018-9-18 16:48
10612

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


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


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


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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 433
活跃值: (1895)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
w7加载了可以直接删 
2018-9-18 16:54
0
雪    币: 7246
活跃值: (5073)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
https://bbs.pediy.com/thread-136033.htm
2018-9-18 17:24
0
雪    币: 4006
活跃值: (626)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
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-18 20:04
0
雪    币: 202
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
@放学打我不, 太感谢了,正是我需要的。
还有,有没有办法不在硬盘上释放sys映像,而通过内存方式加载驱动啊?就跟进程空间注入一样,手动virtualalloc writememory & symbol relocation 来模拟LoadLibrary。

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

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

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