NtReadFile 不读取

NtReadFile doesn't read

本文关键字:读取 NtReadFile      更新时间:2023-10-16

我尝试用nativeApi编写dll注入器。我的第一个问题是这样做的好吗?第二个是:NtReadFile不会失败,但也不会读取。我认为这是缓冲错误,但我不确定?我如何解决这个问题?

现在是这样的:

bool initiationDll(const std::string& dllPath){
if (!isDllExist(dllPath))
{
    printf("Dll doesn't exist!n");
    return false;
}
else
{
printf("LibraryPath :%sn", dllPath.c_str());
NTSTATUS status; 
HANDLE lFile;
OBJECT_ATTRIBUTES objAttribs = { 0 }; 
UNICODE_STRING unicodeString;
std::string dllPathWithprefix = "\??\" + dllPath;
std::wstring wString = std::wstring(dllPathWithprefix.begin(), dllPathWithprefix.end()); PCWSTR toPcwstr = wString.c_str();
RtlInitUnicodeString(&unicodeString, toPcwstr);
InitializeObjectAttributes(&objAttribs, &unicodeString, OBJ_CASE_INSENSITIVE, NULL, NULL);
objAttribs.Attributes = 0;
const int allocSize = 2048;
LARGE_INTEGER largeInteger;
largeInteger.QuadPart = allocSize;
IO_STATUS_BLOCK ioStatusBlock;
status = NtCreateFile(
    &lFile,
    GENERIC_ALL,
    &objAttribs,
    &ioStatusBlock,
    &largeInteger,
    FILE_ATTRIBUTE_NORMAL, 
    FILE_SHARE_READ, 
    FILE_OPEN,
    FILE_NON_DIRECTORY_FILE, 
    NULL, 
    NULL
);
if (!NT_SUCCESS(status)) {
    printf("CreateFile failed..n");
    return false;
}
else {
    printf("Library Handle : %pn", lFile);
    DWORD fileSize = getDllSize(dllPath);
    if (fileSize == 0)
    {
        printf("File size 0.n");
        return false;
    }
    else
    {
        printf("File size : %d byte.n", fileSize);
        PVOID FileReadBuffer; 
        FileReadBuffer = new CHAR[fileSize];
        status = NtReadFile(
            lFile,
            NULL,
            NULL, 
            NULL, 
            &ioStatusBlock,
            FileReadBuffer,
            sizeof(FileReadBuffer),
            0, // ByteOffset
            NULL);
        if (!NT_SUCCESS(status))
        {
            printf("Unable to read the dll...  : %dn", GetLastError());
            return false;
        }
    }
}}

For NtCreateFile:

status -> 0
ioStatusBlock : Status      -> 0
                Pointer     -> 0x00000000
                Information -> 1

我尝试NtOpenFile和相同的结果。

For NtReadFile:
status -> -1073741811
ioStatusBlock : Status      -> 0
                Pointer     -> 0x00000000
                Information -> 1

NtCreateFile函数后的结果值

NtReadFile函数后的结果值

if (lFile == INVALID_HANDLE_VALUE) -您需要检查返回的status而不是lFile,并且NT从未将文件句柄设置为INVALID_HANDLE_VALUE -因此条件始终为FALSE。OPEN_EXISTING(3) -错误的常数NtCreateFile -需要使用FILE_OPEN(1)为例或使用NtOpenFile。您以异步方式打开文件(没有FILE_SYNCHRONOUS_IO_NONALERTFILE_SYNCHRONOUS_IO_NALERT) -由于NtReadFile,您获得STATUS_PENDING (0x103)的速度更快。所以你没有进入STATUS_PENDINGif (!NT_SUCCESS(status))块,但FileReadBuffer的数据还没有准备好。

和下一次张贴所有状态和ioStatusBlock值

NtReadFile的状态码-1073741811表示通过了INVALID_PARAMETER

ErrorCodeDescription

将0赋给ByteOffset参数为我解决了这个问题;

LARGE_INTEGER liBytes = { 0 };
status = SysNtReadFile(pFileHandle, NULL, NULL, NULL, &statusBlock, buffer, fileSize, &liBytes, NULL);