如何在一个执行文件的内存空间执行另一个执行程序

yinaijun 2003-11-25 04:12:10
我用a.exe执行程序将b.exe执行程序文件用fopen打开,然后用fread读入到一缓存区buffer,现在的问题是,我如何在buffer这一内存区执行b.exe
...全文
79 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
MadLee 2003-11-28
  • 打赏
  • 举报
回复
黑黑,可以的,以前的病毒94这么干的,
不过现在的年轻人都用VBA做病毒,
真是越来越没出息了

建议楼主去学病毒学原理
zjz0911 2003-11-27
  • 打赏
  • 举报
回复
佩服阿佩服
jeckyz 2003-11-26
  • 打赏
  • 举报
回复
TO:yinaijun(yinaijun),

我大概明白了你的意思,按照我的理解,你或许要实现自己的PE Loader,也就是把 a.exe 设计成类似于"资源管理器”的东西(不过此时不能算是在同一内存空间运行了,WIN32压根就没想过给机会让你这么做)。

我前面说过,如果你把 b.exe 当作数据读到内存里,这个 b.exe 将完全没有进行初始化,当然也就是不能运行的,不管你把它放到哪个地方都必然要做一步工作。如果 a.exe 具备资源管理器的那种功能的话,一切好办,把 b.exe 读入已经分配好的内存里,立刻关闭文件句柄,然后把磁盘文件 b.exe 删除,进而,就是自己完成PE的初始化处理,完了之后,就可以象资源管理大那样让程序运行起来。头都大 :(

你可以找找 PE Loader 方面的资料,没搞懂它就想自己来做一系列的搬运替换工作,相当的不容易的。或者你了解系统GDT方面的知识也行,不过比我上面所说的还更恐怖,而且现在用的都是NT架构的系统,想进入 kernel mode 就要头痛好一陈子了,这又把驱动程序的编写给扯了出来。

兄弟你好好玩,我等着你的好消息,希望到时你能分享一下经验。
yinaijun 2003-11-26
  • 打赏
  • 举报
回复
flyelf(空谷清音) , 非常感谢,我仔细的拜读了您推荐的文章,不错,但显然和我的问题有所出入。

1,在这篇文章中,将线程拷入其它进程时,实际上已经进行了地址的重定位,由本进程进行了相关信息的初始化,已经远不是fread形势的原始二进数据了。

2,文章所说是创建线程,而我的问题应该是启动一个进程,由一个进程变出两个进程,且第二个进程的数据由第一个进程提供。
yinaijun 2003-11-26
  • 打赏
  • 举报
回复
jeckyz(深圳) ,我的意思是在内存运行一个执行程序,也就是说,在硬盘上是没有这个程序的,上面用fopen, fread,只是为了叙述问题的方面。

b.exe读入内存后,就删除,而且今后也不能有,也不能用临时文件。,你不能用LoadLibrary)加载,因为如果你能用LoadLibrary)加载,那么也就能用exec, system, 或 CreateProcess 等,实质上也就不是原意表示的在a.exe进程内存运行了。

必须在同一个进程空间;当然不在同一进程空间,但能满足条件的话(在内存运行),也可以。
jeckyz 2003-11-25
  • 打赏
  • 举报
回复
首先我是不明白楼主为什么要这么做,根据我的理解这样做是不行的,因为b.exe 是一个完整的程序,操作系统运行一个程序实例时,程序加载器是要经过一系列的初始化的,若在 Windows 系统下,加载器最起码要进行重定位等操作,也就是说 import 表的函数要初始化为真实的函数地址(而不再是API的函数名)。即使你有本事自己完成这样的工作,真正要执行这段内存,操作系统也是会做为一个进程,另外开一段内存来起动这个程序实例的。

或许我可以介绍一种我用的方法供你参考一下。首先 b.exe 不能做为一个程序来运行,但可以作为一个DLL来运行,也就是说,这个 b.exe 要有 export 表,你可以考虑将一些主要的功能导出,然后在a.exe 中就像加载DLL一样(LoadLibrary)加载,然后调用 GetProcAddress 来取得执行入口,当然,如果一切成功,对函数的调用就相当于执行了b.exe 的功能了。这种用法可以满足你的要求,因为 b.exe 确实在 a.exe 实例的4GB空间之内。

如果用 exec, system, 或 CreateProcess 等来启动的,都不可能是在 a.exe 内存空间中运行,此时,绝对是做为一个单独的进程来运行的。
flyelf 2003-11-25
  • 打赏
  • 举报
回复
这儿有一篇在win2k下实现该功能的文章:
http://wlbookwl.myrice.com/jck2002/01/020120win2kyc.htm
NoneSoVile 2003-11-25
  • 打赏
  • 举报
回复
楼猪的想法很高难度,他的问题实际上是将一个程序载入到他指定的地址空间,这是操作系统做的事情,各个进程之间的地址空间是分开的。晕。
在一个程序创建另外一个进程:
win32下 CreateProcess(....)
LINUX exec(..)
北极猩猩 2003-11-25
  • 打赏
  • 举报
回复
楼上的方法是在不同的地址空间中执行执行程序的。
HostOOP 2003-11-25
  • 打赏
  • 举报
回复
可以这样吗?一般来说,在Unix/Linux上调用execl()函数族,在windows上调用sys()
xiaoyunet 2003-11-25
  • 打赏
  • 举报
回复
不能这样做吧,操作系统不提供这样的方法吧。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧