马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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]
为了方便驱动加载器我就用易写了
驱动.zip
(8.92 KB, 下载次数: 117)
直接运行后输入PID 点保护就OK了
注意了 这个驱动只运行在XP SP3 因为操作系统不同 SSDT索引不同(>﹏<) 这个是XP版的 其它系统运行可能蓝屏
编译 Free Win7 就好了 还好记得修改 [hide]#define NtTerminateProcessIndex 257 257是XP SP3 NtTerminateProcess函数的SSDT索引号
自己修改编译就好了
截图:
|