Explorer - Welche Funktion um Ordner aufzulisten?



  • Hi,
    wie der Titel schon verrät ist meine Frage welche Funktion die explorer.exe benutz um den Inhalt eines Ordners anzuzeigen?

    Ich habe gedacht es wäre FindFirstFile & FindNextFile, dem ist aber nicht so kann das sein?

    Meine Vermutung kommt daher, da ich ne DLL geschrieben hab die die Funktion FindNextFile hook und wenn das gefundene File z.B. "geheim.txt" heisst einfach an den anfang von MEMORY_BASIC_INFORMATION->cFileName eine '\0' hinschreibt.

    Hab ich auch mit einem Programm getestet:

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    	BOOL bAgain = TRUE;
    	HANDLE hFile = INVALID_HANDLE_VALUE;
    	TCHAR szPath[] = TEXT("C:\\test\\*");
    	WIN32_FIND_DATA findData;
    	char question = 0;
    
    	int i = 0;
    
    	while(bAgain == TRUE)
    	{
    	    hFile = FindFirstFile(szPath, &findData);
    
    	    if(hFile != INVALID_HANDLE_VALUE)
    	    {
    	        printf("%s\n", findData.cFileName);
    
    	        while(FindNextFile(hFile, &findData) != 0)
                    printf("%s\n", findData.cFileName);
    
                if( (i = GetLastError()) != ERROR_NO_MORE_FILES)
                    printf("Last error nr: %i\n", i);
    
                FindClose(hFile);
    	    }
    	    else
    	    {
    	        printf("hFile = Invalid handle value!\n");
    	        printf("GetLastError() = %ui", GetLastError());
    	        bAgain = FALSE;
    	    }
    
    	    printf("\n\nAgain");
    	    scanf("%c", &question);
    
    	    if(question != 'j')
                bAgain = FALSE;
    	}
    	return 0;
    }
    

    Einmal auflisten lassen, meine DLL injiziert, nochmal auflisten lassen und tada geheim.txt wird nicht angezeigt.

    Wenn ich aber jetzt meine DLL in explorer.exe injiziere wir die Datei trotzdem noch angezeigt.

    Wäre dankbar für jede Antwort
    Gruß Pingu-Group



  • Ich behaupte mal, Explorer verwendet offensichtlich andere Funktionen.

    z.B. mit IOCTLs? (Das ist nur so ein Gedanke von mir, wie es wirklich funktioniert weiß ich nicht)

    Martin



  • Mmacher schrieb:

    Ich behaupte mal, Explorer verwendet offensichtlich andere Funktionen.

    Und ich bin mir ziemlich sicher, dass er dies nicht tut. Eher vermute ich dass der Fehler im Code des Hooks liegt.


  • Mod

    _Luckie schrieb:

    Und ich bin mir ziemlich sicher, dass er dies nicht tut. Eher vermute ich dass der Fehler im Code des Hooks liegt.

    ACK!



  • Zeig mal deinen Hook 😃



  • Hey sorry das ich erst jetzt wieder schreib, aber ich war jetzt 5Tage aufn Taubertal Festival :D.

    hab jetzt das problem mal ein bissle eingeschränkt.
    Irgendwie liegt es dran, dass die Funktion WriteProcessMemory immer ein byte weiter hinten anfängt zu schreiben.
    Bspl:

    Orginal FindNextFileW
    
    7C80EF5A k>  6A 2C               PUSH 2C                                          ; FindNextFileW
    7C80EF5C     68 58F0807C         PUSH kernel32.7C80F058
    7C80EF61     E8 6035FFFF         CALL kernel32.7C8024C6
    

    als Argument für WriteProcess Memory wird "7C80EF5A" übergeben aber nach dem Aufruf steht das da:

    7C80EF5A k>  6A 90               PUSH -70                                         ; FindNextFileW
    7C80EF5C     90                  NOP
    7C80EF5D     90                  NOP
    7C80EF5E     90                  NOP
    7C80EF5F     90                  NOP
    7C80EF60     90                  NOP
    

    Obwohl ich ja ab "7C80EF5A" "NOPen" wollte 😕.

    Und in mein Array liest er au ned die ersten 7bytes von FindNextFileW sondern:

    CC 2C 68 58 F0 80 7C
    

    Hier mal der Hook:

    void DLL_EXPORT func_hook(unsigned source_addr, unsigned bytes_to_save, unsigned new_addr, unsigned instead_call, DWORD proc_id)
    {
        unsigned char byte = 0;
    
        DWORD rw = 0;
    
        HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id);
    
        unsigned temp_addr[10];
    
        unsigned char* ar_to_save = malloc(bytes_to_save);
    
        temp_addr[0] = source_addr;
        temp_addr[1] = new_addr;
    
        if(hproc != NULL)
        {
    //OPs von Source_Func lesen
            if(ReadProcessMemory( hproc, (LPVOID) source_addr, ar_to_save, bytes_to_save, &rw) == 0)
                MessageBox(NULL, TEXT("Error while readind OPs from source"), TEXT("Error"), MB_OK);
    //OPs von Source_func an new_func schreiben
            if(WriteProcessMemory( hproc, (LPVOID) new_addr, ar_to_save, bytes_to_save, &rw) == 0)
                MessageBox(NULL, TEXT("Error while writing OPs to new_addr"), TEXT("Error"), MB_OK);
    
            memset(ar_to_save, NOP, bytes_to_save);
    //save_bytes von source mit NOPs füllen
            if(WriteProcessMemory( hproc, (LPVOID) source_addr, ar_to_save, bytes_to_save, &rw) == 0)
                MessageBox(NULL, TEXT("Error while writing NOPs to source"), TEXT("Error"), MB_OK);
            source_addr = temp_addr[0];
    
            byte = JUMP;
    //an anfang von source nen jump schreiben
            WriteProcessMemory( hproc, (LPVOID) source_addr, &byte, sizeof(byte), &rw);
    
            temp_addr[2] = sprungoffset(source_addr, instead_call);
    
            source_addr += 1;
    //an source sprungweite schreiben
            WriteProcessMemory( hproc, (LPVOID) source_addr, &temp_addr[2], sizeof(temp_addr[2]), &rw);
    
            byte = JUMP;
    
            new_addr = temp_addr[1];
            new_addr += bytes_to_save;
    //an new_addr + bytes_to_save ein jump schrieben
            WriteProcessMemory( hproc, (LPVOID) new_addr, &byte, sizeof(byte), &rw);
    
            temp_addr[3] = sprungoffset( temp_addr[1] + bytes_to_save, temp_addr[0] + 5);
    
            new_addr += 1;
    //sprungoffset an new_addr schrieben
            WriteProcessMemory( hproc, (LPVOID) new_addr, &temp_addr[3], sizeof(temp_addr[3]), &rw);
    
            CloseHandle( hproc );
        }
        else
            intprintf("coudl not open the process with id: %i\n",proc_id);
    }
    

    Wenn so noch iwelche Infos nötig sind sagt bescheid.
    Gruß Pingu-Group


Log in to reply