星期天闲着没事玩游戏,玩游戏不能无外挂。于是百度了半天,找到了一个,看介绍貌似不错,就下载了下来。一看,竟然是用.net写的,下意识地Reflector了一下。发现竟是一个叫actmp的程序集。如图:

     随便点开看了看,没发现什么和外挂有关的东西。奇怪,于是又百度了一下"actmp.dll",发现了这篇文章http://blog.csdn.net/yizhiduxiu11/archive/2008/12/23/3589396.aspx,其中说"经Sixxpack加壳后,用Reflector打开exe文件,哈哈,看到的永远都只是一个actmp.dll的信息,其中包含4个7zip命名空间和1个Sixxpack命名空间,反编出来这些东西对也没啥处......"。      基本明白咋回事了。我又用“Sixxpack”做关键字搜了一下,果然找到了一堆这个软件的信息,其中说"Sixxpack 是一个 .net EXE 文件压缩工具。经 Sixxpack 压缩过的文件,运行时与压缩前相比没有任何区别,压缩比最大可达80%。压缩后的文件更难被反编译,保护您的程序不被破解......"
     感慨搜索引擎强大的同时,我们可以确定,这个程序100%是用Sixxpack处理过了。目的可能是为了减少体积,更可能是为了防止俺这样随便Reflector的人。如果用其他工具压缩也还罢了,但是Sixxpack貌似也是.net写的,而且没有混淆过,不看一看他的代码多对不起自己.net程序员的光荣称号啊。为了查看方便,我用File Disassembler插件把源码导了出来,找到了Main方法所在的类。核心的东西在Main方法里,很简单,我加上了注释。代码如下:
namespace Sixxpack
{
    using System;
    using System.IO;
    using System.Reflection;
    using System.Windows.Forms;     internal class stub
    {
        internal static int orig = 0x8000;//加密程序集的偏移量         [STAThread]
        private static void Main(string[] args)
        {
            try
            {
                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(stub.myResolveEventHandler);//程序集解析失败的后路
            }
            catch (Exception)
            {
            }
            object[] parameters = new object[] { args };//参数,如果有,就传给解压出来的程序集
            MemoryStream inStream = new MemoryStream();//构造一个内存流
            Stream stream2 = new FileStream(Application.ExecutablePath.Substring(Application.ExecutablePath.LastIndexOf('//') + 1), FileMode.Open, FileAccess.Read);//打开一个文件流,指向正在运行的这个文件
            stream2.Position = orig;//当前流的位置设置为加密程序集的偏移量
            byte[] buffer = new byte[stream2.Length - orig];//一个缓冲字节数组,长度为加密程序集的长度,用来存储加密程序集
            stream2.Read(buffer, 0, Convert.ToInt32(buffer.Length));//把加密程序集读取到缓冲数组里
            inStream.Write(buffer, 0, buffer.Length);//把加密程序集从缓冲数组里写到内存流里
            inStream.Seek(0L, SeekOrigin.Begin);//把当前流的位置放到开始处
            Compressor compressor = new Compressor();
            Assembly assembly = Assembly.Load(compressor.Decompress(inStream));//把内存流中的数据解压出来,并加载到一个程序集
            try
            {
                assembly.EntryPoint.Invoke(null, parameters);//执行这个程序集的入口方法,并传给参数
            }
            catch
            {
                assembly.EntryPoint.Invoke(null, null);//没有参数的话就不传
            }         }         private static Assembly myResolveEventHandler(object sender, ResolveEventArgs args)
        {
            string path = args.Name.ToString().Trim().Split(new char[] { ',' })[0].ToString().Trim();
            if (path.IndexOf(".") >= 0)
            {
                path = path.Replace(".", "_") + ".dll";
            }
            else
            {
                path = "_" + path + ".dll";
            }
            MemoryStream inStream = new MemoryStream();
            Stream stream2 = new FileStream(path, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[stream2.Length];
            stream2.Read(buffer, 0, Convert.ToInt32(buffer.Length));
            inStream.Write(buffer, 0, buffer.Length);
            inStream.Seek(0L, SeekOrigin.Begin);
            Compressor compressor = new Compressor();
            return Assembly.Load(compressor.Decompress(inStream));
        }
    }
}
    从以上代码,我们可以猜测,Sixxpack把压缩过的程序集和Sixxpack的解压程序(也就是壳)放在了一个文件里。运行程序时,Sixxpack的解压程序先运行,然后执行以下步骤:
   1.构造一个内存流。
   2.取出压缩后的程序集二进制数据,放进内存流。所谓压缩后的程序集二进制数据,也就是这个文件的第0x8000(即程序里定义的orig字段)到最后一个字节的数据。至于为啥是从0x8000开始,我想0x8000应该是壳的长度吧,壳的数据占据了从0到0x8000字节的空间,剩下的应该就是压缩后的程序集的数据了。
   3.用Compressor类的Decompress方法解压内存流数据,得到原始程序集。
   4.用反射加载原始程序集,找到程序集的入口方法,并执行这个入口方法(这时Sixxpack已完成任务,控制权已转交给解压出来的程序集),如果入口方法需要参数的话,会把Main方法的参数传给入口方法。
 
      既然明白了解压的方法,那么想拿到原始的程序集也不是什么难事了。只要知道压缩后的程序集在文件中的偏移量(我猜测应该都是0x8000,不过没看过其他例子,不敢确定),就可以把它取出来,然后用Compressor类的Decompress方法解压即可得到原始程序集,最后输出到一个文件就行了。
 
      代码很好写,大部分照抄Main方法就行了,至于Decompress方法,不用管它具体怎么实现的,反射过来直接使用即可。下面是主要代码,我直接写在界面里了,懒得再独立写一个方法:

private void btnDecompress_Click(object sender, EventArgs e)

        {
            try
            {
                Assembly assembly = Assembly.LoadFile(txtAssemblyPath.Text);//加载指定程序集
                if (assembly != null)
                {
                    if (assembly.FullName.Contains("actmp,"))//看看是不是Sixxpack压缩过的程序集
                    {
                        Type compressorClass = assembly.GetType("Sixxpack.Compressor");//得到Compressor方法的类型
                        MethodInfo DecompressInfo = compressorClass.GetMethod("Decompress");//Decompress方法,供后面使用
                        int orig = Convert.ToInt32(assembly.GetType("Sixxpack.stub").GetField("orig", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null));//压缩后的程序集的偏移量,我虽然强烈怀疑就是0x8000,为了保险起见,还是反射出来吧。                         #region 这段照抄Main方法的内容
                        MemoryStream inStream = new MemoryStream();
                        Stream stream2 = assembly.GetFiles()[0];//这么写就可以了
                        stream2.Position = orig;
                        byte[] buffer = new byte[stream2.Length - orig];
                        stream2.Read(buffer, 0, Convert.ToInt32(buffer.Length));
                        inStream.Write(buffer, 0, buffer.Length);
                        inStream.Seek(0L, SeekOrigin.Begin);
                        #endregion                         byte[] data = (byte[])DecompressInfo.Invoke(Activator.CreateInstance(compressorClass), new object[] { inStream });//调用Decompress方法,获得原始程序集的数据
                        if (sfdAssembly.ShowDialog() == DialogResult.OK)
                        {
                            sfdAssembly.OpenFile().Write(data, 0, data.Length);//把数据保存到指定文件,OK,完工!
                        }
                        MessageBox.Show("文件解压成功!", "恭喜", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    else
                    {
                        MessageBox.Show("未找到正确的程序集!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                    }
                }
                else
                {
                    MessageBox.Show("该文件没有程序集!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Hand);
            }
            

}

   下面是这个小程序的完整的代码,需要的童鞋可以下载参考一下。点击下载
 
    由此可见,如果仅仅想减小一下你的程序的体积,Sixxpack应该是个不错的工具,但是指望用它保护自己的代码,显然只能失望了。稍微懂点.net的,只要愿意花点时间琢磨,都能拿到你的原始程序。所以想保护自己代码,还是使用那些专业的加密混淆工具吧。不过感觉Sixxpack的思路确实很不错,有时间一定要好好看一下它具体的代码。
    我最后用这个小程序得到了这个外挂的真正程序集。看了一下,忍不住破口大骂,原来是个骗局。百度搜了一下,果然骂声一片,竟然还真有不少童鞋上当了。不过这和本篇内容无关了,而且现在时间太晚了,等有时间一定要揭露他一下,也免得再有童鞋上当。
 

sixxpack破解的文章!【转】的更多相关文章

  1. 转帖一篇sixxpack破解的文章!

    星期天闲着没事玩游戏,玩游戏不能无外挂.于是百度了半天,找到了一个,看介绍貌似不错,就下载了下来.一看,竟然是用.net写的,下意识地Reflector了一下.发现竟是一个叫actmp的程序集.如图: ...

  2. 安利一波:Adobe 2019全家桶 破解版

    之前发过一篇Photoshop破解的文章,今天把笔记本换了个系统,发现之前那个amtlib.dll替换破解的方式不适用于最新版的Adobe 2019 CC系列了,刚好看到群里有大佬分享了一个全家桶,给 ...

  3. 软件破解入门(暴力破解CrackMe)

    ---恢复内容开始--- 所谓暴力破解,就是通过修改汇编代码进而控制程序的运行流程,达到不需注册码也能正常使用软件的目的.相对于解出算法进而编写注册机,暴破的技术含量是比较低的.但也正是因为一本05年 ...

  4. (转)Win7 64位系统下 Retional rose 2003 安装及破解

    网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...

  5. VB 共享软件防破解设计技术初探(一)

    VB 共享软件防破解设计技术初探(一) ×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(二)http ...

  6. WiFi密码破解详细图文教程

    每天都能看到有不少网友在回复论坛之前发布的一篇破解WiFi密码的帖子,并伴随各种疑问.今天流云就为大家准备一篇实战型的文章吧,详细图文从思维CDlinux U盘启动到中文设置,如何进行路由SSID扫描 ...

  7. Win7 64位系统下 Retional rose 2003 安装及破解

    网上关于Retional rose 2003安装和破解的文章比较多,这里,我结合自己的亲身体验,和大家分享一下win7 旗舰版 64位系统下Retional rose 2003(下面简称rose200 ...

  8. android黑科技系列——静态分析技术来破解Apk

    一.前言 从这篇文章开始我们开始我们的破解之路,之前的几篇文章中我们是如何讲解怎么加固我们的Apk,防止被别人破解,那么现在我们要开始破解我们的Apk,针对于之前的加密方式采用相对应的破解技术,And ...

  9. 用python暴力破解压缩文件并不是万能,至少这个场景我告诉你密码你用代码也破解不了

    看到论坛上各种贴子写用python进行暴力破解的文章,于是自己也想去尝试一下,不试不知道,一试吓一跳,真的就像那句有名的”python由入门到放弃“,把论坛上别人的脚本全部自己敲一遍,运行不报错,但也 ...

随机推荐

  1. RhinoMock中无参数方法和无返回值方法的使用

    无返回值方法,RhinoMock的例子是这么做的: demo.VoidThreeArgs(, "", 0f); LastCall.On(demo).Callback<int, ...

  2. Java 9和Java 10的新特性

    http://www.infoq.com/cn/news/2014/09/java9 Java 9新特性汇总 继2014年3月份Java 8发布之后,Open JDK加快了开发速度, Java 9的发 ...

  3. web 安全问题(二):XSS攻击

    上文说完了CSRF攻击,本文继续研究它的兄弟XSS攻击. 什么是XSS攻击 XSS攻击的原理 XSS攻击的方法 XSS攻击防御的手段 什么是XSS攻击 XSS攻击全名(Cross-Site-Scrip ...

  4. css margin塌陷问题

    一.同级块级元素塌陷 html <h2> 同级块级元素塌陷 </h2> <div class="block1"> block1 </div ...

  5. 每日英语:Mercedes Sheds Its 'Old' Design

    Daimler AG's flagship Mercedes-Benz often gets the rap for being an 'old man's car.' More unusual is ...

  6. ny42 一笔画问题

    一笔画问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. ...

  7. 二分箭术--G&K稳健过神思路

    自从资料片开始,一直在思考稳定可靠的过神思路,现在有眉目了,试验了几把感觉不错,先分享如下: 1)只开2个分城,特殊情况除外.Re: 经过多次打的经验,开2个分城比开3个分城更容易选址,政策更快,快乐 ...

  8. 基于python的直播间接口测试实战 详解结合项目

    基于python的直播间接口测试详解 一.基本用例内容描述 以设置白名单 /advisor/setUserWhiteList.do接口为例,该方法为POST at first,先要导入一些常用到的模块 ...

  9. Ubuntu12.04下tomcat的安装与配置

    1.下载tomcat 我的tomcat是从 http://tomcat.apache.org/download-70.cgi 这里下载的tar.gz版本的. 2.解压tomcat $sudo tar ...

  10. 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)

    .中断方式获取按键值 单片机: )按键按下 )cup发生中断,跳转到异常向量入口执行 )b 函数 a.保存被中断的现场 b.执行中断处理函数 c.恢复 linux: )trap_init()函数构造异 ...