Teile einer Funktion verstehen



  • Hi, kann mir mal bitte jemand erläutern was hier so ungefehr passiert?

    DWORD UnknownFunction(HANDLE hProc) { 
       HANDLE hRemote = NULL; 
       void *rem = NULL; 
       DWORD dwBuf = 0, dwOffset = 0x6FB31120; 
    
       char szCode[] = { 
          0xB8, 0x00, 0x00, 0x00, 0x00,        
          0xBB, 0x00, 0x00, 0x00, 0x00,              
          0xFF, 0xD3,                        
          0xC1, 0xF8, 0x08,                   
          0xC3                              }; 
    
       *(DWORD*)&szCode[1] = 6; 
       *(DWORD*)&szCode[6] = dwOffset; 
    
       rem = VirtualAllocEx(hProc, NULL, sizeof(szCode), MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); 
    
       WriteProcessMemory(hProc, rem, szCode, sizeof(szCode), NULL); 
    
       hRemote = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)rem, NULL, 0, NULL); 
       WaitForSingleObject(hRemote, INFINITE); 
       GetExitCodeThread(hRemote, &dwBuf); 
    
       VirtualFreeEx(hProc, rem, sizeof(szCode), MEM_DECOMMIT|MEM_RELEASE); 
    
       return dwBuf; 
    }
    

    Eigentlich verstehe ich nur diese folgenden Zeilen nicht: (Die verwendeten Funktionen weiter unten im Programm stehen ja einfach in der msdn, wo ich schon nachgesehen habe)

    DWORD dwBuf = 0, dwOffset = 0x6FB31120; 
    
       char szCode[] = { 
          0xB8, 0x00, 0x00, 0x00, 0x00,          
          0xBB, 0x00, 0x00, 0x00, 0x00,          
          0xFF, 0xD3,                        
          0xC1, 0xF8, 0x08,                  
          0xC3                           
       }; 
    
       *(DWORD*)&szCode[1] = 6; 
       *(DWORD*)&szCode[6] = dwOffset;
    

    Ich habe mir selbst Gedanken gemacht:

    DWORD dwBuf = 0
    

    bedeutet wohl einfach nur :

    unsigned long dwBuf = 0
    
    dwOffset = 0x6FB31120;
    

    Ich glaube 6FB31120 ist hexadezimal und müßte damit (wenn ich richtig gerechnet habe) 1874006304 sein. Dies sieht aus, wie eine Speicheradresse.

    Die folgenden Befehle habe ich schon in der MSDN nachgesehen

    VirtualAllocEx(...)
    WriteProcessMemory(...)
    CreateRemoteThread(...)
    WaitForSingleObject(...)
    GetExitCodeThread(...)
    VirtualFreeEx(...)
    

    (Somit denke ich das gesamte Programm ließt einfach eine Variable an einer bestimmten Speicheradresse von einem Process dessen Handle man angeben kann, aus.)

    Das Problem liegt auch eher beim Folgenden:

    char szCode[] = {
    

    legt einfach ein Array von char an 😃

    0xB8, 0x00, 0x00, 0x00, 0x00,        
          0xBB, 0x00, 0x00, 0x00, 0x00,              
          0xFF, 0xD3,                        
          0xC1, 0xF8, 0x08,                   
          0xC3
    

    Legt hexadezimal Werte dort ab. Hier ist z.B die Frage: Wo ist der Sinn Hexadezimal Werte anzugeben und nicht normale Zeichen? (Und warum genau diese Werte?)

    *(DWORD*)&szCode[1] = 6; 
       *(DWORD*)&szCode[6] = dwOffset;
    

    Diese beiden Zeilen verstehe ich leider wirklich nicht mehr.



  • nix für ungut, abr wenn du das nich checkst is das noch ne nr. zu hoch für dich. das sind opcodes, was die machen kannste ja mal in deiner x86 befehlsreferenz nachlesen, das such ich dir jetzt nich raus ➡



  • Auch funktioniert dat ganze mit Vista nicht mehr...



  • asdca schrieb:

    das sind opcodes

    Danke!

    Ich habe mir jetzt die Arbeit gemacht und diese rausgesucht:

    char szCode[] = { 
          0xB8, 0x00, 0x00, 0x00, 0x06,         //mov eax, 6 
          0xBB, 0x00, 0x00, 0x00, 0x00,         //mov ebx, 0 
          0xFF, 0xD3,                        //call ebx 
          0xC1, 0xF8, 0x08,                  //sar eax, 8 
          0xA3, 0x00, 0x00, 0x00, 0x00,         //mov DWORD PTR DS:[0], eax 
          0xC3                           //ret 
       };
    

    Kann mir jetzt Jemand sagen was das macht?

    Und vor allem was diese beiden Zeilen machen?

    *(DWORD*)&szCode[1] = 6; 
       *(DWORD*)&szCode[6] = dwOffset;
    


  • wenn du das rausgesucht hast, musst du es doch wissen. der frickelcode da unten schreibt nur 6 in an die stelle da oben wo "0x00, 0x00, 0x00, 0x06" steht und dwOffset an die position hinter 0xbb wo die vier null bytes sind. wenn der code da in szCode ausgeführt wird lädt er also eax mit 6, ebx mit 0x6FB31120, callt die funktion an der adresse 0x6FB31120 und shiftet danach das funktionsergebnis um 8 nach rechts. wenn du damit nix anfangen kannst, dann frickel damit nich rum, sonst kann windows zerstört werden und dein pc könnte explodieren.



  • asdca schrieb:

    wenn du das rausgesucht hast, musst du es doch wissen. der frickelcode da unten schreibt nur 6 in an die stelle da oben wo "0x00, 0x00, 0x00, 0x06" steht und dwOffset an die position hinter 0xbb wo die vier null bytes sind. wenn der code da in szCode ausgeführt wird lädt er also eax mit 6, ebx mit 0x6FB31120, callt die funktion an der adresse 0x6FB31120 und shiftet danach das funktionsergebnis um 8 nach rechts. wenn du damit nix anfangen kannst, dann frickel damit nich rum, sonst kann windows zerstört werden und dein pc könnte explodieren.

    Danke!

    Also wird insgesamt nur die Speicherstelle bestimmt, an der der Code weiter unten den Wert ausließt?



  • naja so ungefär


Anmelden zum Antworten