2016-09-04 10 views
-2

Я пытаюсь написать dll инжектор с nativeApi. Мой первый вопрос - это хороший способ сделать это? И второе: NtReadFile не подводит, но и не читает. Я думаю, что это неправильно, но я не уверен? Как я могу исправить эту проблему?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 

Result values right after NtCreateFile function

Result values right after NtReadFile function

+0

Поставьте точку останова только после 'NtReadFile' вызова и проверить возвращаемое значение. 'GetLastError()' вам не поможет, поскольку это устанавливается только в том случае, если вы используете Windows API, а не собственный API. – MrEricSir

ответ

0

if (lFile == INVALID_HANDLE_VALUE) - вам нужно проверить status вернулся, но не lFile и NT не установлен дескриптор файла INVALID_HANDLE_VALUE - так состояние всегда будет FALSE , 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 значения