1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Скрыть объявление

Привет посетитель! У нас на форуме тебе откроются дополнительные разделы, которые скрыты от гостей! А так же ты найдёшь много полезной информации.

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

Тема в разделе "C++ / C# / .NET", создана пользователем kick, 31 мар 2017.

Метки:
  1. kick

    kick Магистр Йода Администратор

    Регистрация:
    20 янв 2015
    Сообщения:
    4.915
    Симпатии:
    3.455
    Баллы:
    6.235
    Для выполнения 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. Разрешить "Небезопасный код".
     
    webdes27 нравится это.