Возможен ли ассемблер x86 через .NET? - PullRequest
17 голосов
/ 26 сентября 2008

Есть ли такая штука как ассемблер x86, которую я могу вызывать через C #? Я хочу быть в состоянии передать инструкции x86 в виде строки и получить обратно байтовый массив. Если кто-то не существует, как я могу сделать свой собственный?

Для ясности - я не хочу вызывать код сборки из C # - я просто хочу иметь возможность собирать код из инструкций и получать машинный код в байтовом массиве. Я вставлю этот код (который будет сгенерирован на лету), чтобы внедрить его в другой процесс.

Ответы [ 8 ]

14 голосов
/ 26 сентября 2008

Как часть раннего прототипирования, которое я сделал для личного проекта, я написал довольно много кода, чтобы сделать что-то подобное. Он не принимает строки - коды операций x86 являются методами класса X86Writer. Он вообще не документирован и не имеет полного охвата, но если это будет интересно, я буду готов открыть его под новой лицензией BSD.

UPDATE: Хорошо, я создал этот проект - Managed.X86

4 голосов
/ 31 октября 2016

Посмотреть этот проект:

https://github.com/ZenLulz/MemorySharp

Этот проект обертывает ассемблер FASM, который написан на ассемблере и скомпилирован как объект coff Microsoft, обернут в проект C ++, а затем снова обернут в C #. Это может делать именно то, что вы хотите: учитывая строку сборки x86 / x64, это даст необходимые байты.

Если вам требуется обратное, есть порт дизассемблера Udis86, полностью перенесенный на C #, здесь:

https://github.com/spazzarama/SharpDisasm

Это преобразует массив байтов в строки инструкций для x86 / x64

2 голосов
/ 16 ноября 2008

Взгляните на Феникс от Microsoft Research.

1 голос
/ 30 сентября 2008

Cosmos также имеет интересную поддержку для генерации кода x86:

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

1 голос
/ 26 сентября 2008

Не прямо из C # вы не можете. Однако вы можете написать свой собственный класс-обертку, который использует внешний ассемблер для компиляции кода. Таким образом, вы потенциально могли бы записать сборку в файл, использовать .NET Framework, чтобы ускорить новый процесс, который выполняет программу на ассемблере, а затем использовать System.IO, чтобы открыть сгенерированный файл созданным файлом для извлечения байта поток.

Однако, даже если вы сделаете все это, я был бы очень удивлен, если бы вы не столкнулись с проблемами безопасности. Внедрение исполняемого кода в совершенно другой процесс становится все менее и менее возможным с каждой новой ОС. Я думаю, что с Vista вам наверняка отказали. И даже в XP, я думаю, вы получите исключение при доступе при попытке записи в память другого процесса.

Конечно, это поднимает вопрос о том, зачем вам это нужно. Конечно, должен быть лучший способ:).

0 голосов
/ 30 сентября 2008

Я не знаю, так ли это, но вы можете просто выполнить внешний компилятор и загрузить объект, сгенерированный в вашем байтовом массиве.

0 голосов
/ 29 сентября 2008

Я думаю, что вам лучше написать нативный Win32 dll. Затем вы можете написать функцию на ассемблере, которая экспортируется из DLL. Затем вы можете использовать C # для динамической ссылки на DLL.

Это не совсем то же самое, что передать строку и вернуть байтовый массив. Для этого вам понадобится ассемблерный компонент x86 или оболочка для masm.exe.

0 голосов
/ 26 сентября 2008
...