So führen Sie ein PE-Image aus, ohne kernel32.dll und ntdll.dll zu verknüpfen

So führen Sie ein PE-Image aus, ohne kernel32.dll und ntdll.dll zu verknüpfen


Ich habe versucht, einen Peloader zu schreiben.
Ich lade zuerst das ausführbare Image und alle davon abhängigen DLLs (einschließlich Kernel32.dll und Ntdll.dll) in den Speicher, verarbeite alle Importadresstabellen und schreibe alle Daten neu, die verschoben werden müssen.


Dann rufe ich den EntryPoint aller Bilder der Reihe nach auf.
Ich erhalte den Rückgabecode 0 vom EntryPoint der ntdll.dll, aber die Kernel32.dll gibt 0xC0000000 zurück.
Als ich versuchte, den EntryPoint des ausführbaren Bildes aufzurufen, stürzte das Programm ab.


Ich weiß, dass das Windows-System ntdll.dll und kernel32.dll bereits in den Prozessspeicher lädt, wenn der Prozess erstellt wird.
Meine Frage ist, wie ich eine weitere Kopie von ntdll.dll und kernel32.dll in den Speicher laden und meine verknüpfen kann Modul zu den kopierten.


Ich mache ein Experiment:
1. kopiere ntdll.dll -> a.dll



  1. kernel32.dll -> b.dll kopieren

  2. Ändern Sie die PE-Image-Datei b.dll, damit sie nicht von ntdll.dll, sondern von a.dll abhängt

  3. Schreiben Sie ein einfaches Programm a.exe und ändern Sie die PE-Image-Datei a.exe, damit sie nicht von kernel32.dll, sondern von b.dll abhängt

  4. führe eine.exe aus, und das Programm stürzte ab


Ist es möglich, eine.exe korrekt auszuführen?


Das ist meine erste Frage zum Stapelüberlauf, entschuldigen Sie mein schlechtes Englisch.
Danke.