PDA

Просмотр полной версии : Выполнение ASM кода в C#


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.GetDelegateForFunctionPoi nter((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 делаем так:


Заходим в Свойства проекта

Выбираем вкладку "Построение"

Разрешить "Небезопасный код".