xp3下保护xuetr

#ifndef _PROTECT_XUETR_H_
#define _PROTECT_XUETR_H_

#include <ntddk.h>
#include <windef.h>

#define DWORD ULONG


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;
		};
	};
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;

extern POBJECT_TYPE *IoDriverObjectType;



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
	NTKERNELAPI
	NTSTATUS
	ObReferenceObjectByHandle(
	IN HANDLE  Handle,
	IN ACCESS_MASK  DesiredAccess,
	IN POBJECT_TYPE  ObjectType  OPTIONAL,
	IN KPROCESSOR_MODE  AccessMode,
	OUT PVOID  *Object,
	OUT POBJECT_HANDLE_INFORMATION  HandleInformation  OPTIONAL
	);





typedef struct _OBJECT_DIRECTORY_ENTRY
{
	PVOID pNext;
	PVOID pObject;
}OBJECT_DIRECTORY_ENTRY, *POBJECT_DIRECTORY_ENTRY;

typedef struct _OBJECT_DIRECTORY
{
	POBJECT_DIRECTORY_ENTRY pObjectDirectoryEntry[37];
	PVOID pLock;
	PVOID DeviceMap;
	ULONG SessionId;
	USHORT Reserved;
	USHORT SymbolicLinkUsageCount;
}OBJECT_DIRECTORY, *POBJECT_DIRECTORY;

typedef ULONG DWORD, *PDWORD;
typedef UCHAR BYTE, *PBYTE;
extern POBJECT_TYPE *IoDriverObjectType;

#endif

 

#include "ProtectXuetr.h"


NTSTATUS HideDriverByName(LPCSTR pDriverName)
{
	NTSTATUS Status = STATUS_SUCCESS;
	UNICODE_STRING stDriverDirectory = {0};
	OBJECT_ATTRIBUTES stObjectAttributes = {0};
	POBJECT_DIRECTORY pObjectDirectory = NULL;

	PDRIVER_OBJECT pHideDriver = NULL;

	char pDriverDirectoryName[256] = {0};
	ANSI_STRING stAnsiName = {0};
	UNICODE_STRING stUnicodeName = {0};

	//初始化一些我们需要的文本
	strncat( pDriverDirectoryName, "\\Driver\\", strlen("\\Driver\\") );
	strncat( pDriverDirectoryName, pDriverName, strlen(pDriverName) );
	RtlInitAnsiString( &stAnsiName, pDriverDirectoryName );
	RtlAnsiStringToUnicodeString(  &stUnicodeName, &stAnsiName, TRUE );
	DbgPrint("tofind %ws\r\n",stUnicodeName.Buffer);
	RtlInitUnicodeString( &stDriverDirectory, L"\\Driver" );
	InitializeObjectAttributes( &stObjectAttributes, &stDriverDirectory,
		OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE, NULL, NULL );

	//通过 \\Driver\\PCHunter32 得到驱动的目录对象 POBJECT_DIRECTORY
	Status = ObReferenceObjectByName(
		&stDriverDirectory, 
		OBJ_CASE_INSENSITIVE, 
		NULL, 
		0,
		*IoDriverObjectType, 
		KernelMode, 
		NULL, 
		&pObjectDirectory );
	if( NT_SUCCESS(Status) )
	{
		ULONG index = 0;
		BOOLEAN bFound = FALSE;
		POBJECT_DIRECTORY_ENTRY pObjectDirectoryEntry = NULL;

		//开始枚举驱动目录对象
		for( index = 0; index < 37; index++ )
		{
			PDRIVER_OBJECT pDriver = NULL;
			pObjectDirectoryEntry = pObjectDirectory->pObjectDirectoryEntry[index];
			bFound = FALSE;
			while(pObjectDirectoryEntry&&MmIsAddressValid(pObjectDirectoryEntry) )
			{
				//指向一个DriverObject
				pDriver = (PDRIVER_OBJECT)(pObjectDirectoryEntry->pObject);
				if( MmIsAddressValid(pDriver) )
				{
					//DbgPrint("%ws\r\n",pDriver->DriverName.Buffer);

					//是,找到了。
					if(wcsstr(pDriver->DriverName.Buffer,stUnicodeName.Buffer))
					{
						//设置一个标志,说明我们找到了xuetr的驱动目录对象
						bFound = TRUE;
						pHideDriver = pDriver;
						DbgPrint("found it\r\n");
						break;
					}
				}
				pObjectDirectoryEntry = pObjectDirectoryEntry->pNext;
			}
			if( bFound )
			{
				//开始摘除
				pObjectDirectory->pObjectDirectoryEntry[index] = pObjectDirectory->pObjectDirectoryEntry[index]->pNext;
			}
		}
	}
	//释放引用计数
	ObDereferenceObject( pObjectDirectory );

	//释放我们前面使用的unicode
	RtlFreeUnicodeString( &stUnicodeName );

	return Status;
}
VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{
	return;
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING pRegistryString)
{
	NTSTATUS status = STATUS_UNSUCCESSFUL;

	DriverObject->DriverUnload = DriverUnload;

	//准备摘除PCHunter32的驱动对象目录
	status = HideDriverByName("PCHunter32al");
	if (NT_SUCCESS(status))
	{
		DbgPrint("Hide PCHunter32 success\r\n");
	}
	status = STATUS_UNSUCCESSFUL;
	status = HideDriverByName("XueTr");
	if (NT_SUCCESS(status))
	{
		DbgPrint("Hide XueTr success\r\n");
	}
	return STATUS_SUCCESS;
}

 

这是一款比冰刃IceSword还强的软件,支持所有WinNT内核系统。(包含Windows7) 2009-03-01 0.21版本: 1.修正SPI名字少一个字母Bug(感谢dl123100指出) 2.修正检测到可疑驱动对象会显示服务名Bug(感谢dl123100和曲版指出) 3.修正数字签名把smss.exe检测为没有签名bug(感谢qdk2000指出) 4.几个窗口可以最大化了 5.支持进程和dll模块分上、下两层同时显示(在进程部分右键点"在下方显示模块窗口") 6.修正xueTr清除ppxx回调时程序假死Bug 7.新增禁止创建注册表键(值) 8.新增删除文件时候占坑功能 9.新增查看文件锁定情况功能 2009-02-16 0.20版本: 1.支持windows 7(由于win7还处于beta阶段,我也不知道它的确切Build号,现在默认大于6900是win7,目前程序可以在Build:7000的系统上正常运行) 2.加入数字签名,进程部分右键菜单--->查找没有数字签名的模块,会扫描系统中所有进程的模块 3.线程部分也有点改动,加了线程入口所在模块 4.防了消息钩子模块对XueTr的注入(可能会导致一些美化的系统中,XueTr的界面变丑,暂时不想处理这个问题了),另目前无法防止App_Inits模块的注入,这个暂时不想加了(加这个需要大改动,以后有时间会考虑) 5.对抗伪进程Id 6.XueTr启动的时候,会检测是否有线程注入到XueTr,并给出提示 7.内核模块部分,对有对应服务的,显示的时候会显示出其服务名 8.还修改了几个Bug,不表 2009-02-05 0.19版本: 1.新支持对exFAT文件系统的解析 2.新增了结束进程时候删除进程文件 3.对一些有文件全路径的地方,增添了文件厂商属性 2009-02-02 0.18版本:(本版更新纯是为了解决系统挂机Bug而临时升级的一个版本) 1.增强了启动项检测 2.进程部分右键菜单增加了查找进程模块功能 3.解决了内核模块检测部分的误报可疑驱动对象Bug(感谢dl123100指出) 4.解决了程序非正常结束,下一次启动系统死掉Bug(感谢dl123100和angel13th指出) 2009-01-30 0.17版本: 1.增加了卸载消息钩子 2.增加了枚举窗口,和对窗口的操作 3.增加了禁止待机、注销、关机和重启功能 2009-01-26 0.16版本: 1.界面语言自适应(在中文操作系统上是中文,其它操作系统是英文) 2.注册表部分引入了Hive分析,默认是不开启,如果要使用可以用"使用Hive分析"菜单,选择了这个就不会用驱动获取注册表了 3.加了自我保护 4.增加禁止创建进程、线程、文件以及禁止加载模块和消息钩子模块注入功能 5.改了几个界面的小问题,我的界面写作能力很菜,不表了 6.还增强了下内核模块钩子检测(还有提升空间,不想搞了) 2009-01-17 0.15版本: 1.进程部分,加入了挂起、恢复进程(线程)功能 2.文件部分加入了NTFS、FAT32、FAT16文件磁盘解析,本功能默认开启,可以用"开启物理磁盘分析"菜单关闭 2009-01-06 0.14版本: 1.新增ObjectType Hook检测功能(这个功能的实现参考了sudami写的文章,感激) 2.修正无法列举移动存储介质(U盘等)里的文件bug(感谢annybaby指出) 3.修正File和Rigister显示界面,当多次最小化最大化后,树形控件宽度逐渐变窄bug(感谢li58指出) 2009-01-02 0.13版本: 1.调整界面 2.新增操作IE插件、SPI、启动项、服务、映像劫持、Host文件等功能 3.修正一处filter显示bug(感谢dl123100指出) 2008-12-22 0.12版本: 1.解决在装有微点机器下全是白板的问题 2008-12-11 0.11版本: 1.修正有些机器全是白板问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值