Ist x86 assembler über .NET möglich?
Gibt es so etwas wie eine x86-assembler, dass ich anrufen kann, durch C#? Ich möchte in der Lage sein, um pass x86-Anweisungen als string und erhalten Sie ein byte-array zurück. Wenn man nicht existiert, wie kann ich meine eigenen?
Klar zu sein - ich will nicht nennen Assembler-code aus C# - ich will einfach nur, um der Lage sein zu montieren-code von Anweisungen und bekommen die Maschine code in ein byte-array. Ich werde die Injektion dieser code wird erzeugt on-the-fly) zu injizieren in einem anderen Prozess insgesamt.
- ist der andere Prozess eine nicht verwaltete ein?
- Ja, es ist ein nicht verwalteter Prozess.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Teil eines frühen Prototypen habe ich an einem persönlichen Projekt, schrieb ich ziemlich viel code, so etwas zu tun. Es dauert nicht strings -- x86-opcodes sind Methoden, die auf eine X86Writer Klasse. Seine nicht dokumentiert, und er hat bei weitem nicht vollständige Abdeckung, aber wenn es von Interesse sein könnte, wäre ich bereit, die als open-source unter der Neuen BSD-Lizenz.
UPDATE:
Ok, habe ich erstellt, Projekt - Verwaltete.X86
Finden Sie dieses Projekt:
https://github.com/ZenLulz/MemorySharp
Dieses Projekt umschließt die FASM-assembler, das ist geschrieben in der Montage und als kompilierte Microsoft coff object, umhüllt von einer C++ - Projekt, und dann nochmal eingewickelt in C#. Dies kann genau das tun, was Sie wollen: gegeben sei ein string der x86/x64 Montage wird dadurch der bytes benötigt.
Wenn Sie benötigen, im Gegenteil, es ist eine Portierung des Udis86 disassembler, vollständig portiert von C#, hier:
https://github.com/spazzarama/SharpDisasm
Diese konvertiert ein array von bytes in den Befehl strings für x86/x64
Werfen Sie einen Blick auf Phoenix von Microsoft Research.
Kosmos hat auch einige interessante Unterstützung für das generieren von x86-code:
http://www.gocosmos.org/blog/20080428.en.aspx
Nicht direkt aus C# kann man nicht. Jedoch, Sie könnte potenziell schreiben Sie Ihre eigene wrapper-Klasse, die verwendet einen externen assembler, um code zu kompilieren. So, würden Sie möglicherweise schreiben Sie die Baugruppe aus einer Datei, verwenden Sie die .NET Framework, zu Spinnen, bis Sie einen neuen Prozess, der führt der assembler-Programm, und verwenden Sie dann System.IO öffnen Sie die generierte Datei, die durch den assembler zu ziehen aus dem byte-stream.
Jedoch, auch wenn Sie alle das tun, ich wäre sehr überrascht, wenn Sie das nicht tun, dann laufen Sie in Fragen der Sicherheit. Die Injektion ausführbare code in einem völlig anderen Prozess wird immer weniger und weniger möglich sein, mit jeder neuen OS. Mit Vista, ich glaube, Sie würde definitiv verweigert. Und auch in XP, ich denke, Sie bekommen würde ein "Zugriff verweigert" - Ausnahme beim Versuch zu schreiben in den Speicher eines anderen Prozesses.
Das wirft natürlich die Frage auf, warum Sie benötigen, um dies zu tun. Sicherlich gibt es einen besseren Weg :).
Werfen Sie einen Blick auf diese: CodeProject: die Verwendung von nicht verwaltetem code und assembly in C#.
Ich glaube, Sie würde am besten sein, schreiben einen systemeigenen Win32-dll. Sie können dann schreiben Sie eine Funktion, die in assembler, die aus der dll exportiert. Anschließend können Sie C# verwenden, um eine dynamische Verknüpfung zu der dll.
Dies ist nicht ganz das gleiche wie die übergabe eines Strings und Rückgabe als byte-array. Um dies zu tun müssten Sie ein x86-assembler-Komponente, oder ein wrapper um masm.exe.
ich weiß nicht, ob dies ist, wie es funktioniert, aber du könntest einfach shellexecute einen externen compiler lädt dann das erzeugte Objekt in dein byte-array.