将C#程序嵌入资源中(C# 调用嵌入资源的EXE文件方法)
1. 我们有一个test.exe的WinForm程序,这是我们要加壳的目标程序。
2. 新建一个WinForm工程,删除Form1,然后新建一个类。如下。
3. 将test.exe 拷贝到该工程目录,作为嵌入式资源。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Windows.Forms;
using System.Resources;
using System.Reflection;
using System.IO;
namespace test
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
Stream stream = Assembly. GetExecutingAssembly_r(). GetManifestResourceStream_r("test.Code.exe");
byte[] bs = new byte[stream.Length];
stream.Read(bs, 0, (int)stream.Length);
Assembly asm = Assembly.Load(bs);
MethodInfo info = asm.EntryPoint;
ParameterInfo[] parameters = info. GetParameters_r();
if ((parameters != null) && (parameters.Length > 0))
info.Invoke(null, (object[])args);
else
info.Invoke(null, null);
}
}
}
using System.Windows.Forms;
using System.Resources;
using System.Reflection;
using System.IO;
namespace test
{
static class Program
{
[STAThread]
static void Main(string[] args)
{
Stream stream = Assembly. GetExecutingAssembly_r(). GetManifestResourceStream_r("test.Code.exe");
byte[] bs = new byte[stream.Length];
stream.Read(bs, 0, (int)stream.Length);
Assembly asm = Assembly.Load(bs);
MethodInfo info = asm.EntryPoint;
ParameterInfo[] parameters = info. GetParameters_r();
if ((parameters != null) && (parameters.Length > 0))
info.Invoke(null, (object[])args);
else
info.Invoke(null, null);
}
}
}
编译后的程序会自动将资源中的目标文件加载运行。继续发挥一下,我们可以增加启动密码;将目标程序进
---------------------------------------------------------------------------------------------------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Stream streamObj = this. GetType_r().Assembly. GetManifestResourceStream_r("Test_ExeInResource.AllTest.exe");
byte[] b = new byte[streamObj.Length];
streamObj.Read(b, 0, b.Length);
Assembly a = Assembly.Load(b);
Type[] mytypes = a. GetTypes_r();
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public |
BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach(Type t in mytypes)
{
MethodInfo[] mi = t. GetMethods_r(flags);
Object obj = Activator.CreateInstance(t);
foreach(MethodInfo m in mi)
{
if (m.Name == "Main")
{
MainDelegate md = (MainDelegate)Delegate.CreateDelegate(typeof(MainDelegate), m);
md.BeginInvoke(null, null);
}
}
}
byte[] b = new byte[streamObj.Length];
streamObj.Read(b, 0, b.Length);
Assembly a = Assembly.Load(b);
Type[] mytypes = a. GetTypes_r();
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public |
BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach(Type t in mytypes)
{
MethodInfo[] mi = t. GetMethods_r(flags);
Object obj = Activator.CreateInstance(t);
foreach(MethodInfo m in mi)
{
if (m.Name == "Main")
{
MainDelegate md = (MainDelegate)Delegate.CreateDelegate(typeof(MainDelegate), m);
md.BeginInvoke(null, null);
}
}
}