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.
-
_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.7C8024C6als 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 NOPObwohl 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 7CHier 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