反编译 .NETZ 压缩过的exe程序
2012-03-24 00:37
267 查看
在网上下载了一个程序,觉得程序功能不错,看程序界面像是用.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
相关文章推荐
- 反编译 .NETZ 压缩过的exe程序
- Asp.net 程序优化js,css合并与压缩
- Asp.net中执行.EXE程序的方法
- net程序调用cmd.exe 运行程序
- Asp.Net 之 通过调用 WScript.Shell 启动本地 exe 程序时产生“ automation服务器不能创建对象 ”的错误
- Asp.net程序优化js、css实现合并与压缩的方法
- 使用Reflector反编译.NET程序的经验
- 使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一
- 使用Reflactor反编译.Net程序
- Android反编译与Java调用windows中的bat、exe程序
- 使用VS进行打包程序解决生成两个文件的问题(压缩后只有一个exe)
- Asp.net 程序优化js,css合并与压缩
- asp.net网站打包(包含数据库建库脚本 oracle) 成安装程序 exe 或msi
- 总结java程序打包jar包再转成exe 然后把jre环境一起压缩成setup.exe程序
- 20080811 - 使用Reflactor反编译.Net程序的经验
- .NET 调用外部exe程序,出现已停止工作
- 使用Reflactor反编译.Net程序
- 使用net.exe和sc.exe实用程序启动停止Windows服务
- 使用Reflactor反编译.Net程序的经验
- 手动创建COM到asp.net程序中(使用Tlbimp.exe工具)