最近手头有个需求:dll需要注入到某个进程常驻,该dll具备自我升级能力,当发现新的可用版本时,立即Free自己,加载新的。下面是一个实现方案:

开启一个监听线程,从网络上拉新的可用版本,下载放到一个临时目录,如果发现需要升级,则立即FreeLibrary自身,然后执行更新过程。
    由于FreeLibrary之后当前模块的内存区域已经无效,所以更新的过程使用一个单独的线程,并将要更新过程的代码通过shellcode的形式写到分配的内存中执行。更新过程中将会使用一些系统API函数,这里不能直接通过函数名来调用,因为这样会访问导入表,而DLL此时已经Free掉了。所以事先通过准备一个参数传递给该线程,该参数有更新线程要用到的一些数据和地址:

下面看看更新监听线程如何工作以及如何准备这些参数:

创建好更新线程后,自己得及时退出并Free自己(这样更新线程才能把自己删掉):

下面看看更新线程如何工作:

同Free自己模块一样,最后VirtualFree参数和当前代码所占内存页面后,不能再回来,通过构建栈参数的形式,结束当前线程。这个函数编译后的二进制指令保存到全局数组中:

下面是测试的效果(XP、Win7 32 &64均测试通过):

最后有几个地方要说明的是:
1、  加载新的dll前要把临时目录下的文件删除掉,防止出现递归循环更新过程。
2、  执行更新过程前需要判断dll的版本信息,同样是为防止出现递归循环过程。

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:

 

[转载]运行中的DLL自升级的更多相关文章

  1. 转载 .net中的dll.refresh文件和pdb文件

    转载原地址: http://blog.csdn.net/lihuang319/article/details/6433727 dll.refresh文件 打开refresh文件,可以看到里面仅仅是个路 ...

  2. [转载]解析WINDOWS中的DLL文件---经典DLL解读

    [转载]解析WINDOWS中的DLL文件---经典DLL解读 在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库.现在就走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧! ...

  3. java中调用dll文件的两种方法

    一中是用JNA方法,另外是用JNative方法,两种都是转载来的, JNA地址:http://blog.csdn.net/shendl/article/details/3589676   JNativ ...

  4. VS2017中 C# dll引用(C生成dll,C++生成dll)小结 - 简书

    原文:VS2017中 C# dll引用(C生成dll,C++生成dll)小结 - 简书 dll引用小结 一.dll与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library” ...

  5. CVE-2020-0668-Windows服务跟踪中的普通特权升级错误

    CVE-2020-0668-Windows服务跟踪中的普通特权升级错误 在这里中,我将讨论在Windows Service跟踪中发现的任意文件移动漏洞.从我的测试来看,它影响了从Vista到10的所有 ...

  6. 在VS2012中采用C++中调用DLL中的函数 (4)

    这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人 ...

  7. 在C++中调用DLL中的函数 (3)

    1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等 ...

  8. C#中使用DLL文件

    首先,我们需要在C++程序中导出DLL文件.我使用的是Visual Studio开发,把项目"属性"中的“配置类型”改为"动态库dll",然后添加如下导出代码: ...

  9. 在C#中实现软件自动升级

    在C#中实现软件自动升级 winform程序相对web程序而言,功能更强大,编程更方便,但软件更新却相当麻烦,要到客户端一台一台地升级,本文结合实际情况,通过软件实现自动升级,弥补了这一缺陷,有较好的 ...

随机推荐

  1. 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用

    Jerry之前的文章30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 发布之后,有朋友问我,"没错, 我是在你的文章里看到了Fiori应用的 ...

  2. 常用模块(collections模块,时间模块,random模块,os模块,sys模块,序列化模块,re模块,hashlib模块,configparser模块,logging模块)

    认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...

  3. Burp Suite Extension tools

    1.Setting up the envrionment for burp Extensions   before we can write extensions we need to ensure ...

  4. StringComparison 枚举

    地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.stringcomparison?redirectedfrom=MSDN&view= ...

  5. Codeforces C. A Simple Task(状态压缩dp)

    题目描述:  A Simple Task time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  6. Maven02 -学习总结&学习文档 -踩坑123

    maven在开发中的作用 ①自动添加第三方 jar 包 在今天的 JavaEE 开发领域,有大量的第三方框架和工具可以供我们使用.要使用这些 jar 包最简单的方法就是复制粘贴到 WEB-INF/li ...

  7. JDK源码那些事儿之ConcurrentLinkedQueue

    阻塞队列的实现前面已经讲解完毕,今天我们继续了解源码中非阻塞队列的实现,接下来就看一看ConcurrentLinkedQueue非阻塞队列是怎么完成操作的 前言 JDK版本号:1.8.0_171 Co ...

  8. 《The One!团队》第八次团队作业:Alpha冲刺

    项目 内容 作业所属课程 所属课程 作业要求 作业要求 团队名称 < The One !> 作业学习目标 (1)掌握软件测试基础技术.(2)学习迭代式增量软件开发过程(Scrum) 团队项 ...

  9. machine learning (7)---normal equation相对于gradient descent而言求解linear regression问题的另一种方式

    Normal equation: 一种用来linear regression问题的求解Θ的方法,另一种可以是gradient descent 仅适用于linear regression问题的求解,对其 ...

  10. LightOJ - 1259 - Goldbach`s Conjecture(整数分解定理)

    链接: https://vjudge.net/problem/LightOJ-1259 题意: Goldbach's conjecture is one of the oldest unsolved ...