首页
社区
课程
招聘
[原创][福利]隐藏驱动的另一种方法之狸猫换太子,兼容x64
发表于: 2018-4-28 16:37 12456

[原创][福利]隐藏驱动的另一种方法之狸猫换太子,兼容x64

2018-4-28 16:37
12456
你是否还在为x64断链隐藏驱动蓝屏而发愁?
小弟这次来公开一种一直存在却有没人放出来的方法隐藏驱动,可瞒过xt和其他常规检测,稍加处理后,可瞒过更多检测
话不多说,直接上码
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Driver.h
#include <ntddk.h>
#include <windef.h>
#include <stdlib.h>

//定义符号链接,一般来说修改为驱动的名字即可
#define DEVICE_NAME         L"\\Device\\TestDrv"
#define LINK_NAME           L"\\DosDevices\\TestDrv"
#define LINK_GLOBAL_NAME    L"\\DosDevices\\Global\\TestDrv"

//定义驱动功能号和名字,提供接口给应用程序调用
#define IOCTL_IO_TEST       CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SAY_HELLO     CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
typedef struct _LDR_DATA_TABLE_ENTRY {
    LIST_ENTRY InLoadOrderLinks;
    LIST_ENTRY InMemoryOrderLinks;
    LIST_ENTRY InInitializationOrderLinks;
    PVOID DllBase;
    PVOID EntryPoint;
    ULONG SizeOfImage;
    UNICODE_STRING FullDllName;
    UNICODE_STRING BaseDllName;
    ULONG Flags;
    USHORT LoadCount;
    USHORT TlsIndex;
    union {
        LIST_ENTRY HashLinks;
        struct {
            PVOID SectionPointer;
            ULONG CheckSum;
        };
    };
    union {
        struct {
            ULONG TimeDateStamp;
        };
        struct {
            PVOID LoadedImports;
        };
    };

    PVOID PatchInformation;

} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

Driver.c

#include "driver.h"
//此模板来自Tesla.Angela
//HideDrv By isdebug
typedef VOID (NTAPI* pfn_MiProcessLoaderEntry) (IN PLDR_DATA_TABLE_ENTRY LdrEntry, IN BOOLEAN Insert);
//nt!MiProcessLoaderEntry:
//fffff800`04169780 48895c2408      mov     qword ptr[rsp + 8], rbx
//fffff800`04169785 48896c2418      mov     qword ptr[rsp + 18h], rbp
//fffff800`0416978a 4889742420      mov     qword ptr[rsp + 20h], rsi
//fffff800`0416978f 57              push    rdi
//fffff800`04169790 4154            push    r12
//fffff800`04169792 4155            push    r13
//fffff800`04169794 4156            push    r14
//fffff800`04169796 4157            push    r15
//fffff800`04169798 4883ec30        sub     rsp, 30h
//fffff800`0416979c 488bf9          mov     rdi, rcx
//fffff800`0416979f 448bf2          mov     r14d, edx
//fffff800`041697a2 bb01000000      mov     ebx, 1
pfn_MiProcessLoaderEntry MiProcessLoaderEntry = 0xfffff80004169780;//这里直接填的地址,该函数未导出,不过只要思想不滑坡,办法总比问题多..
BOOLEAN KiSleep (ULONG MillionSecond) {
    NTSTATUS st;
    LARGE_INTEGER DelayTime;
    DelayTime = RtlConvertLongToLargeInteger (-10000 * MillionSecond);
    st = KeDelayExecutionThread (KernelMode, FALSE, &DelayTime);
    return (NT_SUCCESS (st));
}
VOID TestDP (PVOID p) {
    int j = 0;
    while (1) {
        KiSleep (1000);
        j++;
        KdPrint (("TestDP:%d \n", j));
    }
}
VOID DriverUnload (PDRIVER_OBJECT pDriverObj) {
    UNICODE_STRING strLink;
    DbgPrint ("[TestDrv]DriverUnload\n");
    MiProcessLoaderEntry (pDriverObj->DriverSection, FALSE);
    pDriverObj->DriverSection = ExAllocatePool (NonPagedPool, 4096);
    //删除符号连接和设备
    RtlInitUnicodeString (&strLink, LINK_NAME);
    IoDeleteSymbolicLink (&strLink);
    IoDeleteDevice (pDriverObj->DeviceObject);
}
NTSTATUS DispatchCreate (PDEVICE_OBJECT pDevObj, PIRP pIrp) {
    DbgPrint ("[TestDrv]DispatchCreate\n");
    pIrp->IoStatus.Status = STATUS_SUCCESS;
    pIrp->IoStatus.Information = 0;
    IoCompleteRequest (pIrp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}
NTSTATUS DispatchClose (PDEVICE_OBJECT pDevObj, PIRP pIrp) {
    DbgPrint ("[TestDrv]DispatchClose\n");
    pIrp->IoStatus.Status = STATUS_SUCCESS;
    pIrp->IoStatus.Information = 0;
    IoCompleteRequest (pIrp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}
NTSTATUS DispatchIoctl (PDEVICE_OBJECT pDevObj, PIRP pIrp) {
    NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
    PIO_STACK_LOCATION pIrpStack;
    ULONG uIoControlCode;
    PVOID pIoBuffer;
    ULONG uInSize;
    ULONG uOutSize;
    DbgPrint ("[TestDrv]DispatchIoctl\n");
    //获得IRP里的关键数据
    pIrpStack = IoGetCurrentIrpStackLocation (pIrp);
    //控制码
    uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
    //输入和输出的缓冲区(DeviceIoControl的InBuffer和OutBuffer都是它)
    pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
    //EXE发送传入数据的BUFFER长度(DeviceIoControl的nInBufferSize)
    uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
    //EXE接收传出数据的BUFFER长度(DeviceIoControl的nOutBufferSize)
    uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
    switch (uIoControlCode) {
        //在这里加入接口
        case IOCTL_IO_TEST: {
                DWORD dw = 0;
                //输入
                memcpy (&dw, pIoBuffer, sizeof (DWORD));
                //使用
                dw++;
                //输出
                memcpy (pIoBuffer, &dw, sizeof (DWORD));
                //返回通信状态
                status = STATUS_SUCCESS;
                break;
            }
        case IOCTL_SAY_HELLO: {
                DbgPrint ("[TestDrv]IOCTL_SAY_HELLO\n");
                status = STATUS_SUCCESS;
                break;
            }
    }
    //这里设定DeviceIoControl的*lpBytesReturned的值(如果通信失败则返回0长度)
    if (status == STATUS_SUCCESS)
    { pIrp->IoStatus.Information = uOutSize; }
    else
    { pIrp->IoStatus.Information = 0; }
    //这里设定DeviceIoControl的返回值是成功还是失败
    pIrp->IoStatus.Status = status;
    IoCompleteRequest (pIrp, IO_NO_INCREMENT);
    return status;
}
NTSTATUS DriverEntry (PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString) {
    NTSTATUS status = STATUS_SUCCESS;
    UNICODE_STRING ustrLinkName;
    UNICODE_STRING ustrDevName;
    PDEVICE_OBJECT pDevObj;
    pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
    pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
    pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
    pDriverObj->DriverUnload = DriverUnload;
    //创建一个设备
    RtlInitUnicodeString (&ustrDevName, DEVICE_NAME);
    status = IoCreateDevice (pDriverObj, 0, &ustrDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDevObj);
    if (!NT_SUCCESS (status)) { return status; }
    //判断支持的WDM版本,其实这个已经不需要了,纯属WIN9X和WINNT并存时代的残留物
    if (IoIsWdmVersionAvailable (1, 0x10)) {
        RtlInitUnicodeString (&ustrLinkName, LINK_GLOBAL_NAME);
    } else {
        RtlInitUnicodeString (&ustrLinkName, LINK_NAME);
    }
    // 创建符号连接
    status = IoCreateSymbolicLink (&ustrLinkName, &ustrDevName);
    if (!NT_SUCCESS (status)) {
        IoDeleteDevice (pDevObj);
        return status;
    }
    DbgPrint ("[TestDrv]DriverEntry\n");
    HANDLE hThread = 0;
    if (NT_SUCCESS (PsCreateSystemThread (&hThread, 0, NULL, (HANDLE) - 1, NULL, &TestDP, NULL))) {
        ZwClose (hThread);
    }
    //返回加载驱动的状态(如果返回失败,驱动讲被清除出内核空间)
    return STATUS_SUCCESS;
}

原理便是狸猫换太子了,让系统去释放一段无意义的内存块,

转载请注明出处,谢谢 

[课程]Linux pwn 探索篇!

收藏
免费 1
支持
分享
最新回复 (20)
雪    币: 95
活跃值: (134)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
忘了说,隐藏方法是SCM加载驱动,加载成功后卸载就是了
2018-4-28 16:39
0
雪    币: 25
活跃值: (506)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
留个记录看看
2018-4-28 16:47
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
作用不大,driverobject还在,
另外:很久很久之前:
https://github.com/ZhuHuiBeiShaDiao/NewHideDriverEx比较科学
最后于 2018-4-28 16:55 被cvcvxk编辑 ,原因:
2018-4-28 16:53
0
雪    币: 95
活跃值: (134)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
5
cvcvxk 作用不大,driverobject还在,另外:很久很久之前:https://github.com/ZhuHuiBeiShaDiao/NewHideDriverEx比较科学
这样其实重点只有      pDriverObj->DriverSection  =  ExAllocatePool  (NonPagedPool,  4096);  这一句,可镜像内容不被卸载,注册表等加载信息不用处理了
2018-4-28 17:34
0
雪    币: 405
活跃值: (2150)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
还不如全内核SHELLCODE  的方便。
2018-4-28 18:04
0
雪    币: 95
活跃值: (134)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
wowocock 还不如全内核SHELLCODE 的方便。
写shellcode  感觉还是不够效率,撸的速度慢了一点,buffer加载驱动应该是更好的选择..
2018-4-28 18:37
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
8
isdebug 写shellcode 感觉还是不够效率,撸的速度慢了一点,buffer加载驱动应该是更好的选择..
shellcode其实有开发框架,速度飞飞快,具体就不说了
直接看我工程:
https://gitee.com/z33b/shellcode_driver

最后于 2018-4-28 19:25 被cvcvxk编辑 ,原因:
2018-4-28 19:21
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
cvcvxk isdebug 写shellcode 感觉还是不够效率,撸的速度慢了一点,buffer加载驱动应该是更好的选择.. shellcode其实有开发框架,速 ...
v大,

你的访问受限!
服务器拒绝处理您的请求!您可能没有访问此操作的权限,  点击  登录  或  返回主页

也可能是以下原因导致您没有权限

1.  没有登录,请登录后查看

2.  资源属于企业,企业用户应安全策略被企业屏蔽,请联系企业管理员

3.  项目因违规被码云屏蔽,请联系项目拥有者查看项目是否被屏蔽
2018-4-28 20:02
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
10
iceway v大, 你的访问受限! 服务器拒绝处理您的请求!您可能没有访问此操作的权限, 点击 登录 或 返回主页 也可能是以下原因导致您没有权限 1. 没有登录,请登录后查看 2. 资 ...
修正了权限,忘记点保存了

最后于 2018-4-28 20:31 被cvcvxk编辑 ,原因:
2018-4-28 20:25
0
雪    币: 8188
活跃值: (2772)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
11
异常怎么办?
2018-4-28 22:00
0
雪    币: 4006
活跃值: (626)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
seh问题  可以看下https://github.com/ZhuHuiBeiShaDiao/NewHideDriverEx  实现了SEH的支持
2018-4-28 22:01
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
13
感觉还是shellcode靠谱一点
2018-4-29 15:27
0
雪    币: 545
活跃值: (247)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
14
mark
2018-4-29 22:57
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
2018-4-29 23:34
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
16
malokch 感觉还是shellcode靠谱一点
硬编码内核例程的地址来初始化全局函数指针的确不怎么靠谱,仅适用于系统本次的启动实例
最后于 2018-4-30 11:12 被shayi编辑 ,原因:
2018-4-30 11:12
0
雪    币: 665
活跃值: (1041)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
放学打我不 seh问题 可以看下https://github.com/ZhuHuiBeiShaDiao/NewHideDriverEx 实现了SEH的支持
Seh挂到别的模块上虽然有落点,但是太明显了
2018-5-1 06:08
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
看不懂啊啊啊啊
2018-5-2 00:57
0
雪    币: 220
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不支持X86?
2018-5-30 20:53
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
MiProcessLoaderEntry  (pDriverObj->DriverSection,  FALSE)  是干什么用的?
2018-6-22 10:33
0
雪    币: 793
活跃值: (75)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
是我没用来?加载成功,没有隐藏,在win7 64 卸载蓝屏。
2018-11-4 12:13
0
游客
登录 | 注册 方可回帖
返回
//