NtReadFile не читает

Я пытаюсь написать DLL-инжектор с nativeApi. Мой первый вопрос, это хороший способ сделать это? И второе: NtReadFile не дает сбоя, но также не читает. Я думаю, что это неправильный буфер, но я не уверен? Как я могу исправить эту проблему?

Теперь это выглядит так:

bool initiationDll(const std::string& dllPath){
if (!isDllExist(dllPath))
{
    printf("Dll doesn't exist!\n");
    return false;
}
else
{
printf("LibraryPath :%s\n", 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 : %p\n", 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...  : %d\n", GetLastError());
            return false;
        }
    }
}}

Для NtCreateFile:

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

Я пытаюсь NtOpenFile и тот же результат.

Для NtReadFile:

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

Значения результата сразу после функции NtCreateFile

Значения результата сразу после функции NtReadFile

2 ответа

if (lFile == INVALID_HANDLE_VALUE) - вам нужно проверить status вернулся, но не lFile и NT никогда не устанавливает дескриптор файла в INVALID_HANDLE_VALUE - так что условие всегда будет ЛОЖЬ. OPEN_EXISTING (3) - неверная константа для NtCreateFile - нужно использовать FILE_OPEN (1) например или использовать NtOpenFile, вы открываете файл как асинхронный (нет FILE_SYNCHRONOUS_IO_NONALERT или же FILE_SYNCHRONOUS_IO_NALERT) - так быстрее всего у тебя получилось STATUS_PENDING (0x103) как результат NtReadFile, так что вы не входите в if (!NT_SUCCESS(status)) блок для STATUS_PENDING но данные еще не готовы в FileReadBuffer,

и в следующий раз опубликуйте все значения статуса и ioStatusBlock

Код состояния -1073741811 отNtReadFileозначает, что вы прошлиINVALID_PARAMETER.

КодОшибкиОписание

Присвоение 0ByteOffsetпараметр исправил проблему для меня;

      LARGE_INTEGER liBytes = { 0 };
status = SysNtReadFile(pFileHandle, NULL, NULL, NULL, &statusBlock, buffer, fileSize, &liBytes, NULL);
Другие вопросы по тегам