NtQueryDirectoryFile Hook -- explorer hängt beim Dateien Umbenennen trozt minimaler änderung



  • Hi Leute,
    ja ich bins schonwieder 😃

    Diesmal gehts um einen NtQueryDirectoryFile Hook.

    Er funktioniert an sich schon wie er soll,allerdings hängt sich der explorer immer auf wenn ich versuche eine Datei umzubenennen...

    Die originale Funktion befindet sich @new_adress.

    Die angehängteFunktion wird statt der originalen aufgerufen
    Lasse ich die while(1) Schleife weg geht alles 😕

    Schon mal vielen Dank 🙂
    Xalon

    DWORD WINAPI instead_call(HANDLE a,HANDLE b,PIO_APC_ROUTINE c,PVOID d,PIO_STATUS_BLOCK e,PVOID f,ULONG g,FILE_INFORMATION_CLASS h,BOOLEAN i,PUNICODE_STRING j,BOOLEAN k)
    {
     char* cbuf = (char*)f;
    
     //ruft ori funktion auf
     DWORD back = new_adress(a,b,c,d,e,f,g,h,i,j,k);
    
     int index = 0;
    
    if(h == 3)  // FILE_INFORMATION_CLASS  == FILE_BOTH_DIRECTORY_INFORMATION
    {
      FILE_BOTH_DIRECTORY_INFORMATION* info;     
      // Lass ich die Schleife weg geht alles o.O
      while(1)
      {
      info = (FILE_BOTH_DIRECTORY_INFORMATION *)&cbuf[index];
    
      if (info->NextEntryOffset == 0)
       break;
    
      index += info -> NextEntryOffset;
      } 
    
    }
     return back;
    }
    


  • Du darfst nicht vergessen, dass "NtQueryDirectoryFile ()" eine undokumentierte Funktion ist.*

    Niemand* (ausser der "Erschaffer" 🙂 ) weiss, warum, wie und mit welchen Parametern der Explorer "NtQueryDirectoryFile ()" aufruft wenn eine Datei umbenannt wird.

    Lass Dir "NextEntryOffset" ausgeben und prüfe, ob

    if (info->NextEntryOffset == 0)
     break;
    

    in so einem Fall eine geeignete Abbruchbedingung ist.



  • Da die Funktion undokumentiert ist, vermute ich mal, dass Deine größe von "FILE_BOTH_DIRECTORY_INFORMATION" nicht stimmt (da sich diese ja mit *jedem* Hotfix, SP ändern kann)!

    Warum verwendest Du nicht FindFirstChangeNotification?



  • Vielleicht hilft dir ja diese Seite: http://rootkit.com/newsread.php?newsid=36



  • Ah vielen Dank für eure Hilfe 🙂
    merker hatte Recht,scheinbar wird NextEntryOffset beim Umbenennen nicht auf 0 gesetzt.

    Naja Undokumentiert halt 😉

    Habs jetzt so gelöst:

    //g = BufferLength
      if(index > g)
       break;
    

    mfg,
    Xalon


Anmelden zum Antworten