给C#程序加壳(C# 调用嵌入资源的EXE文件方法)

http://www.cnblogs.com/xlw1219/archive/2012/11/29/2795069.html


Posted on  2012-11-29 17:53  xlw1219 阅读( 3380) 评论( 0编辑  收藏

本来想把一个EXE程序变成我的窗口的一部分,试了很久没有成功,也不能说没有收获,这是一个对c#的EXE程序加壳的程序。

代码复制如下:

复制代码
1. 我们有一个test.exe的WinForm程序,这是我们要加壳的目标程序。
2. 新建一个WinForm工程,删除Form1,然后新建一个类。如下。
3. 将test.exe 拷贝到该工程目录,然后点项目的[刷新],再点[显示所有文件],项目里看到test.exe,右键包括在项目中,然后右属性里【生成操作】-【嵌入的资源】。
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);
        }
    }
}
复制代码

这是一个错漏百出的程序,参见参考文献4,以至于我弄了很久没有没有结果。

最后弄出来了,总结一下:

1.要加壳的一定是c#程序,我用其他类型程序试过,不可行。

2.必须是嵌入式资源,有关这个解释可以参考文献1和2.

3.我在执行“Stream stream = Assembly. GetExecutingAssembly_r(). GetManifestResourceStream_r("test.Code.exe");”的时候总是得到为null,在参考了文献3以后可以正确获取了值。

最后正确的代码应该是这样的:

复制代码
using System;
using System.Windows.Forms;
using System.Resources;
using System.Reflection;
using System.IO;

namespace MyNamespace
{
    public class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            String projectName = Assembly.GetExecutingAssembly().GetName().Name.ToString();
            Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(projectName + ".test.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();
            if ((parameters != null) && (parameters.Length > 0))
                info.Invoke(null, (object[])args);
            else
                info.Invoke(null, null);

        }
    }
}
复制代码

 

 

 

参考文献:

1.http://zch448.blog.163.com/blog/static/73706910201231902712864/

2.http://www.cnblogs.com/zhangjun1130/archive/2011/04/11/2012566.html

3.http://www.cnblogs.com/lonelyDog/archive/2012/02/16/2354407.html

4.http://www.cnblogs.com/huangcong/archive/2010/03/23/1693293.html


  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值