Frage

Gibt es so etwas wie ein x86-Assembler, die ich durch C # anrufen kann? Ich möchte in der Lage, die x86-Befehle als String zu übergeben und ein Byte-Array zurück. Wenn man nicht vorhanden ist, wie kann ich meine eigenen zu machen?

Um klar zu sein - ich will nicht zu Anruf Assembler-Code von C # - Ich möchte nur in der Lage sein, Code von Anweisungen zu montieren und den Maschinencode in einem Byte-Array zu erhalten. Ich werde diesen Code wird die Injektion (die on the fly erzeugt wird) zusammen in einen anderen Prozess zu injizieren.

War es hilfreich?

Lösung

Im Rahmen von einigen frühen Prototyping ich auf ein persönliches Projekt tat, schrieb ich ziemlich viel Code, so etwas zu tun. Dabei spielt es keine Strings nehmen - x86-Opcodes sind Methoden auf einer X86Writer Klasse. Sein nicht dokumentiert, und hat bei weitem nicht vollständige Abdeckung, aber wenn es von Interesse sei, wäre ich bereit, zu Quelle zu öffnen-es unter der neuen BSD-Lizenz.

UPDATE: Ok, ich habe das Projekt erstellt - Managed.X86

Andere Tipps

Sehen Sie dieses Projekt:

https://github.com/ZenLulz/MemorySharp

Dieses Projekt hüllt den FASM Assembler, die in Assembler geschrieben und als ein wie Microsoft coff Objekt kompiliert, die von einem C ++ Projekt eingewickelt, und dann wieder in C # gewickelt. Dies kann genau das tun, was Sie wollen. Bei einer Reihe von x86 / x64 Montag, wird dies das Bytes benötigt produzieren

Wenn Sie das Gegenteil erfordern, gibt es eine Portierung des Udis86 Disassembler, vollständig portiert C #, hier:

https://github.com/spazzarama/SharpDisasm

Dies wird ein Array von Bytes in den Befehlszeichenfolgen für x86 / x64

konvertieren

Hier finden Sie aktuelle Phoenix von Microsoft Research.

Cosmos hat auch einige interessante Unterstützung x86-Code zur Erzeugung von:

http://www.gocosmos.org/blog/20080428.en.aspx

Nicht direkt von C # können Sie nicht. Allerdings könnten Sie möglicherweise Ihre eigene Wrapper-Klasse schreiben, die einen externen Assembler verwendet Code zu kompilieren. Also, würden Sie möglicherweise die Assembly schreiben in eine Datei aus, verwenden Sie das .NET Framework einen neuen Prozess spin up, die das Assembler-Programm ausgeführt wird, und dann System.IO verwenden, um die erzeugte Datei vom Assembler zu öffnen, um die Byte herausziehen Strom.

Doch selbst wenn Sie alles, was zu tun, würde ich sehr überrascht, wenn Sie dann nicht in Sicherheitsfragen führen. Injizierenden ausführbaren Code in einen völlig anderen Prozess wird immer weniger möglich, mit jedem neuen O. Mit Vista, glaube ich, würden Sie auf jeden Fall verweigert bekommen. Und auch in XP, ich glaube, Sie würden einen Zugang verweigert Ausnahme beim Versuch in den Speicher eines anderen Prozesses zu schreiben.

Natürlich, das wirft die Frage auf, warum Sie benötigen, dies zu tun. Sicherlich gibt muss ein besserer Weg geben:.)

Ich glaube, Sie am besten wäre eine native Win32-DLL-off zu schreiben. Sie können dann eine Funktion in Assembler schreiben, die von der DLL exportiert wird. Anschließend können Sie C # verwenden, dynamisch auf die DLL zu verknüpfen.

Das ist nicht ganz das gleiche wie in einem String übergeben und einen Byte-Array zurück. Um dies zu tun, würden Sie eine x86-Assembler-Komponente oder einen Wrapper um MASM.EXE benötigen.

Ich weiß nicht, ob dies ist, wie es funktioniert, aber man konnte nur ein externer Compiler shellexecute dann das in Ihrem Byte-Array erzeugte Objekt geladen werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top