2016-09-07 1 views
-2

Ich versuche, dll-Injektor mit nativeApi zu schreiben. Aus diesem Grund habe ich diesen Code geschrieben. NtReadFile Funktion liest etwas, aber ich sehe nichts außer dem ersten Wert von FileReadBuffer. Außerdem weiß ich nichts darüber, wie dll in Puffer schaut.Wie kann ich den Inhalt des Puffers sehen und mit der DLL-Datei vergleichen?

(1) Wie kann ich Puffer und DLL-Datei vergleichen?

(2) Wie kann ich sicher sein, dass der Code korrekt ausgeführt wird?

(3) Und bitte sagen Sie mir meinen Fehler im Code.

bool Injector::initiationDll(const std::string& dllPath) 
{ 
    if (!isDllExist(dllPath)) 
    { 
     printf("Dll not found!\n"); 
     return false; 
    } 
    else 
    { 
     printf("LibraryPath: %s\n", dllPath); 

     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_READ | FILE_READ_DATA | SYNCHRONIZE, 
      &objAttribs, 
      &ioStatusBlock, 
      &largeInteger, 
      FILE_ATTRIBUTE_NORMAL, 
      FILE_SHARE_READ | FILE_SHARE_WRITE, 
      FILE_OPEN, 
      FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, 
      NULL, 
      0); 

     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 is zero.\n"); 
       return false; 
      } 
      else 
      { 
       printf("File size : %d byte.\n", fileSize); 

       PVOID FileReadBuffer = VirtualAlloc(NULL, fileSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); 

       if (!FileReadBuffer) 
       { 
        printf("\nError: Unable to allocate memory(%d)\n", GetLastError()); 

        status = NtClose(lFile); 
        return false; 
       } 
       else { 
        printf("Allocate %d byte for buffer.\n", 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; 
        } 
        else { 
         status = NtClose(lFile); 
         for (int i = 0; i < sizeof(fileSize); i++) 
         { 
          //wprintf(L"%p : %s\n", FileReadBuffer, FileReadBuffer); 
         } 
        } 
       } 
      } 
     } 
    } 
} 

enter image description here enter image description here

+2

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

@ πάνταῥεῖ Deine '[edit]' Sache ist irgendwie kaputt. –

+0

@BaummitAugen Es kann nicht in einer generischen Art und Weise verwendet werden IIRC –

Antwort

0
status = NtReadFile(
         lFile, 
         NULL, 
         NULL, 
         NULL, 
         &ioStatusBlock, 
         FileReadBuffer, 
         sizeof(FileReadBuffer), // !!!!! 
         0, // ByteOffset 
         NULL); 

so lesen Sie sizeof (FileReadBuffer) - 4 oder 8 Byte nur. Ich sehe Sie meinen Rat von here

+0

Danke :) Ich dachte gelesen 4 byte by 4 byte bis zum Ende der Datei: D Now ioStatusBlock.information = 113664 –

Verwandte Themen