鱼C论坛

 找回密码
 立即注册
查看: 12150|回复: 8

[技术交流] 驱动级进程保护

[复制链接]
发表于 2015-6-29 19:04:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
好久没上论坛了~~
这几天学了驱动 写了个小代码就发个帖子了
国际惯例先上代码

代码很简单 SSDT HOOK NtTerminateProcess 修改返回值实现保护   渣代码忘大牛勿喷(>﹏<)PS:安装WINDDK 编译


源文件 :Driver.C  这是驱动代码
#include <ntddk.h>
[hide]#define NtTerminateProcessIndex 257


#pragma pack(1)
/*  SSDT表 */
typedef struct ServiceDescriptorEntry
{
        unsigned int *ServiceTableBase;
        unsigned int *ServiceCounterTableBase;
        unsigned int NumberOfServices;
        unsigned char *ParamTableBase;
}ServiceDescriptorEntry_t, *PServiceDescriptorEntry;
#pragma pack()
/* 导入数据结构 */
_declspec(dllimport) ServiceDescriptorEntry_t KeServiceDescriptorTable;


/* 变量声明 */
DWORD32 ProtectPID = NULL;
UINT32  SSDTSrcaddress = NULL;  //源函数地址


/* 函数声明 SSDTHOOK开启/关闭*/
VOID SSDTHook_Start();
VOID SSDTHook_Stop();


/* 内存页保护 开启/关闭*/
VOID PageProtectOn();   //开启页保护
VOID PageProtectOff();  //关闭页保护



VOID PageProtectOn()
{
        __asm
        {
                mov eax, cr0;
                or eax, 10000h;
                mov cr0, eax;
                sti
        }
}
VOID PageProtectOff() 
{
        __asm
        {
                cli
                        mov eax, cr0;
                and eax, not 10000h;
                mov cr0, eax;
        }
}





/* 函数指针 */
typedef NTSTATUS(*pNtTerminateProcess)(HANDLE HProcess, NTSTATUS ExitStaus);


/* 跳转函数 */
NTSTATUS MNtTerminateProcess(HANDLE Hprocess, NTSTATUS ExitStaus)
{


        /* 变量 */
        USHORT uPID = NULL;
        NTSTATUS rtStatus = NULL;
        PEPROCESS pEProcess = { NULL };

        


        /* 开始过滤 */
        rtStatus = ObReferenceObjectByHandle(Hprocess, FILE_READ_DATA, NULL, KernelMode, (PVOID*)&pEProcess, NULL);
        if (!NT_SUCCESS(rtStatus)) { DbgPrint("获取进程对象失败!\n"); }


        /* 通过进程对象获取进程PID */
        else
        {
                uPID = PsGetProcessId(pEProcess);
                DbgPrint("该进程PID:%d", uPID);
                /* 判断要保护的进程PID是否和该PID想等 */
                
                if (uPID == ProtectPID && ProtectPID > 0)
                {
                        /* 返回 */
                        return STATUS_ACCESS_DENIED;
                }
                else { DbgPrint("未设置进程PID或进程PID不想等"); }
        }

        
        
        DbgPrint("进程句柄:%d 被关闭", Hprocess);
        return ((pNtTerminateProcess)SSDTSrcaddress)(Hprocess, ExitStaus);

}

VOID SSDTHook_Start()
{

        /* 关闭页保护 */
        PageProtectOff();

        /* 保存源函数地址 */
        SSDTSrcaddress = KeServiceDescriptorTable.ServiceTableBase[NtTerminateProcessIndex];
        /* 修改为我们的函数地址 */
        KeServiceDescriptorTable.ServiceTableBase[NtTerminateProcessIndex] = (unsigned int)&MNtTerminateProcess;

        /* 开启页保护 */
        PageProtectOn();
        
}

VOID SSDTHook_Stop()
{
        /* 关闭页保护 */
        PageProtectOff();

        /* 已经开始HOOK */
        if (SSDTSrcaddress)  
        /* 修改回原来的函数 */
        KeServiceDescriptorTable.ServiceTableBase[NtTerminateProcessIndex] = SSDTSrcaddress;

        /* 开启页保护 */
        PageProtectOn();

}
/* 派遣函数 */
NTSTATUS DriverDispatch(PDEVICE_OBJECT pDeviceObj, PIRP pIrp)
{
        
        PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
        
        switch (pIrpStack->MajorFunction)
        {
        case IRP_MJ_DEVICE_CONTROL:
           {
                        ProtectPID = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
                        DbgPrint("进程PID:%d\n", ProtectPID);
                          
                        break;
           }
        case IRP_MJ_CLOSE:
           {
                           
                        break;
           }
        case IRP_MJ_CREATE:
           {
                           
                        break;
           }
        default:
           {
                           
                         break;
           }
        }
        Fished:
        pIrp->IoStatus.Status = STATUS_SUCCESS;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest(pIrp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;

}
VOID Unload( PDRIVER_OBJECT DriverObject )
{
        UNICODE_STRING SysbolLink = { NULL };
        PDEVICE_OBJECT pDeviceObj = DriverObject->DeviceObject;
        DbgPrint("Unload Function \n");
        if (pDeviceObj != NULL) 
        { 
                DbgPrint("删除设备对象%d", pDeviceObj); 
                IoDeleteDevice(DriverObject->DeviceObject);
                RtlInitUnicodeString(&SysbolLink, L"\\??\\Fuhao");
                IoDeleteSymbolicLink(&SysbolLink);
        }

        /* 停止HOOK */
        SSDTHook_Stop();
          
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
        
        NTSTATUS Ntstatus = NULL;

        UNICODE_STRING DeviceName = { NULL };
        UNICODE_STRING SysbolLink = { NULL };
        PDEVICE_OBJECT pDeviceObj = { NULL };


        DbgPrint("Entry Function \n");


        //设备名称和符号链接
        RtlInitUnicodeString(&DeviceName, L"\\Device\\Fuhao");
        RtlInitUnicodeString(&SysbolLink, L"\\??\\Fuhao");

        /* 创建设备对象 */
        Ntstatus = IoCreateDevice(DriverObject, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObj);
        if (!NT_SUCCESS(Ntstatus)) DbgPrint("驱动创建失败");


        pDeviceObj->Flags |= DO_BUFFERED_IO;
        pDeviceObj->Flags &= ~DO_DEVICE_INITIALIZING;  //设备初始化完成标记


        /* 创建符号链接和ring0通信 */
        Ntstatus = IoCreateSymbolicLink(&SysbolLink, &DeviceName);
        if (!NT_SUCCESS(Ntstatus)) DbgPrint("符号链接创建失败");

        /* 设置派遣函数 接收PID*/
        DriverObject->DriverUnload = Unload;
        DriverObject->MajorFunction[IRP_MJ_CLOSE] = DriverDispatch;
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverDispatch;
        DriverObject->MajorFunction[IRP_MJ_CREATE] = DriverDispatch;


        /* 开始HOOK */
        SSDTHook_Start();
    return STATUS_SUCCESS;
}
[/hide]

QQ截图20150629185900.png


为了方便驱动加载器我就用易写了
驱动.zip (8.92 KB, 下载次数: 117)

直接运行后输入PID 点保护就OK了


注意了 这个驱动只运行在XP SP3 因为操作系统不同 SSDT索引不同(>﹏<)  这个是XP版的  其它系统运行可能蓝屏
编译 Free Win7 就好了  还好记得修改 [hide]#define NtTerminateProcessIndex 257  257是XP SP3 NtTerminateProcess函数的SSDT索引号
自己修改编译就好了



截图:
1.png
2.png


评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +4 收起 理由
拈花小仙 + 5 + 5 + 4 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-6-29 23:20:07 | 显示全部楼层
沙发..........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-6-30 08:44:14 | 显示全部楼层
楼主厉害!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2015-6-30 21:43:44 | 显示全部楼层
先收藏起来等开始学习驱动了再说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-6-30 23:57:17 | 显示全部楼层
谢谢LZ分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-2 08:38:45 | 显示全部楼层
贴下 [inline hook]HOOK NtCreateFile 实现文件无法打开
http://bbs.fishc.com/thread-62548-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-5 08:26:18 | 显示全部楼层
感觉很屌的样子,不知道什么时候能有你样的水平。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-7-5 09:44:59 | 显示全部楼层
灭·世 发表于 2015-7-5 08:26
感觉很屌的样子,不知道什么时候能有你样的水平。

其实吧这是比较简单的驱动程序 如果你会C语言再去学驱动开发  学过几章你就能写这个了

评分

参与人数 1荣誉 +2 鱼币 +1 贡献 +1 收起 理由
灭·世 + 2 + 1 + 1 谢谢你的鼓励

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-5 09:57:25 | 显示全部楼层
迷雾少年 发表于 2015-7-5 09:44
其实吧这是比较简单的驱动程序 如果你会C语言再去学驱动开发  学过几章你就能写这个了

C学了一点,C++也学了一点,不过都是自学的,感觉没学到什么东西,学历也低,年龄也30岁了,哈哈,我会一直学下去,学习是一种习惯,一种爱好,不为工作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 04:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表