2012-04-30 2 views
4

Я работаю над применением 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 будет высоко оценен.

+0

Этот код, очевидно, совершенно бесполезен для запуска * реальных программ. Вам нужно узнать о формате файла PE32 и реализовать собственный загрузчик, который выполняет ту же работу, что и загрузчик Windows. Это очень * сложно сделать, если код имеет какие-либо зависимости. Если это фактически управляемая сборка, просто используйте Assembly.Load (byte []). –

ответ

3

Какова действительная точка входа и что это за подпись? Как вы получаете эти байты? Вы генерируете ИЛ? Если вы это сделаете, возможно, было бы проще просто сделать this.

Что делает вышеприведенный код, это выделить неуправляемую память, заполнить ее инструкциями x86, а затем .NET создать делегат из этого «указателя функций» и выполнить его - это отличается от того, что вы хотите.

Смежные вопросы