Вопрос

Существует ли такая вещь, как ассемблер 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:

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top