ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Выполнение ASM кода в C# (https://forum.antichat.xyz/showthread.php?t=768250)

kick 31.03.2017 22:47

Для выполнения 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. Разрешить "Небезопасный код".


Время: 14:06