首页
社区
课程
招聘
[讨论]内核下删除系统痕迹
发表于: 2017-12-10 23:00 4173

[讨论]内核下删除系统痕迹

2017-12-10 23:00
4173
背景介绍:
        windows下系统会自动记录所有开启过的EXE并且写入注册表存放。
        如此一来方便了所有的取证、反外挂、反调试等等工具,但是干扰了你的操作

问题汇总:
        1.内核态下如何取得 HKEY_CURRENT_USER 项键值。
        2.怎么从N项注册表中准确定位到当前登陆用户SID。
        3.取得的注册表项为什么看着不太对。
        4.怎么在EXE开启后就删除对应痕迹。

代码片段: (完整源码在附加中,楼主只在win7 x64下跑过)
         问题一: 内核态如果不直接解析注册表文件,无法直接取得  HKEY_CURRENT_USER 项键值。
         问题二: 我也无法准确定位当前登陆用户名SID,我只是取了一个比较长的SID作为当前登陆用户SID。
BOOLEAN GetRegisterSID(UNICODE_STRING& uStringSID)
{
	BOOLEAN bRet = FALSE;

	UNICODE_STRING uRegSID;
	RtlInitUnicodeString(&uRegSID, L"\\Registry\\Machine\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList");

	OBJECT_ATTRIBUTES ObjAttributes;
	InitializeObjectAttributes(&ObjAttributes, &uRegSID, OBJ_CASE_INSENSITIVE, NULL, NULL);

	HANDLE hRegister = NULL;
	NTSTATUS status = ZwOpenKey(&hRegister, KEY_ALL_ACCESS, &ObjAttributes);

	if ((NT_SUCCESS(status)) && (NULL != hRegister))
	{
		ULONG uKeySize = 0;
		status = ZwQueryKey(hRegister, KeyFullInformation, NULL, 0, &uKeySize);

		if (uKeySize > 0)
		{
			PKEY_FULL_INFORMATION pFullInfo = (PKEY_FULL_INFORMATION)ExAllocatePool(PagedPool, uKeySize);

			if (NULL != pFullInfo)
			{
				RtlZeroMemory(pFullInfo, uKeySize);

				ULONG uRelust = 0;
				status = ZwQueryKey(hRegister, KeyFullInformation, pFullInfo, uKeySize, &uRelust);

				for (ULONG i = 0; i < pFullInfo->SubKeys; i++)
				{
					status = ZwEnumerateKey(hRegister, i, KeyBasicInformation, NULL, 0, &uRelust);

					if (uRelust > 0)
					{//SID
						PKEY_BASIC_INFORMATION pBaseInfo = (PKEY_BASIC_INFORMATION)ExAllocatePool(PagedPool, uRelust);

						if (NULL != pBaseInfo)
						{
							RtlZeroMemory(pBaseInfo, uRelust);

							if (NT_SUCCESS(ZwEnumerateKey(hRegister, i, KeyBasicInformation, pBaseInfo, uRelust, &uRelust)))
							{
								if (pBaseInfo->NameLength > 20)
								{
									RtlCopyMemory(uStringSID.Buffer, pBaseInfo->Name, pBaseInfo->NameLength);
									uStringSID.Length = (USHORT)pBaseInfo->NameLength;

									bRet = true;
									break;
								}
							}

							ExFreePool(pBaseInfo);
						}
					}
				}

				ExFreePool(pFullInfo);
			}
		}

		ZwClose(hRegister);
	}

	return bRet;
}
         问题三: 系统使用了ROT13加密存放,所以不是明文。(网上并没有C/C++直接可用的SDK)
CHAR GetROT13Key(UCHAR uKey)
{
	CHAR pRet = uKey;

	if (uKey >= 'a' && uKey <= 'm')
	{
		pRet += 13;
	}
	else if (uKey >= 'n' && uKey <= 'z')
	{
		pRet -= 13;
	}
	else if (uKey >= 'A' && uKey <= 'M')
	{
		pRet += 13;
	}
	else if (uKey >= 'N' && uKey <= 'Z')
	{
		pRet -= 13;
	}

	return pRet;
}

VOID DecryptionKey(UCHAR* pKeyData, INT inLen)
{
	if ((NULL == pKeyData) || (0 == inLen))
	{
		return;
	}

	for (INT i = 0; i < inLen; i++)
	{
		pKeyData[i] = GetROT13Key(pKeyData[i]);
	}
}
           问题四:1. 直接在进程创建回调中使用附件中的代码删除即可。
                       2.注册一个注册表回调来动态解密控制。


[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 256
活跃值: (25)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
ZwQueryInformationToken    可以获取  SID
2017-12-11 09:31
0
雪    币: 310
活跃值: (2227)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark
2017-12-11 14:18
0
雪    币: 3121
活跃值: (1609)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
M
2017-12-11 14:47
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
5
内核有直接取CurrentUserKey的api,是nt的导出函数
2017-12-14 09:52
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
6
hzqst 内核有直接取CurrentUserKey的api,是nt的导出函数
RtlFormatCurrentUserKeyPath  取得是当前进程的user的keypath....惨烈
2017-12-15 06:21
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
7
cvcvxk RtlFormatCurrentUserKeyPath 取得是当前进程的user的keypath....惨烈
这时候就该KeStackAttachProcess到user的csrss上了
2017-12-15 18:27
0
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
mark
2018-1-25 10:20
0
雪    币: 310
活跃值: (2227)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
mark
2018-1-25 19:17
0
游客
登录 | 注册 方可回帖
返回
//