首页
社区
课程
招聘
[求助]ring3 hook ntdll!NtCreateSection,为什么获取的ObjectAttributes经常无效
发表于: 2012-5-10 16:15 5402

[求助]ring3 hook ntdll!NtCreateSection,为什么获取的ObjectAttributes经常无效

2012-5-10 16:15
5402
NTSTATUS __stdcall Fake_NtCreateSection(
										OUT PHANDLE SectionHandle,
										IN ULONG DesiredAccess,
										IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
										IN PLARGE_INTEGER MaximumSize OPTIONAL,
										IN ULONG PageAttributes,
										IN ULONG SectionAttributes,
										IN HANDLE FileHandle OPTIONAL)
{

	NTSTATUS status;

	status =  NtCreateSection(SectionHandle,DesiredAccess,ObjectAttributes,MaximumSize,PageAttributes,SectionAttributes,FileHandle);
	if (STATUS_SUCCESS != status)
	{
		return status;
	}
	if (SectionHandle == NULL)
	{
		return STATUS_ACCESS_VIOLATION;
	}
	WCHAR szFilePath[MAX_NAME] = {0};
	GetPath(ObjectAttributes,szFilePath);
	DbgPrint("%s: [%s] Enter! %S \n",__MYNAME__,__FUNCTION__,szFilePath);
	return status;
}


调用GetPath的时候,发现ObjectAttributes经常无效,也就是一堆???,那么就无法取得section的名字了,如何解决啊

BOOL GetPath(IN POBJECT_ATTRIBUTES ObjectAttributes,OUT WCHAR* strPath)
{
	//ObjectAttributes结构体经常无效???
	if (NULL == ObjectAttributes->RootDirectory && NULL == ObjectAttributes->ObjectName)
	{
		return FALSE;
	}

	if (NULL != ObjectAttributes->RootDirectory)
	{
 		if (STATUS_SUCCESS != GetFullPathByHandle(ObjectAttributes->RootDirectory, strPath))
 		{
 			return FALSE;
 		}
	}
	if (NULL != ObjectAttributes && NULL != ObjectAttributes->ObjectName && ObjectAttributes->ObjectName->Length > 0)
	{

		lstrcatW(strPath,L"\\");
		lstrcatW(strPath,ObjectAttributes->ObjectName->Buffer);
	}
	return TRUE;
}

NTSTATUS GetFullPathByHandle(IN HANDLE ObjectHandle,OUT WCHAR* strFullPath)
{

	NTSTATUS status;
	BOOL bRet = FALSE;
	POBJECT_NAME_INFORMATION pNameInfo = NULL;

	while (true)
	{
		ULONG uResultLength = 0;
		pNameInfo = (POBJECT_NAME_INFORMATION)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 0x200);

		status = NtQueryObject(ObjectHandle, ObjectNameInformation, pNameInfo, 0x200, &uResultLength);
		if (STATUS_INFO_LENGTH_MISMATCH == status || 
			STATUS_BUFFER_OVERFLOW == status || 
			STATUS_BUFFER_TOO_SMALL == status)
		{
			pNameInfo = (POBJECT_NAME_INFORMATION)HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, pNameInfo, 0x100);
			continue;
		}
		else if (STATUS_SUCCESS == status)
		{
			lstrcpyW(strFullPath,pNameInfo->Name.Buffer);
			break;
		}
		else
		{
			break;
		}

	}

	if (NULL != pNameInfo )
	{
		HeapFree(GetProcessHeap(),0,pNameInfo);
		pNameInfo = NULL;
	}
	return status;
}

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
ObjectAttributes无效很正常~~

正确的方法是从 FileHandle 来获取。
2012-5-10 19:35
0
雪    币: 136
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ring3下能调用ObReferenceObjectByHandle,IoQueryFileDosDeviceName,ObDereferenceObject
。。。。。这些不是ntdll导出的吧。。。。
2012-5-10 20:48
0
雪    币: 12
活跃值: (767)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
ObjectAttributes无效很正常。。。

这句话,我纠结了一天,原来如此啊。。。看样子ring3做ring0的事情,就比较纠结了。。。
2012-5-11 10:21
0
游客
登录 | 注册 方可回帖
返回
//