Wie schreibt man einen Loader

Hi,
wie kann ich einen Loader für eine .exe schreiben?
Ich will also BEVOR sie ausgeführt wird im virtuellen Addressraum der exe Code
verändern!

Danke im voruas,
Xalon
 
-(optional: crc-check)
-Mit CreateThread einen Prozess erzeugen ( mit CREATE_SUSPENDED - Flag)
-(optional: Mit ReadProcessMemory überprüfen, ob die Stellen die erwarteten Daten enthalten)
-Mit WriteProcessMemory die Stellen patchen.
-Mit ResumeThread den Hauptthread fortsetzen

Wenn die exe gepackt ist, musst du warten ( z.B. in einer Endlosschleife, die andauernd ReadProcessMemory aufruft, bis die erwarteten Daten vorliegen) bis der Prozess sich vollkommen im Speicher entpackt hat.

Für kompliziertere Loader kannst du auch die Debug-Api verwenden.
 
Danke!
Aber wie erstell ich einen Thread für eine andere Anwendung?
Und vorallem wie mach ich es das genau beim Start der Thread gestartet wird?

Danke im voraus,
Xalon
 
Wenn du einen im Prozesskontext einer anderen Prozesses haben willst, kannst du CreateRemoteThread nehmen.
Und vorallem wie mach ich es das genau beim Start der Thread gestartet wird?

Wie meinst du das? Meinst du, dass der Thread genau dann gestartet werden soll, nachdem du deinen erzeugten, gepatchten Prozess gestartet hast?
Wenn ja, kannst du nachdem du den Hauptthread des anderen Prozesses per ResumeThread fortgesetzt hast, deinen Thread auch per ResumeThread starten.

Btw: Oder hast du da etwas falsch verstanden? Für einen Loader musst du keinen Thread im fremden Prozess erzeugen.
 
Ok dann hab ich was falsch verstanden ;)
Also ich starte einen Thread mit CREATE_SUSPENDED Flag aber was bringst mir?
Es wird ja dieser Thread angehalten und nicht der MainThread des zu patchenden
Programms ?(
Den Rest versteh ich soweit :D

Xalon
 
Wenn du den Ziel-Prozess mit dem CREATE_SUSPENDED-Flag startest, müsste der solange eingefroren sein, bis du seinen Hauptthread fortsetzt. Was es dir bringt? Du kannst in Ruhe die gewünschten Stellen patchen, ohne dass das Programm schon zu arbeiten anfängt.
Mal ein kleines Beispiel:
Code:
STARTUPINFO si;
PROCESS_INFORMATION pi;
if(CreateProcess("foo.exe",0,0,0,0,CREATE_SUSPENDED,0,0,&si,&pi))
{
 //per WriteProcessMemory() patchen
 //wenn du fertig mit patchen bist 
 ResumeThread(pi.hThread);
 //aufrufen

}
else
//Fehlerbehandlung
 
Also CreateProcess nicht CreateThread
Sag das doch gleich :D
Vielen Dank


Xalon

EDIT:
Code:
#define _WIN32_WINNT 0x0500 
#include <windows.h>

int main(void)
{
  SetWindowText(GetConsoleWindow(),"TEST");
  system("PAUSE");
  MessageBox(0,"inhalt","name",MB_OK);
  return 0;
}

Wenn ich dieses Programm loade dann wartet er nicht auf den Tastendruck,warum?
Code:
#include <windows.h>
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    HWND hWnd;
    HANDLE hproc;
    DWORD rw = 0;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    char z[] = "\xc7\x44\x24\x08\x10\x30\x40\x00";
    char buffer;
    unsigned adress = 0x4012E6;

    if(CreateProcess("c.exe",0,0,0,0,CREATE_SUSPENDED,0,0,&si,&pi))
    {
     hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pi.dwProcessId);
       
     for (int i = 0;i < sizeof(z)-1;i++)
     {
      buffer = z[i];
      if(WriteProcessMemory(hproc,(LPVOID)adress,&buffer,sizeof(buffer),&rw))
        cout << "Schreiben erfolgreich!\n" ;
      ++adress;
     }

    ResumeThread(pi.hThread);
    }
    
    system("PAUSE");
    CloseHandle(hproc);//<-- Wichtig!
    return 0;
}

Hiermit lade ich das ganze!
 
Zurück
Oben