当前位置: 首页 > news >正文

记:使用Xenocode加壳混淆后,无法“自杀覆盖”的自动更新

这个难题可是整整搞了我2天时候。

直至目前,才算有一个解决方案。

 

经过 Xenocode 的 WinForm 程序,如果你想实现一键式自动更新(就是不需要客户点一下点一下),那是相当困难的。

原因是 Xenocode 不但混淆了代码,还进行“加壳”保护了!至于什么是加壳,我个人理解是:在一个程序里运行另外一个程序(没有看过相关的知识,见笑了)。

 

我来说说我的自动升级构思:

 

ExpandedBlockStart.gif 代码
                            ProcessStartInfo info  =   new  ProcessStartInfo();
                            info.WorkingDirectory 
=  Application.StartupPath;
                            info.FileName 
=   " AutoUpdater.exe " ;
                            info.Arguments 
=   string .Format( " \ " { 0 }\ "  \ " { 1 }\ "  \ " { 2 }\ "" ,
                               Process.GetCurrentProcess().Id,
                               StaticModel.GetServerUrl() 
+  versionAndFilename[ 1 ],
                               versionAndFilename[
2 ]);
                            
//  ProgramEx.Mutex.TryDispose();
                            info.UseShellExecute  =   false ;
                            Process.Start(info);
                            Application.ExitThread();

 

 而 AutoUpdater.exe 很简单,到指定网址下载一个 rar,删除当前文件夹里的所有文件并解压。

这里涉及到一个问题:如果不使用混淆加壳,这一段代码,是完全行得通的。

 

可是一旦保护了,问题就来了,使用 Process.Start 后仍处于Xenocode 加壳进程中。 

通俗的说:在加壳混淆后的程序(程序A)里,调用了任何外部程序(程序B)以后,都无法删除源程序(程序A)。

 

这可忙得我焦头烂额。到网上搜罗无数办法,包括是CreateProcess API,什么拷贝到临时文件,然后再返回来,等等等等……神啊,救救我吧!

 

其实缓解方案还是有的,就是雷同 ClickOnce ,建立一个“版本文件夹”。但是这个方法比较麻烦,因为我在安装包的时候,就已经创建桌面快捷键,如此一改,将会涉及到更多的问题。

琢磨了2天,直到今晚,无意中想起,Xenocode加壳了,我自己就不能“加壳”?

 

说干就干,程序很简单,建立一个新的WinForm应用程序:

 

ExpandedBlockStart.gif 代码
         ///   <summary>
        
///  应用程序的主入口点。
        
///   </summary>
        [STAThread]
        
static   void  Main()
        {
            Process p 
=   new  Process();
            p.StartInfo.FileName 
=   " AthleticPos2011.Views.exe " ;
            p.StartInfo.Arguments 
=   " 1 " ;
            p.Start();
            p.WaitForExit();
            
if  (File.Exists( " update.ath " ))
            {
                Thread.Sleep(
1000 );
                var args 
=  File.ReadAllText( " update.ath " );
                File.Delete(
" update.ath " );
                ProcessStartInfo info 
=   new  ProcessStartInfo();
                info.WorkingDirectory 
=  Application.StartupPath;
                info.FileName 
=   " AutoUpdater.exe " ;
                info.Arguments 
=  args;
                info.UseShellExecute 
=   false ;
                Process.Start(info);

                Application.ExitThread();
            }

        }

 

 

 而源程序的发现需要更新后的操作变成如下:

 

ExpandedBlockStart.gif 代码
File.WriteAllText( " update.ath " string .Format( " \ " { 0 }\ "  \ " { 1 }\ "  \ " { 2 }\ "" ,
                               Process.GetCurrentProcess().Id,
                               StaticModel.GetServerUrl() 
+  versionAndFilename[ 1 ],
                               versionAndFilename[
2 ]));
                            
this .Close();
                            
//  ProgramEx.Mutex.TryDispose();
                            
// ProcessStartInfo info = new ProcessStartInfo();
                            
// info.WorkingDirectory = Application.StartupPath;
                            
// info.FileName = "AutoUpdater.exe";
                            
// info.Arguments = string.Format("\"{0}\" \"{1}\" \"{2}\"",
                            
//    Process.GetCurrentProcess().Id,
                            
//    StaticModel.GetServerUrl() + versionAndFilename[1],
                            
//    versionAndFilename[2]);
                             /// / ProgramEx.Mutex.TryDispose();
                             // info.UseShellExecute = false;
                            
// Process.Start(info);
                            
// Application.ExitThread();

 

 

 好了!!搞定!明天优化一下!大家早点休息吧!

转载于:https://www.cnblogs.com/sofire/archive/2010/07/23/1784019.html

相关文章:

  • 数组相关排序
  • 机器学习中的算法(1)-决策树模型组合之随机森林与GBDT
  • Java基础学习总结(23)——GUI编程
  • JDBC 通过PreparedStatement 对数据库进行增删改查
  • JPA常用注解
  • php的插入排序,通过双层for循环
  • 我的Git忽略文件
  • SCSS(SASS、CSS)学习
  • Cenos7下nginx+mysql+php环境的搭建
  • Linux实用工具
  • 李洪强经典面试题42
  • Spring3 MVC详解
  • 2:jquery.cookie用法详细解析
  • 新浪微博客户端(21)-获取当前微博未读数并提示用户
  • Distributed Configuration Management Platform(分布式配置管理平台)
  • 【剑指offer】让抽象问题具体化
  • create-react-app做的留言板
  • ES6 学习笔记(一)let,const和解构赋值
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • php中curl和soap方式请求服务超时问题
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue.js-Day01
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 我这样减少了26.5M Java内存!
  • 异步
  • Prometheus VS InfluxDB
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • $.proxy和$.extend
  • (1)(1.13) SiK无线电高级配置(六)
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (C语言)二分查找 超详细
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (补)B+树一些思想
  • (分布式缓存)Redis持久化
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (接口自动化)Python3操作MySQL数据库
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (一)SpringBoot3---尚硅谷总结
  • (转)【Hibernate总结系列】使用举例
  • (转)项目管理杂谈-我所期望的新人
  • *** 2003
  • .form文件_SSM框架文件上传篇
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 8.0 发布到 IIS
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core 版本不支持的问题
  • .NET4.0并行计算技术基础(1)