Создать метод из байтового массива [duplicate]

1

У меня есть byte[] который содержит байты, представляющие метод в сборке. Например, простая функция mov eax,1 - retn:

var method = new byte[] { 0xB8,0x01,0x00,0x00,0x00,0xC3 };

Возможно ли создать во время выполнения метод, который я могу вызвать на С#, используя массив байтов, чтобы создать его?

  • 0
    Вы можете pInvoke VirtualAlloc, чтобы выделить указатель на ваш байтовый массив, а затем использовать Marshal.Copy, чтобы скопировать его в память выделения из VirtualAlloc. Затем используйте Marshal.GetDelegateForFunctionPointer, чтобы получить делегата в код asm. Затем вы можете вызвать делегата. stackoverflow.com/questions/959087/...
  • 0
    Вам не нужно конвертировать ASM в IL. .Net - это управляемый язык, но если он запущен, единственное различие между ним и нативным процессом состоит в том, что у него загружена платформа .net. .Net JIT компилирует IL в X86 во время выполнения, когда все готово, все x86 работают на процессоре и не работают как IL. Это означает, что во время выполнения вы можете просто запустить делегат asm в байтовом массиве. Фактически, вы можете внедрить .Net framework в собственный процесс, а затем загрузить в него .Net dll, используя .Net C ++ CLR заголовки.
Показать ещё 5 комментариев
Теги:
assembly

1 ответ

0
Лучший ответ

Да, вы можете сделать это, используя Reflection Emit. Но вы должны написать логику, которая будет читать этот байтовый массив byte by byte и Emmit OpCodes, который вам нужен в ILGenerator.

Это очень просто. Сначала вы создаете новый DynamicMethod, вызываете из него GetILGenerator, делаете серию вызовов "Emmit" из GetILGenerator, вызываете CreateDelegate из DynamicMethod и, наконец, вызываете новый метод, вызывая этот делегат.

  • 0
    Можете ли вы дать мне пример кода о том, как это сделать? Я должен изменить код asm на код IL, это правильно? Я понятия не имею, как это сделать, вы можете дать больше информации? Функция, которую я хочу сделать, намного сложнее, чем простой return true; , в этом случае.
  • 0
    Сначала вы можете описать, что это за байтовый массив? Почему вы хотите хранить некоторую логику в виде байтового массива? Этот поток этих байтов в настоящее время действительно не имеет спецификаций или это что-то сложное, например, байты из приложения x86?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню