2016-09-04 26 views
-2

nativeApiでdll injectorを書き込もうとしています。私の最初の質問は、それを行うこの良い方法ですか? また、NtReadFileは失敗しませんが、読み取られません。私はそれがバッファーが間違っていると思うが、わからないのですか?どうすればこの問題を解決できますか? NtCreateFileについては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; 
     } 
    } 
}} 

を::

今ではこのようになります

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

値。 GetLastError()は、ネイティブAPIではなくWindows APIを使用している場合にのみ設定されるため、ここでは役に立ちません。 – MrEricSir

答えて

0

if (lFile == INVALID_HANDLE_VALUE) - あなたがstatusをチェックする必要は返さなくlFileとNTはINVALID_HANDLE_VALUEにファイルハンドルを設定したことがない - ので、条件は必ずFALSEになります。 OPEN_EXISTING(3) - 間違った定数NtCreateFile - たとえばFILE_OPEN(1)を使用するか、NtOpenFileを使用する必要があります。非同期(no FILE_SYNCHRONOUS_IO_NONALERTまたはFILE_SYNCHRONOUS_IO_NALERT)のファイルを開きます。STATUS_PENDING(0x103)の結果はすべてNtReadFileのように速くなります。したがってSTATUS_PENDINGのブロックはif (!NT_SUCCESS(status))には入力しませんが、データはまだには準備できていません。

と次回のポストすべてのステータスとIoStatusBlockのは、ちょうど `NtReadFile`コールの後にブレークポイントを入れて、戻り値をチェック

関連する問題