社区
工具平台和程序库
帖子详情
如何在一个执行文件的内存空间执行另一个执行程序
yinaijun
2003-11-25 04:12:10
我用a.exe执行程序将b.exe执行程序文件用fopen打开,然后用fread读入到一缓存区buffer,现在的问题是,我如何在buffer这一内存区执行b.exe
...全文
79
11
打赏
收藏
如何在一个执行文件的内存空间执行另一个执行程序
我用a.exe执行程序将b.exe执行程序文件用fopen打开,然后用fread读入到一缓存区buffer,现在的问题是,我如何在buffer这一内存区执行b.exe
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
不能这样做吧,操作系统不提供这样的方法吧。
文件
分割器
4. **ztsSplit.exe**:这是可
执行
文件
,意味着汇编源代码已经被成功编译和链接成
一个
可以直接在Windows系统上运行的程序。用户可以通过这个
文件
来
执行
文件
的分割操作。 5. **ztsSplit.inc**:这可能是
一个
包含
文件
...
查看内存使用情况的汇编源代码
2. 内存映射表:可能有
一个
内存映射表,用于记录程序运行时所需的数据结构或函数库在内存中的实际位置,这有助于高效地查找和操作内存。 3. 内存监控函数:这部分代码负责检测内存使用情况,例如跟踪已分配的内存块...
Call 和 Return 使用
当我们在汇编语言中遇到
一个
"Call"指令时,程序员实际上是将程序的
执行
流转移至另
一个
预先定义好的子程序或函数。这个子程序通常会
执行
特定的任务,例如
执行
复杂的计算、处理数据或者进行某种逻辑操作。"Call"指令...
汇编实时运行核心
3. K1.C:虽然C
文件
一般不直接包含汇编代码,但K1.C可能是
一个
C语言编写的驱动程序或者其他底层服务,这些服务在编译时会被链接到汇编模块。这部分代码可能处理硬件接口,如定时器、串口通信等,它们间接支持了汇编...
可
执行
程序
加载到内存的过程
可
执行
程序
加载到内存的过程 在linux中,程序的加载,涉及到两个工具,linker 和loader。Linker主要涉及动态链接库的使用,loader主要涉及软件的加载。 1、 exec
执行
一个
程序 2、 elf为现在非常流行的可
执行
文件
...
工具平台和程序库
24,854
社区成员
27,330
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章