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
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);