反编译 .NETZ 压缩过的exe程序

转载 2012年03月24日 00:37:43
在网上下载了一个程序,觉得程序功能不错,看程序界面像是用.NET写的(用PEiD查看了,检测结果是Microsoft Visual C# / Basic .NET),于是想用 .NET Reflector反编译看一下代码,如下图:

结果发现这个程序使用.NETZ 压缩过了,整个程序用 .NET Reflector反编译后就只得到了NetzStarter.cs文件和一个资源文件app.resx。
  打开NetzStarter.cs文件,可以看出这是一个引导程序,实现了动态的加载和卸载dll文件及程序资源,我们来看Main函数:

 [STAThread]
        public static int Main(string[] args)
        {
            try
            {
                InitXR();
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(NetzStarter.NetzResolveEventHandler);
                return StartApp(args);
            }
            catch (Exception exception)
            {
                string str = " .NET Runtime: ";
                Log(string.Concat(new object[] { "#Error: ", exception.GetType().ToString(), Environment.NewLine, exception.Message, Environment.NewLine, exception.StackTrace, Environment.NewLine, exception.InnerException, Environment.NewLine, "Using", str, Environment.Version.ToString(), Environment.NewLine, "Created with", str, "2.0.50727.4927" }));
                return -1;
            }
        }
Main函数调用了StartApp(args)函数:
public static int StartApp(string[] args)
        {
            byte[] resource = GetResource("A6C24BF5-3690-4982-887E-11E1B159B249");
            if (resource == null)
            {
                throw new Exception("application data cannot be found");
            }
            int num = InvokeApp(GetAssembly(resource), args);
            resource = null;
            return num;
        }

可以看出,程序动态的获取了一个名为“A6C24BF5-3690-4982-887E-11E1B159B249” 的文件。

再看调用的GetResource()函数片段:
            byte[] buffer = null;
            if (rm == null)
            {
                rm = new ResourceManager("app", Assembly.GetExecutingAssembly());
            }

它获取了一个名为app的资源文件,这正是我们在.NET Reflector中看到的 app.resources,我们再用.NET Reflector查看其内容,发现其中包含一个zip.dll和一个GUID号为 A6C24BF5-3690-4982-887E-11E1B159B249 的文件。


这个GUID号为 A6C24BF5-3690-4982-887E-11E1B159B249 的文件 正是原始exe文件压缩后的二进制文件!
  我们将这个文件解压缩成二进制exe文件就达到目的了,怎么解压缩呢?我们来看看压缩过的程序是怎样执行的。

StartApp()函数中引用了一个GetAssembly()函数,它的功能是将二进制比特流转换成程序集:

private static Assembly GetAssembly(byte[] data)
        {
            MemoryStream stream = null;
            Assembly assembly = null;
            try
            {
                stream = UnZip(data);
                stream.Seek(0L, SeekOrigin.Begin);
                assembly = Assembly.Load(stream.ToArray());
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                stream = null;
            }
            return assembly;
        }

函数引用了一个UnZip()函数,这正是我们正要找的解压缩函数!
  下面的代码将完成 从GUID号为 A6C24BF5-3690-4982-887E-11E1B159B249 的文件到原始 exe文件的解压缩:

string file = "A6C24BF5-3690-4982-887E-11E1B159B249";
            byte[] b = File.ReadAllBytes(file);
            file += ".exe";
            using (MemoryStream ms = UnZip(b))
            {
                byte[] outBytes = ms.GetBuffer();
                File.WriteAllBytes(file, outBytes);
            }

为了方便操作,我写了一个GUI界面的程序 Cracking .NETZ (下载链接在文章结尾)来实现上述解压缩功能。要得到这个GUID号为 A6C24BF5-3690-4982-887E-11E1B159B249 的文件,只需在.NET Reflector中 Save As 就可以了。文章结尾有测试用的文件下载。


.NETZ是一个开源的支持.NET程序压缩的工具,它也可以将一个EXE和多个DLL合并在一起执行,主要是为了减小程序的体积和加快程序的加载速度,可以起到一定的混淆代码效果。
  我们来看一个使用.NETZ 压缩的例子(关于.NETZ的使用方法可以参看官方的文档和帮助):


我们可以看到,源程序从 2375KB减小到了476KB,压缩了80%!但并不是所有的程序都能达到这么高的压缩率的。
  它的官网是 http://madebits.com/ 当前最新的是net2.0编译的,不知道是否支持3.0以上的net程序压缩,大家可以尝试一下。



下载 .NETZ 

下载 Cracking .NETZ

下载 A6C24BF5-3690-4982-887E-11E1B159B249

下载 NetzStarter.cs


原创链接地址:http://www.cnblogs.com/moneyriver2006/archive/2010/02/22/1670826.html


将exe4j打包的java exe程序反编译过程

开始,我用了http://blog.csdn.net/lanximu/article/details/16879545的方法,但十六进制文件看着有乱码,试着截了几次进行压缩,但都不对,不管是用ultr...
  • lanximu
  • lanximu
  • 2013年11月25日 23:09
  • 7887

反编译 wince 的.net程序

偶尔会遇到需要反编译.net软件的情况,有时是看对方的实现逻辑,有时纯粹是其它不合法的目的了。我一般如下操作: 1. 在.Net Relflector7.0以上的版本中,查看exe或者dll, 在看源...
  • liangzhonglin
  • liangzhonglin
  • 2016年12月04日 10:29
  • 739

常用EXE文件反编译工具

PE Explorer V1.99 R5 绿色汉化特别版_强大的可视化汉化集成工具     功能极为强大的可视化汉化集成工具,可直接浏览、修改软件资源,包括菜单、对话框、字符串表等; 另外,还具...
  • qiu_11
  • qiu_11
  • 2013年12月28日 11:30
  • 13435

那些年干过的事(五)—无源码程序反编译修改文字

背景: 一同事提到某客户要求修改产品程序中的一段文字,正常情况下这是很简单的事情,不需要我这业余人员参与,但问题在于该客户使用的是旧版本产品,而旧版本产品的代码已遗失,这种情况下修改文字就成了一...
  • jmfang
  • jmfang
  • 2013年11月07日 13:08
  • 1110

反编译工具Reflector下载(集成FileGenerator和FileDisassembler)

Reflector是一款比较强大的反编译工具,相信很多朋友都用过它,但reflector本身有很多局限性,比如只能一个一个的查看方法等,但幸好reflector支持插件功能目前网上有很多reflect...
  • xiaolei05
  • xiaolei05
  • 2011年05月05日 19:35
  • 1195

使用Dotfuscator加密混淆程序以及如何脱壳反编译

混淆演示 首先介绍如何使用Dotfuscator对.net程序加密码混淆/加壳 C#或vb.net编写的应用程序或DLL。 这里随便创建了一个C#的命令行控制台程序。程序很简单,对当前的时间进...
  • qwsf01115
  • qwsf01115
  • 2017年05月08日 17:13
  • 1626

exe4j生成的exe反编译成java代码

很早以前写了一个java串口小程序,现在只有exe4j打包后的源程序了,最近又要用,折腾了一下发现其实要找回来也很简单,虽然不知道具体的原理是什么,这里记录一下,以免以后忘记。 exe4j只是将ja...
  • qasxcvgh
  • qasxcvgh
  • 2017年02月20日 21:10
  • 2552

.net dll或者exe避免被反编译的方法

1. 使用商业版混淆器软件 2. 核心代码用C++封装dll,提供给.net 调用
  • qq_20161893
  • qq_20161893
  • 2018年01月06日 13:26
  • 131

反编译Delphi(完整版)

第一节   关于反向工程(About Reverse Engineering)       反编译?反向?解密?(Decompilation? Reverse? Cracking?)   ...
  • gg175234768
  • gg175234768
  • 2013年05月04日 12:41
  • 6414

强大的.net反编译工具

前言:    前段时间需要个年月和时间选择的控件,自己写麻烦,js非我所长,于是上google,功夫不负有心人,找来找去找到个蛮不错的,但是要付费,好奇心起,就把它剖开来看了下,体验了一下反汇编工具的...
  • coldljy
  • coldljy
  • 2006年04月25日 10:58
  • 7722
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:反编译 .NETZ 压缩过的exe程序
举报原因:
原因补充:

(最多只允许输入30个字)