Возможен ли ассемблер x86 через .NET?
-
02-07-2019 - |
Вопрос
Существует ли такая вещь, как ассемблер x86, который я могу вызвать через C #?Я хочу иметь возможность передавать инструкции x86 в виде строки и получать обратно массив байтов.Если такового не существует, как я могу создать свой собственный?
Чтобы внести ясность - я не хочу звонить ассемблерный код из C # - я просто хочу иметь возможность собирать код из инструкций и получать машинный код в виде массива байтов.Я буду внедрять этот код (который будет сгенерирован "на лету"), чтобы полностью внедрить в другой процесс.
Решение
В рамках одного из ранних прототипов, которые я делал в личном проекте, я написал довольно много кода, чтобы сделать что-то подобное.Он не принимает строки - коды операций x86 - это методы класса X86Writer.Это вообще не задокументировано и не имеет почти полного охвата, но если это будет представлять интерес, я был бы готов использовать его с открытым исходным кодом под Новой лицензией BSD.
Обновить: Хорошо, я создал этот проект -- Управляемый.X86
Другие советы
Посмотрите этот проект:
https://github.com/ZenLulz/MemorySharp
Этот проект оборачивает ассемблер FASM, который написан на ассемблере и скомпилирован как объект Microsoft coff, обернутый проектом C ++, а затем снова завернутый в C #.Это может сделать именно то, что вы хотите:учитывая строку сборки x86 / x64, это приведет к получению необходимых байтов.
Если вам требуется обратное, здесь есть порт дизассемблера Udis86, полностью портированный на C #:
https://github.com/spazzarama/SharpDisasm
Это преобразует массив байтов в строки инструкций для x86 / x64
Взгляните на Феникс из Microsoft Research.
Cosmos также имеет некоторую интересную поддержку для генерации кода x86:
Не напрямую из C # вы этого сделать не можете.Однако потенциально вы могли бы написать свой собственный класс-оболочку, который использует внешний ассемблер для компиляции кода.Таким образом, потенциально вы могли бы записать сборку в файл, использовать .NET Framework для запуска нового процесса, который выполняет программу на ассемблере, а затем использовать System .Ввод-вывод для открытия сгенерированного ассемблером файла, чтобы извлечь поток байтов.
Однако, даже если вы сделаете все это, я был бы очень удивлен, если бы затем вы не столкнулись с проблемами безопасности.Внедрение исполняемого кода в совершенно другой процесс становится все менее и менее возможным с каждой новой операционной системой.Я верю, что с Vista вам определенно откажут.И даже в XP, я думаю, вы получили бы исключение "отказано в доступе" при попытке записи в память другого процесса.
Конечно, это поднимает вопрос о том, зачем вам нужно это делать.Конечно, должен быть способ получше :).
Взгляните на это: Кодпроект:Использование неуправляемого кода и сборки на C#.
Я думаю, вам было бы лучше всего написать собственную библиотеку DLL Win32.Затем вы можете написать функцию на ассемблере, которая экспортируется из библиотеки dll.Затем вы можете использовать C # для динамической ссылки на библиотеку dll.
Это не совсем то же самое, что передавать строку и возвращать массив байтов.Для этого вам понадобится компонент на ассемблере x86 или оболочка вокруг masm.exe.
я не знаю, так ли это работает, но вы могли бы просто запустить внешний компилятор, а затем загрузить объект, сгенерированный в вашем байтовом массиве.