Возможно ли использование ассемблера x86 через .NET?
Есть ли такая вещь, как ассемблер x86, который я могу вызвать через С#? Я хочу иметь возможность передавать инструкции x86 в виде строки и возвращать массив байтов. Если этого не существует, как я могу сделать свой собственный?
Чтобы быть ясным - я не хочу вызывать код сборки из С# - я просто хочу, чтобы иметь возможность собирать код из инструкций и получать машинный код в байтовом массиве. Я буду вводить этот код (который будет генерироваться "на лету" ) для инъекции в другой процесс.
Ответы
Ответ 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, я думаю, вы получите исключение, запрещенное доступом, когда пытаетесь записать в память другого процесса.
Конечно, это ставит вопрос о том, зачем вам это нужно. Конечно, должен быть лучший способ:).
Ответ 5
Cosmos также имеет некоторую интересную поддержку для генерации кода x86:
http://www.gocosmos.org/blog/20080428.en.aspx
Ответ 6
Взгляните на это: CodeProject: использование неуправляемого кода и сборки в С#.
Ответ 7
Я думаю, вам будет лучше написать родную DLL Win32. Затем вы можете написать функцию в ассемблере, который экспортируется из dll. Затем вы можете использовать С# для динамической связи с dll.
Это не совсем то же самое, что передавать строку и возвращать массив байтов. Для этого вам понадобится компонент ассемблера x86 или оболочка masm.exe.
Ответ 8
Я не знаю, так ли это, но вы можете просто отключить внешний компилятор, а затем загрузить объект, сгенерированный в вашем массиве байтов.