Запуск нейтивного ассемблера из C# на лету
От: Shmj Ниоткуда  
Дата: 31.01.22 05:08
Оценка: 83 (7) -1 :)
Интересная, оказывается, есть возможность почти прямо из коробки.

Пример: https://github.com/WhiteBlackGoose/AsmToDelegate

С помощью https://github.com/icedland/iced из ассемблерных инструкций делается массив байт машинных инструкций — внутри C# проекта прямо. На лету. Получается просто массив двоичных данных. Потом этот массив записывается в память и с помощью такой магии:

(delegate* unmanaged[Cdecl]<TIn1, TIn2, TIn3, TOut>)s.Pointer;


— получаем делегат. Если этот делегат дернуть — то исполнятся машинные инструкции, которые вы сформировали в рантайме

P.S.
А вот из C++ x64 теперь нельзя вызвать __asm инструкцию — MS данную возможность отключила: https://rsdn.org/forum/cpp/4585123.all
Автор: SWW
Дата: 21.01.12
Отредактировано 31.01.2022 5:10 Shmj . Предыдущая версия .
Re: Запуск нейтивного ассемблера из C# на лету
От: vaa  
Дата: 31.01.22 05:55
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Интересная, оказывается, есть возможность почти прямо из коробки.

не проще написать библиотеку на c и вызвать через DllImport?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Запуск нейтивного ассемблера из C# на лету
От: Sinclair Россия https://github.com/evilguest/
Дата: 31.01.22 07:56
Оценка: +4
Здравствуйте, Shmj, Вы писали:

S>Интересная, оказывается, есть возможность почти прямо из коробки.


Не вижу ничего интересного. Природа unsafe в C#/.Net такова, что можно делать всё, что угодно, включая секс с гусями.
Вот динамическое порождение верифицируемого кода в рантайм — это интересно, потому что можно получать высокопроизводительный код, не рискуя ни стабильностью, ни безопасностью.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Запуск нейтивного ассемблера из C# на лету
От: Kolesiki  
Дата: 31.01.22 22:07
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Если этот делегат дернуть — то исполнятся машинные инструкции, которые вы сформировали в рантайме


Нда... когда программисту делать нечего, он... дёргает... делегаты
Ты зачем это всё понаписал? Ты хвалишься или спамишь? Или просто дурью маешься вместо бизнес-задач? Ну так до тебя Рихтер уже вволю намаялся — читай, вникай.
Re: Запуск нейтивного ассемблера из C# на лету
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.02.22 13:04
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Если этот делегат дернуть


Чего ни одна мало-мальски грамотно настроенная система сделать не даст.
Re[2]: Запуск нейтивного ассемблера из C# на лету
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.02.22 13:11
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Чего ни одна мало-мальски грамотно настроенная система сделать не даст.

Ну почему же в отдельном процессе, компьютере в песочнице делай что угодно
и солнце б утром не вставало, когда бы не было меня
Отредактировано 07.02.2022 12:57 VladD2 . Предыдущая версия .
Re[3]: Запуск нейтивного ассемблера из C# на лету
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 01.02.22 13:14
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>в отдельном процессе, компьютере в песочнице делай что угодно


Тогда какой в этом смысл? ТС же, типа, открыл возможность делать это везде и всегда.
Re[4]: Запуск нейтивного ассемблера из C# на лету
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.02.22 14:24
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Тогда какой в этом смысл? ТС же, типа, открыл возможность делать это везде и всегда.

Ну смысл такого рода бывает постоянно в том же C#. Деревья выражений, Microsoft.CodeAnalysis.CSharp.Scripting.CSharpScript ну и прочие динамические компиляторы.
Как тут Sinclair заметил

Вот динамическое порождение верифицируемого кода в рантайм — это интересно, потому что можно получать высокопроизводительный код, не рискуя ни стабильностью, ни безопасностью.


Да можно сгенерить код и безопасно выполнить в отдельном процессе песочнице
и солнце б утром не вставало, когда бы не было меня
Отредактировано 07.02.2022 12:57 VladD2 . Предыдущая версия .
Re[4]: Запуск нейтивного ассемблера из C# на лету
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.02.22 08:04
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Serginio1, Вы писали:


S>>в отдельном процессе, компьютере в песочнице делай что угодно


ЕМ>Тогда какой в этом смысл? ТС же, типа, открыл возможность делать это везде и всегда.

Ну если ты доверяешь этому коду или можешь его верифицировать безопасность, то проблем то нет.
Если не доверяешь, то песочница
и солнце б утром не вставало, когда бы не было меня
Re[5]: Запуск нейтивного ассемблера из C# на лету
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.02.22 09:01
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Ну если ты доверяешь этому коду или можешь его верифицировать безопасность, то проблем то нет.

S>Если не доверяешь, то песочница

Ну вот я приобрел приложение, которое генерит код для выполнения каких-либо работ. Как я могу "верифицировать безопасность" любого кода, который оно может породить?

А если этот код будет всегда выполняться в отдельном процессе-песочнице, то какие функции, сложные или невозможные для "готового" кода, он мог бы выполнять?
Re[6]: Запуск нейтивного ассемблера из C# на лету
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.02.22 09:13
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Serginio1, Вы писали:


S>>Ну если ты доверяешь этому коду или можешь его верифицировать безопасность, то проблем то нет.

S>>Если не доверяешь, то песочница

ЕМ>Ну вот я приобрел приложение, которое генерит код для выполнения каких-либо работ. Как я могу "верифицировать безопасность" любого кода, который оно может породить?


ЕМ>А если этот код будет всегда выполняться в отдельном процессе-песочнице, то какие функции, сложные или невозможные для "готового" кода, он мог бы выполнять?

Ну а как антивирусы верифицируют код? Есть инструменты которые могут помогать верифицировать. Так же можно верифицировать и Il код и нативный код.
Либо ты доверяешь источнику, либо нет
и солнце б утром не вставало, когда бы не было меня
Re[7]: Запуск нейтивного ассемблера из C# на лету
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.02.22 10:41
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>а как антивирусы верифицируют код?


По известным образцам вредоносного кода, по известным признакам его же. Здесь важно то, что однажды проверенный код не меняется со временем.

S>Либо ты доверяешь источнику, либо нет


Вот у Вас есть два варианта:

— купить у некой компании кофе-машину, поставить ее дома, и использовать самостоятельно;

— нанять у той же компании человека, который будет жить в Вашем доме и готовить Вам кофе.

Будет ли степень "доверия к источнику" одинаковой в обоих вариантах?
Re[8]: Запуск нейтивного ассемблера из C# на лету
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.02.22 11:32
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Вот у Вас есть два варианта:


ЕМ>- купить у некой компании кофе-машину, поставить ее дома, и использовать самостоятельно;


ЕМ>- нанять у той же компании человека, который будет жить в Вашем доме и готовить Вам кофе.


ЕМ>Будет ли степень "доверия к источнику" одинаковой в обоих вариантах?

Ну если ты не доверяешь источнику, то выполняй в песочнице! В чем проблема то?

Причем например в Win 10 уже есть встроенная Как включить Windows Sandbox. Встроенная песочница Windows 10

А так запускай процесс от урезанного пользователя https://winitpro.ru/index.php/2018/01/15/runas-sposoby-zapustit-programmu-ot-imeni-drugogo-polzovatelya/
и солнце б утром не вставало, когда бы не было меня
Re[9]: Запуск нейтивного ассемблера из C# на лету
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 02.02.22 11:47
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Ну если ты не доверяешь источнику, то выполняй в песочнице! В чем проблема то?


Вы намеренно тупите, или прикидываетесь? Что значит "доверяешь источнику"? Вот конкретно Вы каждому источнику либо доверяете безгранично, либо не доверяете совсем, или так есть какие-то промежуточные варианты?
Re[2]: Запуск нейтивного ассемблера из C# на лету
От: Mystic Artifact  
Дата: 02.02.22 21:57
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Чего ни одна мало-мальски грамотно настроенная система сделать не даст.

Любой CLR это делает из коробки с первых версий. Это называется indirect call. Эта возможность была всегда, это просто нельзя было описать в C# нормальным языком без переписывания IL.
Re[3]: Запуск нейтивного ассемблера из C# на лету
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.02.22 11:50
Оценка:
Здравствуйте, Mystic Artifact, Вы писали:

MA>Любой CLR это делает из коробки с первых версий. Это называется indirect call.


Значит, он либо пользуется каким-нибудь защищенным кодогенератором, порождающим заведомо безопасный код, либо не работает при включенном DEP.

У меня DEP включен по умолчанию, и явных исключений нет — значит, среди работающего у меня софта такого безобразия не имеется.
Re[4]: Запуск нейтивного ассемблера из C# на лету
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.02.22 12:19
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Значит, он либо пользуется каким-нибудь защищенным кодогенератором, порождающим заведомо безопасный код, либо не работает при включенном DEP.
Хм. Чисто академический вопрос: а что помешает моему приложению дёрнуть VirtualAlloc c PAGE_EXECUTE_READWRITE?
Сам JIT естественно делает именно это, иначе он бы не смог делать свою работу. Со стороны OS нет никакой возможности узнать, порождается ли код защищённым кодогенератором, или злонамеренным трояном.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Запуск нейтивного ассемблера из C# на лету
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.02.22 12:34
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>что помешает моему приложению дёрнуть VirtualAlloc c PAGE_EXECUTE_READWRITE?


А, пардон, это я попутал DEP с политиками запрета исполнения неподписанного кода, которые в ядре уже давно обязательны, а в user-mode — пока еще добровольны.
Re[10]: Запуск нейтивного ассемблера из C# на лету
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 03.02.22 12:59
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Serginio1, Вы писали:


S>> Ну если ты не доверяешь источнику, то выполняй в песочнице! В чем проблема то?


ЕМ>Вы намеренно тупите, или прикидываетесь? Что значит "доверяешь источнику"? Вот конкретно Вы каждому источнику либо доверяете безгранично, либо не доверяете совсем, или так есть какие-то промежуточные варианты?

Да потому, что в .Net кодогенерация в рантайме это обычное и массовое явление.
Либо ты как разработчик используешь сторонний код то ты либо ему доверяешь, либо выполняешь в песочнице. Третий вариант не используешь вовсе
и солнце б утром не вставало, когда бы не было меня
Re[6]: Запуск нейтивного ассемблера из C# на лету
От: Sinclair Россия https://github.com/evilguest/
Дата: 03.02.22 13:37
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>А, пардон, это я попутал DEP с политиками запрета исполнения неподписанного кода, которые в ядре уже давно обязательны, а в user-mode — пока еще добровольны.
Ну, пока не очень понятно, как эти политики будут совмещаться с JIT. Ну, то есть можно, наверное, построить защиту на том, что право на динамическое порождение исполняемого кода предоставляется только коду, который подписан сертификатом производителя ОС. Тогда дотнет и джава смогут выполнять JIT, а какие-нибудь опенсорсные решения — не смогут.
Но выглядит это всё довольно хрупко.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.