none
请问,如果直接执行资源文件里的可执行文件 RRS feed

  • 问题

  • 最近公司产品的需要。软件是在光盘里的。而主程序里有个可执行资源文件。怎么才能不把它释放出来就直接

    加载到内存中执行呢。。。程序要用WINDOWS API实现,不能使用MFC或者带.NET FRAMEWORK。

    想了好几天了。实在没办法了。请各位高手,帮帮忙

    2009年8月20日 13:57

答案

  • 现在在内存中动态加载dll比较成熟了,可以做到通用,大部分的保护壳都有这个功能,杀毒软件、反外挂程序也有这功能
    在内存中直接加载exe就不知道了
    在黑客防线今年第五期(好像是)上有篇文章有介绍一种方法 启动一个进程然后把进程对应的pe文件改成其他pe文件

    如果真的不释放出来只能在内存中做这个实行 我来做这个 大概会是这样
    1. 暂停方式启动一个进程(任意pe,比如explorer,或者自己程序目录下对应的一个stub exe文件)
    2. 将资源文件中的PE文件映射到命名的共享内存
    3. 对刚刚启动的进程注入一个dll,这个dll是一个loader,他把shm中的pe文件加载进来执行(具体可参见一些开源的壳,load exe比load dll简单一些,不需要重定位,dll也可以用stub exe自己加载进来,反正只要加载到目标进程就可以了)
    4. 准备工作做好之后jmp 到 加载的pe的oep处

    这样做要求stub exe文件要比内存中加载的pe大, 如果太小 可能系统load进来时分配的内存段太小不能完全容纳资源中的那个pe文件
    而 exe通常是不带重定位表的, 要加载到非默认地址 重定位不那么容易的

    • 已标记为答案 Tim Li 2009年8月31日 3:07
    2009年8月21日 9:34

全部回复

  • 需要重现操作系统加载可执行文件的过程,例如查找.Net版本、加载DLL、调整函数地址等等。不同操作系统的加载过程不同,而且每次安装Windows更新这个过程都可能变化,所以要兼容所有版本的Windows基本上是一个不可能的任务。

    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2009年8月20日 16:38
    版主
  • 目前有些直接从内存运行PE程序的方法,可以参考一下.

    http://www.cnblogs.com/lifeengines/archive/2009/03/11/1286261.html

    2009年8月21日 2:35
  • 现在在内存中动态加载dll比较成熟了,可以做到通用,大部分的保护壳都有这个功能,杀毒软件、反外挂程序也有这功能
    在内存中直接加载exe就不知道了
    在黑客防线今年第五期(好像是)上有篇文章有介绍一种方法 启动一个进程然后把进程对应的pe文件改成其他pe文件

    如果真的不释放出来只能在内存中做这个实行 我来做这个 大概会是这样
    1. 暂停方式启动一个进程(任意pe,比如explorer,或者自己程序目录下对应的一个stub exe文件)
    2. 将资源文件中的PE文件映射到命名的共享内存
    3. 对刚刚启动的进程注入一个dll,这个dll是一个loader,他把shm中的pe文件加载进来执行(具体可参见一些开源的壳,load exe比load dll简单一些,不需要重定位,dll也可以用stub exe自己加载进来,反正只要加载到目标进程就可以了)
    4. 准备工作做好之后jmp 到 加载的pe的oep处

    这样做要求stub exe文件要比内存中加载的pe大, 如果太小 可能系统load进来时分配的内存段太小不能完全容纳资源中的那个pe文件
    而 exe通常是不带重定位表的, 要加载到非默认地址 重定位不那么容易的

    • 已标记为答案 Tim Li 2009年8月31日 3:07
    2009年8月21日 9:34