Ich hab kurzerhand beschlossen mit dieser “MW2 Bot Serie” den Blog erst mal ein wenig zu füllen
In dieser “Tutorialreihe” erwartet euch wie man einen Bot in einer managed Sprache, wie z.B. C#, für ein unmanaged Spiel (C++) programmieren kann. Es werden meistens Teile vom Source vorangehen, der im laufe des Eintrags dann erklärt wird. Hierbei wird natürlich besonders auf die Schwierigkeiten und die Besonderheiten eingegangen, die sich einem hier in den Weg stellen. Meine Erfahrung reicht noch lange nicht aus, um die Abläufe eines C++ Code nach C# portieren zu können, aber dennoch bin ich in der Lage, einiges damit zu leisten. Zudem sollte erwähnt werden, dass eine Sprache mit einer Runtime NIE an eine native Sprache herankommt.
weiterlesen …
[spoiler] Am Anfang war die Theorie… Und damit werde ich mich in diesem Einführungspost widmen, ein Source gibts erst am Teil 1 zu sehen.
Der Unterschied zwischen nativen und managed Sprachen sollte jedem klar sein: Managed Sprachen werden erst von einer Runtime, wie dem .NET Framework, interpretiert (Stichwort: IL Code) und durch diese Runtime in Binärcode umgewandelt. In nativen Sprachen wie C oder C++ geschieht das direkt durch den Compiler, so dass keine Runtime nötig ist.
Die Schwierigkeit ist natürlich jetzt, managed und unmanaged zu kombinieren und zusammenarbeiten zu lassen. Dabei fällt natürlich das Problem auf, dass man nicht einfach managed Code in einem Programm ohne die dazugehörige Runtime ausführen kann. Auf diese Problematik wird in Teil 1 eingegangen.
Hier eine grobe Übersicht welche Stolpersteine einem in den Weg gelegt werden:
- Managed <-> Unmanaged
- Eine C#-DLL hat keinen EntryPoint für eine DLL Injection
- Die Speicherverwaltung erfolgt in C# über Referenzen, in C++ hauptsächlich Pointern. Des weiteren ist managed und unmanaged Speicher “getrennt”.
- Funktionen in C++ haben bestimmte Calling Conventions (Aufrufkonventionen), welche in C# so nicht vorkommen
- Inline ASM-Code ist in C# nur begrenzt möglich
- Man kann keine Referenzen von Objekten aus unmanaged Speicher erzeugen, sondern muss diese jedes mal “neu einlesen”.
Die Liste ist sicherlich noch nicht vollständig, aber am Ende dieser Serie sollte jedes dieser Probleme besprochen und auch irgendwie gelöst sein.
Ich denke das reicht erst mal für den Einstieg. Wer schon mal für die nächsten Teile vorarbeiten möchte, dem empfehle ich sich über “DLL Injection” zu informieren, sowie die Schritte “Von C# zu Binärcode” zu wiederholen.
Greez Easysurfer[/spoiler]