VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 989|回复: 12

[求助] 内存调用 exe, dll ???

[复制链接]
77_avatar_middle
在线会员 发表于 2016-2-18 10:19:57 | 显示全部楼层 |阅读模式
50驿站币
求解:

有一个exe或者dll文件,但是没有它们的源码,现在将它们各自定义到一个BYTE数组内存里。
求问,如何在避免读写磁盘的状态下,启动exe和dll呢?求范例?求提示?内存调用 exe, dll ??? 内存调用 exe, dll ???

谢谢!好人一生平安!~内存调用 exe, dll ???





上一篇:菜鸟求教
下一篇:GetWindowText 和 EnumWindows 的问题
51_avatar_middle
online_admins 发表于 2016-2-18 10:57:47 | 显示全部楼层
百度搜索关键字:内存加载 exe
还是有不少文章介绍的,不过没去验证方法的有效性,楼主可以试试,记得前段时间还帮网友解决过这个问题,win7 环境下也是可以的
77_avatar_middle
ico_lz  楼主| 发表于 2016-2-18 11:49:02 | 显示全部楼层
Syc 发表于 2016-2-18 10:57
百度搜索关键字:内存加载 exe
还是有不少文章介绍的,不过没去验证方法的有效性,楼主可以试试,记得前段 ...

谢谢!我再查查有没有一步到位的!~~~
17_avatar_middle
online_supermod 发表于 2016-2-20 11:41:05 | 显示全部楼层
cctrylook 发表于 2016-2-18 11:49
谢谢!我再查查有没有一步到位的!~~~


[源码] 另类DLL加载方法(解析PE打造自己的GetProcAddress)
https://www.cctry.com/forum.php? ... 08&fromuid=1817
(出处: VC驿站)

或者google memory load

加载EXE的话稍微麻烦,一般都是dll

点评

无法下载啊 大哥  发表于 2016-2-20 16:47
17_avatar_middle
online_supermod 发表于 2016-2-20 16:49:47 | 显示全部楼层
这得联系站长老大了~~
77_avatar_middle
ico_lz  楼主| 发表于 2016-2-25 13:40:24 | 显示全部楼层
Koma 发表于 2016-2-20 11:41
[源码] 另类DLL加载方法(解析PE打造自己的GetProcAddress)
https://www.cctry.com/forum.php?mod=viewt ...

谢谢! 我试试看!
53_avatar_middle
在线会员 发表于 2016-2-29 20:20:13 | 显示全部楼层
“如何在避免读写磁盘的状态下” 是什么意思?不太懂。楼主的意思是自己写一个 exe 或 dll 的加载程序吗?思路:把exe或者dll读入内存(这个需要读写磁盘。似乎不符合楼主要求),把所有需要重定位的地址+你分配的内存起始地址。
77_avatar_middle
ico_lz  楼主| 发表于 2016-3-1 08:25:15 | 显示全部楼层
xieglt 发表于 2016-2-29 20:20
“如何在避免读写磁盘的状态下” 是什么意思?不太懂。楼主的意思是自己写一个 exe 或 dll 的加载程序吗? ...

我的问题来源于以下该段话:
{
内存映射文件的优点在于可以保密文件。可以减少I/O操作。但文件过大的话并不推荐使用。
例如,我的程序要引用一个叫a.exe的程序,而a.exe是别人写的我没有源码,但我引用该exe时又不希望别人获得这个exe,
只希望别人在我的程序中使用a.exe的功能。此时,只需要将a.exe定义到一个byte数组里面,使用该exe时执行这个数组就可以了,
根本不用I/O操作,无读磁盘,效率自然要高些,像调用自己的窗体一样调用a.exe。
而且因为是在byte数组里,我可以对该数组任意加密,使用时解密。
安全性极高,虽然通过资源res文件可以将a.exe加密后放到资源,但别人用资源提取软件很容易将a.exe提出来。
}
53_avatar_middle
在线会员 发表于 2016-3-1 21:27:09 | 显示全部楼层
我想我大致明白你的意思了。是不是这样?
定义一个数组
BYTE  exeFile[] = {....};
exe文件的每一个字节写到这个数组里。
把exe文件写在你的源代码里。

试想一下,如果这个exe文件比较大,比如说兆级别的,你的编码工作量和维护工作量都会很大。
当然,你可以用工具将二进制数据转换为 ascii ,然后拷贝,粘贴。这么大的数据量,你得非常
小心谨慎,一个误操作改了任何一个数据,都可能导致那个exe无法执行,而且,你可能永远也
找不到错误在哪里。

效率问题:当你的程序运行时,已经就发生了额外磁盘I/O,本来你的程序只有100k,
把exe加进去后可能就成了1000K,哪来的效率?最关键的是,现在计算机的速度越来越快,
单纯从磁盘上读入一个exe文件,根本就感觉不出来差别。

安全问题:把exe当成数据写到源代码中,肯定会比作为磁盘文件安全。但是,解密后,
它依然在内存里有一个完整的拷贝,依然可以被dump到磁盘上。安全也只是相对的。

最后我说一下思路:
首先,你得熟悉 PE 文件格式
你需要从 PE 文件里获得如下信息:
1、exe文件的 EntryPoint,就是这个exe 的代码入口,这个很简单。
2、按重定位表来修正需要重定位的地址。这个比较麻烦,当然,如果你的exe比较简单,
     没有重定位信息,这一步就可以省了。
3、查找函数导入表,找到exe里用到的dll,并将它们载入内存,LoadLibrary即可,然后
     修正函数导入表,将exe里调用的函数地址修正为你LoadLibrary里函数的地址。
     如果你的exe没调用任何dll,这一步就可以省了。
4、以上工作做完后,该内存exe就可以执行了。
5、执行方式:
     1: call 或者 jmp 到第一步中获得的 EntryPoint ,当然,这个方式肯定是不行的,因为
           这样的话你自己程序就将丢掉cpu控制权,而且,很有可能永远要不回来了。
     2:用CreateThread 的方式,CreateThread(EntryPoint,....); 这个方式理论上可行。

最近比较忙,只提供一下思路,等闲下来,我也想实践一下。
77_avatar_middle
ico_lz  楼主| 发表于 2016-3-2 09:51:39 | 显示全部楼层
xieglt 发表于 2016-3-1 21:27
我想我大致明白你的意思了。是不是这样?
定义一个数组
BYTE  exeFile[] = {....};


好麻烦!我还没有这样的技术积累!  
不过谢谢你!
17_avatar_middle
在线会员 发表于 2016-8-5 02:16:55 | 显示全部楼层
白加黑我直接有源码
26_avatar_middle
在线会员 发表于 2016-8-6 11:55:01 | 显示全部楼层
内存调用 exe, dll ???太难
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-4-19 09:26

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表