嗨,
我正在尝试在 Windows x64 中实现手动库映射
器,在 vs2019 中使用 Visual c++ 编译器。
我了解它背后的概念以及如何实现它,
但...
由于某种原因,我未能正确打开现有文件的句柄。
'_NtOpenFile' 在代码片段之前被正确解析。
(检查了值,我可以在 windbg 中看到代码正在跳转到正确的函数)。
但是我没有正确使用它,我在文档之后定位:
https://www.ired.team/offensive-security/defense-evasion/using-syscalls-directly-from-visual-studio-to-bypass-avs-edrs
https://resources.infosecinstitute.com/topic/calling -ntdll-函数-直接/
所以我的问题是,如果我对 NtOpenFile 做错了什么,可能是误解了一个概念?NtOpenFile 与当时 winapi 的 OpenFile 实现有何不同?
EXTERN_C NTSTATUS _NtOpenFile(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG ShareAccess,
IN ULONG OpenOptions);
是我的 NtOpenFile 定义,文档之后的一切。
WCHAR lib_name[] = L"C:\\Windows\\System32\\rpcrt4.dll";
UNICODE_STRING unicode_string;
unicode_string.Buffer = &lib_name;
unicode_string.Length = 33 * sizeof(WCHAR);
unicode_string.MaximumLength = 34 * sizeof(WCHAR);
我的环境不允许我使用 RtlInitUnicodeString,
但 unicode 字符串在以下文档之后被初始化:
https ://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntstrsafe/nf-ntstrsafe- rtlunicodestringinitex(备注)
所以它应该被正确初始化。
NTSTATUS status = 0;
HANDLE file_handle = NULL;
OBJECT_ATTRIBUTES obj_attr;
IO_STATUS_BLOCK status_block;
InitializeObjectAttributes(&obj_attr, &unicode_string, OBJ_CASE_INSENSITIVE, NULL, NULL);
wprintf(L"Filename: %s\n", unicode_string.Buffer);
if(!NT_SUCCESS(status = _NtOpenFile(&file_handle, FILE_READ_DATA, &obj_attr, &status_block, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT)))
{
printf("Couldnt open file, error: %i, status: %i", (int)GetLastError(), status);
return NULL;
}
printf("Opened file");
安慰:
Filename: C:\Windows\System32\rpcrt4.dll
Couldnt open file, error: 0, status: -1073741811