004-实现过滤PCHunter驱动中的例程

1.理解过滤的概念
关于过滤,我们可以举一个现实中的例子。比如一条河流中水的流向由东向西,但是呢我们想要去掉水中的杂物,又要不影响水的流向,这时我们可以在东西中间插入一张过滤网,这样就可以实现我们的目的了。这次我们用过滤PCHunter32as.sys中的例程其实就是这个思想。
还有一个我们也要明白,我们为什么能够替换其他其他驱动程序的例程呢,因为IO管理器实现了通用的框架,每个驱动程序的参数,返回值他们定义都是相同的。
在这里插入图片描述
2.PCHunter查看驱动对象地址
在这里插入图片描述
3.Windbg查看驱动对象

kd> dt _DRIVER_OBJECT -b 0x86855ED8
ntdll!_DRIVER_OBJECT
   +0x000 Type             : 0n4
   +0x002 Size             : 0n168
   +0x004 DeviceObject     : 0x86855138 
   +0x008 Flags            : 0x12
   +0x00c DriverStart      : 0x9648d000 
   +0x010 DriverSize       : 0xb0000
   +0x014 DriverSection    : 0x86855078 
   +0x018 DriverExtension  : 0x86855f80 
   +0x01c DriverName       : _UNICODE_STRING "\Driver\PCHunter32as"
      +0x000 Length           : 0x28
      +0x002 MaximumLength    : 0x28
      +0x004 Buffer           : 0x87f55c18  "\Driver\PCHunter32as"
   +0x024 HardwareDatabase : 0x841c2250 
   +0x028 FastIoDispatch   : (null) 
   +0x02c DriverInit       : 0x96538000 
   +0x030 DriverStartIo    : (null) 
   +0x034 DriverUnload     : 0x96500e50 
   +0x038 MajorFunction    : 
    [00] 0x9650185a 
    [01] 0x83f0bda3 
    [02] 0x9650185a 
    [03] 0x83f0bda3 
    [04] 0x83f0bda3 
    [05] 0x83f0bda3 
    [06] 0x83f0bda3 
    [07] 0x83f0bda3 
    [08] 0x83f0bda3 
    [09] 0x83f0bda3 
    [10] 0x83f0bda3 
    [11] 0x83f0bda3 
    [12] 0x83f0bda3 
    [13] 0x83f0bda3 
    [14] 0x96554030 
    [15] 0x83f0bda3 
    [16] 0x83f0bda3 
    [17] 0x83f0bda3 
    [18] 0x83f0bda3 
    [19] 0x83f0bda3 
    [20] 0x83f0bda3 
    [21] 0x83f0bda3 
    [22] 0x83f0bda3 
    [23] 0x83f0bda3 
    [24] 0x83f0bda3 
    [25] 0x83f0bda3 
    [26] 0x83f0bda3 
    [27] 0x83f0bda3 

MajorFunction中的好多例程是0x83f0bda3,其实这个是系统提供的默认例程,就是驱动程序没有做任何事情。使用Windbg查看此函数:

kd> u 0x83f0bda3 
nt!IopInvalidDeviceRequest:
83f0bda3 8bff            mov     edi,edi
83f0bda5 55              push    ebp
83f0bda6 8bec            mov     ebp,esp
83f0bda8 8b4d0c          mov     ecx,dword ptr [ebp+0Ch]
83f0bdab 32d2            xor     dl,dl
83f0bdad c74118100000c0  mov     dword ptr [ecx+18h],0C0000010h
83f0bdb4 ff15600afc83    call    dword ptr [nt!pIofCompleteRequest (83fc0a60)]
83f0bdba b8100000c0      mov     eax,0C0000010h

4.实现简单的过滤

#include <ntddk.h>

/*************************************************************************/
NTKERNELAPI NTSTATUS    ObReferenceObjectByName(
IN PUNICODE_STRING ObjectName,
IN ULONG Attributes,
IN PACCESS_STATE PassedAccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *Object
);

extern POBJECT_TYPE		*IoDriverObjectType;
PDRIVER_OBJECT			g_FilterDriverObject;
PDRIVER_DISPATCH		gfn_OrigReadCompleteRoutine;
/*************************************************************************/

NTSTATUS	FilterDeviceControlCompleteRoutine(
	_In_ struct _DEVICE_OBJECT *DeviceObject,
	_Inout_ struct _IRP *Irp
	)
{
	KdPrint(("Device Control is coming!\n"));
	return gfn_OrigReadCompleteRoutine(DeviceObject, Irp);
}
VOID UnFilterDriverRoutine()
{
	//检测地址是否有效
	if (MmIsAddressValid(g_FilterDriverObject))
	{
		//卸载的时候恢复过来
		g_FilterDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = gfn_OrigReadCompleteRoutine;
	}
}
NTSTATUS FilterDriverQuery()
{
	NTSTATUS			Status;
	UNICODE_STRING		usObjectName;

	RtlInitUnicodeString(&usObjectName, L"\\Driver\\PCHunter32as");
	//OBJ_CASE_INSENSITIVE 不区分大小写
	Status = ObReferenceObjectByName(&usObjectName, \
		OBJ_CASE_INSENSITIVE, \
		NULL, \
		0, \
		*IoDriverObjectType, \
		KernelMode, \
		NULL, \
		(PVOID*)&g_FilterDriverObject);
	if (!NT_SUCCESS(Status))
	{
		KdPrint(("ObReferenceObjectByName faild\n"));
		return Status;
	}
	KdPrint(("%p\n", g_FilterDriverObject));
	//过滤,不能影响原来流程
	gfn_OrigReadCompleteRoutine = g_FilterDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL];
	g_FilterDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FilterDeviceControlCompleteRoutine;

	ObDereferenceObject(g_FilterDriverObject);
	return STATUS_SUCCESS;
}
VOID UnloadDriver(PDRIVER_OBJECT pDriver)
{
	KdPrint(("UnloadDriver \n"));
	UnFilterDriverRoutine();
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
	NTSTATUS		Status;

	KdPrint(("%p--%wZ\n", pDriver, pReg));
	pDriver->DriverUnload = UnloadDriver;
	FilterDriverQuery();
	return STATUS_SUCCESS;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linxer大牛在XueTr源码基础上重新开发了PC Hunter,支持Win8和X64,本次更新新增了十几处检测。分为免费版和收费版。 于2013年1月24日发布1.0免费版本。 在其微博上表示是购买了微软数字签名证书,并不是之前传言的0day。 本工具目前初步实现如下功能: 1.进程、线程、进程模块、进程窗口、进程内存信息查看,杀进程、杀线程、卸载模块等功能 2.内核驱动模块查看,支持内核驱动模块的内存拷贝 3.SSDT、Shadow SSDT、FSD、KBD、TCPIP、Classpnp、Atapi、Acpi、SCSI、IDT、GDT信息查看,并能检测和恢复ssdt hook和inline hook 4.CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,暂时不支持2000系统 6.查看消息钩子 7.内核模块的iat、eat、inline hook、patches检测和恢复 8.磁盘、卷、键盘、网络层等过滤驱动检测,并支持删除 9.注册表编辑 10.进程iat、eat、inline hook、patches检测和恢复 11.文件系统查看,支持基本的文件操作 12.查看(编辑)IE插件、SPI、启动项、服务、Host文件、映像劫持、文件关联、系统防火墙规则、IME 13.ObjectType Hook检测和恢复 14.DPC定时器检测和删除 15.MBR Rootkit检测和修复 16.内核对象劫持检测 17.WorkerThread枚举 免费版更新列表: 1.基于XueTr源码重新开发而来,应该超越了XueTr。
### 回答1: PChunter 是一款高级的系统调试和反恶意软件的工具,它的主要功能是帮助用户发现并处理恶意软件以及修复系统错误。当用户在使用 PChunter 时,如果出现“加载驱动失败”的错误提示,可能是由以下几个原因导致的: 1. 驱动文件缺失或损坏:在使用 PChunter 进行驱动加载时,驱动文件可能因为意外或错误操作而丢失或损坏。这时,需要重新下载或修复相关的驱动文件,并确保其正常运行。 2. 系统权限不足:PChunter 需要管理员权限才能加载驱动。如果当前用户没有足够的权限,就会出现加载驱动失败的错误。解决方法是以管理员身份重新运行 PChunter,或者修改当前用户的权限设置,确保具备加载驱动所需的权限。 3. 操作系统不兼容:PChunter 可能与某些操作系统不兼容,导致加载驱动失败。用户可以尝试更新 PChunter 的最新版本,或者选择与其兼容的操作系统来解决这个问题。 4. 防病毒软件阻止加载:某些防病毒软件可能会误判 PChunter 为恶意软件,从而阻止其加载驱动。用户需要先关闭或临时禁用防病毒软件,然后再次尝试加载驱动。 如果以上方法仍然无法解决问题,建议联系 PChunter 官方技术支持团队,提供详细的错误信息和系统配置,以便他们能够更准确地帮助解决加载驱动失败的问题。 ### 回答2: “pchunter加载驱动失败”可能是由于以下几个原因造成的: 1. 驱动文件损坏:可能是由于驱动文件被破坏或删除导致加载失败。解决方法是重新下载或从其他可信来源获取正确的驱动文件,并确保其完整无损。 2. 驱动与操作系统不兼容:某些驱动可能只适用于特定的操作系统版本,如果安装的驱动与当前操作系统不兼容,加载就会失败。解决方法是确认驱动的兼容性,并找到适用于当前操作系统的正确版本。 3. 系统冲突:在安装或加载驱动时,可能会与系统的其他驱动或软件冲突,导致加载失败。解决方法是禁用或卸载可能与加载驱动冲突的软件,并重新尝试加载驱动。 4. 权限限制:某些驱动可能需要管理员权限才能加载成功。解决方法是以管理员身份运行pchunter,或者在安装驱动时确保拥有足够的权限。 5. 硬件问题:加载驱动失败可能是由于硬件故障或设备连接问题引起的。解决方法是检查硬件是否正常连接,并确保设备没有损坏。 针对以上可能的原因,你可以尝试一些解决方法,如重新下载驱动文件、检查驱动与操作系统的兼容性、禁用冲突软件、以管理员身份运行pchunter等。如果问题仍然存在,建议咨询技术支持人员获取更详细的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fish小余儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值