Подтвердить что ты не робот

Возможно ли использование ассемблера x86 через .NET?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Смотрите этот проект:

https://github.com/ZenLulz/MemorySharp

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

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

https://github.com/spazzarama/SharpDisasm

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

Ответ 3

Взгляните на Phoenix из Microsoft Research.

Ответ 4

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

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

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

Ответ 7

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

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

Ответ 8

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