Я работаю над применением SFX/Protector в C#, и я хочу, чтобы защищенная сборка выполнялась из байтового массива вместо того, чтобы записывать ее на жесткий диск, чтобы быть намного сложнее для обратного проектирования.Запуск программы из массива байтов с помощью VirtualAlloc?
У меня есть программа в массиве байтов (у которой есть допустимая точка входа), и я хочу ее выполнить. Я нашел аналогичный вопрос на этом веб-сайте о том, как я могу это сделать, я знаю, что это можно сделать, используя нижеприведенный фрагмент кода, но может ли кто-нибудь помочь мне узнать, как я могу запустить программу из массива байтов, используя это?
технически он ниже код позволил мне сделать это:
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace DynamicX86
{
class Program
{
const uint PAGE_EXECUTE_READWRITE = 0x40;
const uint MEM_COMMIT = 0x1000;
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
private delegate int IntReturner();
static void Main(string[] args)
{
List<byte> bodyBuilder = new List<byte>();
bodyBuilder.Add(0xb8);
bodyBuilder.AddRange(BitConverter.GetBytes(42));
bodyBuilder.Add(0xc3);
byte[] body = bodyBuilder.ToArray();
IntPtr buf = VirtualAlloc(IntPtr.Zero, (uint)body.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
Marshal.Copy(body, 0, buf, body.Length);
IntReturner ptr = (IntReturner)Marshal.GetDelegateForFunctionPointer(buf, typeof(IntReturner));
Console.WriteLine(ptr());
}
}
}
Как я могу реализовать этот ответ, чтобы запустить программу из массива байтов. Я не могу точно понять, что я могу сделать с этим кодом. Пожалуйста, помогите
Это ссылка, где я нашел этот ответ: Is it possible to execute an x86 assembly sequence from within C#?
Anyhelp будет высоко оценен.
Этот код, очевидно, совершенно бесполезен для запуска * реальных программ. Вам нужно узнать о формате файла PE32 и реализовать собственный загрузчик, который выполняет ту же работу, что и загрузчик Windows. Это очень * сложно сделать, если код имеет какие-либо зависимости. Если это фактически управляемая сборка, просто используйте Assembly.Load (byte []). –