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

MagicFuzzX 2012-05-10 04:18:24

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;
}
...全文
146 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Good_Boy_SY 2012-05-11
  • 打赏
  • 举报
回复
木有名字啊。。。亲~
Lactoferrin 2012-05-10
  • 打赏
  • 举报
回复
没名字你怎么取
MagicFuzzX 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

本来就经常没名字
[/Quote]

ring3下如何取路径呢,ring0的那些ob*都不能用啊~
Lactoferrin 2012-05-10
  • 打赏
  • 举报
回复
本来就经常没名字

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧