Da ich gut aus der Exkursion zurückgekehrt bin wird es gleich einen weiteren Artikel in der MW2 Bot Serie geben. In diesem wird es sich um die, schon in Teil 0 angesprochene, InlineASM Verwendung unter C# drehen. Dabei wird die SendCommandToConsole-Funktion verwendet, welche es erfordert den Stack zu fixxen. Zudem ist diese Funktion relativ unkomplex und klein, daher kann man sie gut als “Modell” verwenden
Aber bevor ich über die mehr oder weniger komplexen Vorgänge rede, hier erstmal die Funktion in C++:
VOID SendCommandToConsole( CHAR* szCommand )
{
DWORD dwSend = (DWORD)0x004D3EA0; // Die Adresse von SendCommandToConsole
_asm push szCommand // Wir pushen unseren Command, bzw die Adresse, auf den Stack
_asm push 0 // Wir pushen eine null auf den Stack (Verwendung unbekannt)
_asm call dwSend // Da wir alle erforderlichen Sachen auf dem Stack haben wird die Funktion angesprungen
_asm add esp, 0x8 // Und es wird der Stack gefixxt
} |
Sieht doch ganz überschaubar aus
Zu erwähnen ist noch, dass auf diesen ASM-Code noch ein RET folgen muss, was aber in diesem Fall vom Compiler später übernommen wird.
Um ASM-Code von C# auszuführen braucht es mindestens folgende Schritte:
- Per VirtualAlloc Platz für den Code schaffen. Dabei muss der Speicher auf PAGE_EXECUTE_READWRITE gesetzt werden! Daher ist auch die Verwendung von Marshal.AllocHGlobal nicht möglich, es muss die reine WinAPI verwendet werden.
- Den Code zu dem reservierten Speicher kopieren.
- Ein Delegate mit dem Typ void auf den Anfang des Codes setzen
- Eine Funktion des Types des Delegates erstellen und aufrufen.
Weiterlesen
10 people like this post.