Выполнение ASM кода в C#

kick

Предвестник
Administrator
За веру и верность форуму
Отец-основатель
Сообщения
7 027
Розыгрыши
21
Решения
1
Репутация
5 860
Реакции
6 523
Баллы
2 688
Для выполнения ASM кода в C# необходимо:
Добавляем вызов InteropServices:
Код:
using System.Runtime.InteropServices;
Дальше добавляем следующий код:
Код:
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool VirtualProtect(IntPtr lpAddress, uint dwSize,
           uint flNewProtect, out uint lpflOldProtect);

        [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        private delegate int AsmCodeExecutor();

        private unsafe int Asm_Execute(byte[] Code)
        {
            byte* CodePointer;
            fixed (byte* p = &Code[0])
                CodePointer = p;
            uint OldProtect;
            VirtualProtect((IntPtr)CodePointer, (uint)Code.Length, (uint)0x40, out OldProtect);
            AsmCodeExecutor ExecuteAsmCode = (AsmCodeExecutor)Marshal.GetDelegateForFunctionPointer((IntPtr)CodePointer, typeof(AsmCodeExecutor));
            int AsmCodeResult = ExecuteAsmCode();
            return AsmCodeResult;
        }
Пример вызова:
Код:
byte[] ByteCode = { 0xE8, 0x00, 0x00, 0x00, 0x00, 0x58, 0x83, 0xE8, 0x05, 0xC3 };
            int Rez = Asm_Execute(ByteCode);

В переменной Rez будет конечно значение регистра eax. Конкретно в данном примере, выполнялся код,вычисляющий свое местоположение в памяти:
Код:
 call @@Next
 @@Next:
  pop eax
  sub eax,5
  ret

У кого будет выдавать ошибку связанную с /unsafe делаем так:
  1. Заходим в Свойства проекта
  2. Выбираем вкладку "Построение"
  3. Разрешить "Небезопасный код".
 

Назад
Сверху Снизу