0


嗨,
我正在尝试在 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
4

0 回答 0