我正在使用C#中的应用程序SFX / Protector,我希望受保护的程序集从字节数组执行,而不是将其写入硬盘,以便更加难以进行逆向工程。
我在一个字节数组中有一个程序(有一个有效的入口点),我想执行它。 我在这个网站上发现了一个类似的问题,我怎么能这样做,我知道这可以使用下面的代码片段完成,但有人可以指导我如何使用这个从字节数组运行程序?
从技术上讲,他下面的代码让我这样做:
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 :(得分:3)
什么是有效的切入点以及它的签名是什么?你如何从这些字节中获取?你生成IL吗?如果你这样做,或许简单地做this可能更容易。
上面的代码试图做的是分配非托管内存,用x86指令填充它,然后让.NET从这个“函数指针”创建一个委托并执行它 - 这与你想要的不同。