ddk313 发表于 2019-1-11 12:57:00

【.NET】程序脱壳后无法运行,有保护

本帖最后由 ddk313 于 2019-1-11 13:42 编辑

偶然在网上看到一个软件“XX百度网盘多帐号文件一键搜索工具”,官网地址:http://www.dllprotect.com/soft/5.html,感觉挺好的。但是正常只能登录一个账号,新手就想尝试Pojie一下。但是,经过几天的折腾后,发现,这个软件对于新手来说,好像难度挺大的,希望能得到大牛的指点一下。
一、用DIE检测一下吧
发现两个信息:
1、这个软件加了 Confuser的壳,这里有个疑问:之前看大佬的视频,只是显示一个Confuser壳的信息,这里为什么会显示 Confuser(1.X)[-]和 ConfuserEx(1.0.0)[-]这两个壳的信息呢?不明白。
2、这是个.net编写的程序,可以用dnspy分析。                     
二、既然有壳,那就先脱壳吧!然后网上各种找资料,找到一个感觉比较靠谱的集合,还有脱壳步骤,感觉挺好,心中暗喜!

但是脱完壳后,用DIE重新检测了一下,显示无壳了,心里很高兴!运行一下吧,无法运行!这是什么情况?

想到了两点
1、脱壳工具有问题。
2、软件有保护机制。
三、先解决是不是脱壳工具的问题吧。
1、然后又网上各种找资料,又尝试了很多脱壳工具,结果都是一样,无法运行。即使只用de4dot,也不行。难道脱壳工具都不行吗?
然后在GitHub网上发现了一个“ConfuserEx-动态脱壳”的资料,然后最近有更新,这个软件是不是可以呢?为此还特意安装了Visual Studio 2017,之前没用过这个软件,编译时各种报错,还是算了吧。其实这时候在想的是,是不是检测壳的时候,DIE显示了两个壳的原因呢?
2、既然各种工具不行,那就手脱壳试试吧。然后根据一下两个教程
    https://www.bilibili.com/video/av6756217    “How to Unpack and Deobfuscate ConfuserEx 0.6 or 1.0 (Max Set”      https://mindlocksite.wordpress.com/2017/02/11/easy-way-to-unpack-confuserex-1-0-max-settings/
尝试用手脱掉壳,但是均以失败告终!无论到哪一部,即使改动一点,都无法运行,无法继续用dnspy运行调试。没办法,应该是软件有保护机制。
四、解决软件有保护机制
把脱壳后的程序,用dnspy打开,搜索字符串“系统错误”,还真能搜索到啊!

那就挨个看吧!看怎么能把这个保护机制给取消掉。由于我不会C#、不会VB、不会IL,这个工作对我来说就太难了。
1、Main
       private static void Main()
      {
            try
            {
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);
                Application.ThreadException += Program.Application_ThreadException;
                AppDomain.CurrentDomain.UnhandledException += Program.CurrentDomain_UnhandledException;
                ServicePointManager.DefaultConnectionLimit = 65535;
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(Program.ValidateServerCertificate);
                bool flag;
                using (new Mutex(true, "Global\\" + Application.ProductName, ref flag))
                {
                  if (flag)
                  {
                        Application.EnableVisualStyles();
                        Program.StartApplication();
                  }
                  else
                  {
                        MsgBox.MsgBoxShowWarning(string.Format("“{0}”已经在运行了。", Program.SoftName), Program.SoftName);
                  }
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error("系统错误,请联系软件供应商!", ex);
                MsgBox.MsgBoxShowError("系统错误,请联系软件供应商!", Program.SoftName);
            }
      }
2、StartApplication
// Token: 0x06000087 RID: 135 RVA: 0x000064E8 File Offset: 0x000046E8
      private static void StartApplication()
      {
            try
            {
                if (Program.formMain == null)
                {
                  Program.formMain = new FormMain();
                }
                Application.Run(Program.formMain);
            }
            catch (Exception ex)
            {
                LogHelper.Error("系统错误,请联系软件供应商!", ex);
                MsgBox.MsgBoxShowError("系统错误,请联系软件供应商!", Program.SoftName);
            }
      }
3、Application_ThreadException
// Token: 0x06000088 RID: 136 RVA: 0x00006540 File Offset: 0x00004740
      private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
      {
            Exception ex = e.Exception;
            if (ex == null)
            {
                ex = new Exception("未处理异常");
            }
            LogHelper.Error("系统错误,请联系软件供应商!", ex);
            MsgBox.MsgBoxShowError("系统错误,请联系软件供应商!", Program.SoftName);
      }
4、CurrentDomain_UnhandledException
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
      {
            Exception ex = e.ExceptionObject as Exception;
            if (ex == null)
            {
                ex = new Exception("未处理异常");
            }
            LogHelper.Error("系统错误,请联系软件供应商!", ex);
            MsgBox.MsgBoxShowError("系统错误,请联系软件供应商!", Program.SoftName);
      }
这些要怎么修改才能正常运行程序呢?
我的理解,感觉是2、StartApplication里的Program.formMain = new FormMain(); 语句是启动软件界面的,想着,把所有出问题的地方都换成这一句是不是就可以了啊。然后就大改动了
改动如下:
1、Main
private static void Main()
      {
            Program.StartApplication();
      }
2、StartApplication
private static void StartApplication()
      {
            Program.formMain = new FormMain();
      }
3、Application_ThreadException
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
      {
            if (e.Exception == null)
            {
                Program.formMain = new FormMain();
            }
            Program.formMain = new FormMain();
      }
4、CurrentDomain_UnhandledException
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
      {
            Exception ex = e.ExceptionObject as Exception;
            if (ex == null)
            {
                Program.formMain = new FormMain();
            }
            Program.formMain = new FormMain();
      }
保存,还是无法运行,然后又在程序里胡乱改一通,结果都是一样,无法运行。。。。由于不会C#、不会VB、不会IL,这个工作对我来说就太难了。。。
五、换个思路,既然脱壳完成了,那就尝试写个注册机,把激活码算出来,填到没脱壳前的程序里不就可以了。
然后临时抱佛脚,找.NET写注册机的视频教程看了一下。
在本软件中,有以下关键的信息

虽然看不懂,但是有代码嘛,就在Visual Studio 2017新建了解决方案,本程序代码啥的导出,然后导入到Visual Studio 2017中,才发现,源程序中“<>o__6.<>p__1”这些代码好像还是加密状态,在Visual Studio 2017中各种报错,我也不会Visual Studio 2017。。
至此,我研究这个软件好几天了,已经黔驴技穷了。但是我有点不太甘心,希望能大牛们指导一下,非常感谢!
Pojie本软件只是交流学习用,若有违规,或软件作者有异议,请告知我删帖!谢谢

页: [1]
查看完整版本: 【.NET】程序脱壳后无法运行,有保护