|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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索引号
自己修改编译就好了
截图:
|
评分
-
查看全部评分
|