首页
论坛
课程
招聘
[分享]很有时间系列:解决noimage驱动注册Minifilter的问题
2018-4-30 15:42 4230

[分享]很有时间系列:解决noimage驱动注册Minifilter的问题

2018-4-30 15:42
4230

解决一个实际工作中遇到的一个小问题:

Noimage中注册minifilter

首先注册miniflt需要一个DriverObject,如果是复用别人的DriverObject是会导致很多问题。

所以需要一个新Driverobject,这就需要借助ntos导出的无文档的IoCreateDriver来完成。

值得注意我们需要一个有名字的DriverObejct(没名字不好用的哦)

如何获得随机的DriverObject的name可以使用ExUuidCreate

DRIVER_INITIALIZE MyDriverEntry;
void InitDriver()
{
	GUID Attach;
	UNICODE_STRING nsAttachName;
	wchar_t szGuid[MAX_PATH];
	NTSTATUS ns = STATUS_UNSUCCESSFUL;
	ns = ExUuidCreate(&Attach);
	if (!NT_SUCCESS(ns))
	{
		LOG_DEBUG("ExUuidCreate ns = %x\r\n", ns);
		__debugbreak();
		return;
	}
	_swprintf(szGuid,
		L"\\Driver\\{%08x-%04x-%04x-%02x-%02x-%02x-%02x}",
		Attach.Data1,
		Attach.Data2,
		Attach.Data3,
		Attach.Data4[0],
		Attach.Data4[1],
		Attach.Data4[2],
		Attach.Data4[3]);

	RtlInitUnicodeString(&nsAttachName, szGuid);
	ns = IoCreateDriver(&nsAttachName, (PDRIVER_INITIALIZE)MyDriverEntry);
	if (!NT_SUCCESS(ns))
	{
		LOG_DEBUG("InitDriver Failed\r\n");
		__debugbreak();
		return;
	}
	return;
}

接着就是在新的DriverEntry里工作了

兴高采烈使用新的DriverObject去 注册Minifilt使用FltRegisterFilter返回0xC000009A失败

拿出IDA开始研究问题(系统为x64的10.0.16299.402)

发现FltpGetInstanceAltitude作的鬼


进步一分析发现FltpOpenInstancesRegistryKey失败


继续进去,看到是在


打开注册表失败,此时F5分析一波


原来是打开服务的注册表,那么只要创建这个注册表就可以咯,去上一层看是怎么得到source这个东西的


从DriverObject->DriverExtension->ServiceKeyName提取。

这时候我们去MyDriverEntry打印一波看看我们的名字是什么样子,然后把对应注册表写入就好了(注册完再删除就ok)。


可以看到输出了


这样的字符,这样子就很明了。

这样的字符,这样子就很明了。

写代码处理::

bool FixMiniFilter(PDRIVER_OBJECT pInDrvObject,wchar_t *InstanceName,wchar_t *Altitude)
{
	if (!pInDrvObject ||
		!pInDrvObject->DriverExtension ||
		!pInDrvObject->DriverExtension->ServiceKeyName.Buffer ||
		!pInDrvObject->DriverExtension->ServiceKeyName.Length)
	{
		return false;
	}
	wchar_t ServicePath[] = L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\";
	wchar_t KeyPath[MAX_PATH];
	UNICODE_STRING MatchCase;
	RtlInitUnicodeString(&MatchCase, L"\\DRIVER\\*");
	RtlSecureZeroMemory(KeyPath, sizeof(KeyPath));
	_swprintf_c(KeyPath,
		RTL_NUMBER_OF(KeyPath), L"%wZ",
		&pInDrvObject->DriverExtension->ServiceKeyName);
	if (FsRtlIsNameInExpression(&MatchCase,&pInDrvObject->DriverExtension->ServiceKeyName,TRUE,nullptr))
	{
		LOG_DEBUG("Into Driver\r\n");
		/*包含了\Driver\*/
		ddk::nt_reg driverKey;
		driverKey.open(std::wstring(ServicePath) + std::wstring(L"Driver"));
		driverKey.close();
		ServicePath[51] = 0;
	}
	auto fullkey = std::wstring(ServicePath) + std::wstring(KeyPath);
	do
	{
		ddk::nt_reg key0;
		key0.open(fullkey);
		key0.close();
		ddk::nt_reg key1;
		ddk::nt_reg key2;
		auto key = fullkey + std::wstring(L"\\Instances");
		LOG_DEBUG("%ws\r\n", key.c_str());
		if (!key1.open(key))
		{
			LOG_DEBUG("Open key Failed\r\n");
			break;
		}
		if (!key1.set_value(std::wstring(L"DefaultInstance"), REG_SZ, (PVOID)InstanceName, (wcslen(InstanceName)+1) * sizeof(WCHAR)))
		{
			LOG_DEBUG("Set DefaultInstance Failed\r\n");
			break;
		}
		key1.close();
		std::wstring subkey = key + std::wstring(L"\\") + std::wstring(InstanceName);
		if (!key2.open(subkey))
		{
			LOG_DEBUG("open subkey failed\r\n");
			break;
		}

		if (!key2.set_value(std::wstring(L"Altitude"), REG_SZ, (PVOID)Altitude, (wcslen(Altitude) + 1) * sizeof(WCHAR)))
		{
			LOG_DEBUG("set Altitude failed\r\n");
			break;
		}
		DWORD32 Flags = 0;
		if (!key2.set_value(std::wstring(L"Flags"), REG_DWORD, (PVOID)&Flags, sizeof(Flags)))
		{
			LOG_DEBUG("set Flags failed\r\n");
			break;
		}
		key2.close();
		return true;
	} while (0);
	return false;
}
看下效果:



此时DriverObject可以用来注册miniflt了。


这样子就完成了,noimage注册minifilter的问题解决——注册表删除这里就不管了

补充:

1)ddk::nt_reg类是本人自己实现的注册表操作类,有需要自己实现就好了(内核操作注册表是基本功哦)。

2)std::wstring需要STL支持,大家可以参考github相关C++ STL如何内核支持的代码。

3)我的吹水群:48715131



[培训] 优秀毕业生寄语:恭喜id咸鱼炒白菜拿到远超3W月薪的offer,《安卓高级研修班》火热招生!!!

收藏
点赞0
打赏
分享
最新回复 (16)
雪    币: 4339
活跃值: 活跃值 (771)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
blindtiger 活跃值 1 2018-4-30 15:57
2
0
666
雪    币: 1180
活跃值: 活跃值 (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
YZJClear 活跃值 2018-4-30 15:58
3
0
Noimage是什么意思?
雪    币: 72
活跃值: 活跃值 (400)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 活跃值 2 2018-4-30 16:03
4
0
YZJClear Noimage是什么意思?
就是驱动不落地  不存在驱动文件
雪    币: 239
活跃值: 活跃值 (370)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
寧靜致遠 活跃值 2018-4-30 16:53
5
0
IDA能调试内核?????
雪    币: 8670
活跃值: 活跃值 (819)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
cvcvxk 活跃值 10 2018-4-30 16:53
6
0
寧靜致遠 IDA能调试内核?????[em_4][em_4][em_4][em_4][em_4]
一直能啊
雪    币: 7187
活跃值: 活跃值 (1194)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
大道在我 活跃值 2018-4-30 17:30