社区
Windows SDK/API
帖子详情
如何从内存中运行一个程序。
dododo
2003-11-10 06:07:03
有一个EXE已经被我读到内存里了,现在想不借助硬盘运行它,可以吗??
...全文
153
13
打赏
收藏
如何从内存中运行一个程序。
有一个EXE已经被我读到内存里了,现在想不借助硬盘运行它,可以吗??
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
crossbow
2003-11-12
打赏
举报
回复
先挂起一个其它程序的进程,然后把读入的PE文件的Executable部分写到此进程被Committed的内存页面中,之后激活该进程,有点偷梁换柱的感觉。
我没有做过,只是一个设想
xah_JD
2003-11-12
打赏
举报
回复
这样做的用呢?
hch_45
2003-11-12
打赏
举报
回复
应该不行。
Xleep
2003-11-12
打赏
举报
回复
基本上不可能。
从内存访问上也是不可能的。
因为你不光要处理pe文件的节(section)在文件中的对齐粒度和在内存粒度的区别,还要处理重定位,但exe文件大都是没有重定位信息的。你exe文件中的代码地址都是基于$400000的。举一个例子:我假设exe文件A被你的进程B读到B的进程空间,exe文件所处的地址为$600000,那么在exe文件中mov [40100],EAX的这个指令就访问了错地址。这个指令应该是mov [60100],EAX才是正确的。
Seahilly
2003-11-11
打赏
举报
回复
up
dododo
2003-11-11
打赏
举报
回复
to:crossbow(【带三尺剑立不世之功】
能再详细一点吗??我也看了CreateProcess,好像不可以阿
crossbow
2003-11-11
打赏
举报
回复
CreateProcess();
crossbow
2003-11-11
打赏
举报
回复
可以用WriteProcessMemory试试,我没试过,但我觉得可以实现
crossbow
2003-11-11
打赏
举报
回复
Windows有许多种类的句柄,其中比较有趣的是内核对象(进程、
线程、文件、事件、互斥量等)的句柄。此HANDLE值仅仅是句柄表的
一个索引值。下面讨论一下进程句柄表相关结构以及一个应用例子:
向一个正运行程序的文件Write。
一、Windows98、WindowsNT(NT未验证):句柄表的格式为一个DWORD
指明大小,后跟若干项,每项两DWORD:内核对象指针与标志掩码。
98上的例子:PHT Address = 0x8162C628
Flag=0 Handle=0
Flag=0x1F0FFF Handle=0x8162C5E4
......
顺便说一句,第一项未用,第二项即为该进程句柄。0x8162C5E4即是
该进程数据库地址。
二、Windows 2000:为了防止拷贝费时,Windows2000用一个三
级表来寻找对应项。(就可以在扩充时只用分配新内存而无需拷贝原
来各项。)
1、首先,EPROCESS中的ObjectHandle指向表头:
struct _OBJECT_TABLE{
ULONG Unkown1;//总为0
ULONG HandleCount;//所有有效项数
PVOID PAT;//最高级指针
PEPROCESS ThisProcess;
ULONG Unknown2;
ULONG Unknown3;
ULONG TotalCount;//纪录第三级表分配的内存
//可容多少项
LIST_ENTRY link;
......//??上面的名字随便取的
}_HANDLE_TABLE;
例子:00 00 00 00 27 00 00 00-00 D0 3B E1 20 24 85 FE
04 02 00 00 00 1E 00 00-00 01 00 00 00 F3 CE FE
68 DD 87 FE 00 00 00 00-00 00 00 00 00 00 00 00
......
2、上面的PAT就是一个指针数组,有256项,每项指向中级表PMT
例子:00 D4 3B E1 00 00 00 00-00 00 00 00 00 00 00 00
......
3、PMT与PAT类似,指向次级表PLT。
例子:00 D8 3B E1 00 00 00 00-00 00 00 00 00 00 00 00
......
4、PLT中每项8字节,其中第一个DWORD为内核对象的指针稍加修改,
第二项也是标志掩码。
第一个表项未用,总为00 00 00 00 01 00 00 00,最后以项初
始化为00 00 00 00 FF FF FF FF,表结束。
例子:00 00 00 00 01 00 00 00-58 42 2D 61 1F 00 0F 00
48 3F F4 7E 03 00 10 00-E8 F0 C4 7E 03 00 10 00
......
00 00 00 00 31 00 00 00-00 00 00 00 32 00 00 00
......
00 00 00 00 FF 00 00 00-00 00 00 00 FF FF FF FF
每项格式很清楚(见InsideWindows2000),内核对象头可由第一个DWORD
与0x80000000相或(低三位清为0)。内核对象头开始两DWORD为句柄计数
与引用计数等等,对象头偏移0x18处(未查过所有对象类型)即为实际的
内核对象。
leapmars
2003-11-11
打赏
举报
回复
????
dododo
2003-11-11
打赏
举报
回复
那有没有办法自己做windows的这些操作,把程序运行起来
Eastunfail
2003-11-11
打赏
举报
回复
不行的。Windows操作系统将为EXE分配一个单独的进程空间,然后将代码段复制到该空间中,并将导入表内的API函数换成实际的地址。
你若是已经读到内存中并找到了该程序的入口点,你若是强制跳转执行的话,估计会由于API地址的错误或者一些偏移量的问题造成访问越权的错误并最终导致你的程序崩溃的。
saien
2003-11-10
打赏
举报
回复
关注
Android应用
程序
进程管理
Android系统里面的应用
程序
进程有
一个
特点,那就是它们是被系统托管的。也就是说,系统根据需要来创建进程以及回收进程。进程创建发生在组件启动时,它们是由Zygote进程负责创建。Zygote进程是由系统
中
的第
一个
进程init负责启动。此外,用来
运行
各种系统服务的System Server进程也是由Zygote进程创建的。进程回收发生在
内存
紧张时,由Low Memory Killer执行。此外,组件管理服务ActivityManagerService和窗口管理服务WindowManagerService也会在适当的时候主动进行进程回收。每
一个
应用
程序
进程根据
运行
情况被赋予优先级,当需要回收进程的时候,就按照优先级从低到高的顺序进行回收。这个PPT讲Android应用
程序
进程的启动和回收,主要涉及到Zygote进程、System Server进程,以及组件管理服务ActivityManagerService、窗口服务WindowManagerService,还有专用驱动Low Memory Killer。通过了解Android系统对应用
程序
进程的管理,我们就能更清楚应用
程序
的
运行
机制。
磁盘
中
运行
的
程序
必须加载到
内存
才能
运行
的原因
计算机
中
主要的存储部件是
内存
和磁盘。磁盘
中
存储的
程序
必须加载到
内存
之后才能
运行
。在磁盘
中
保存的原始
程序
是无法直接
运行
的。这是因为,负责解析和
运行
程序
内容的CPU,需要通过内部
程序
计数器来指定
内存
地址,然后才能读出
程序
。即使CPU可以直接读出并
运行
磁盘
中
保存的
程序
,由于磁盘读取速度慢,
程序
的
运行
速度还是会降低的。总之,存储在磁盘
中
的
程序
需要读入到
内存
后才能
运行
。 磁盘缓存是指,把磁盘
中
读取的数据存储...
Windows内核-
内存
管理
- Windows
内存
管理主要学习什么 - 线性地址是如何管理的 - 物理地址是如何管理的 - 缺页异常解决了什么问题 - 堆,栈这些
内存
是怎么申请的 - Windows内核情景分析 第三章 - 不管什么
程序
,除了
程序
代码本身所占用的空间外,
程序
在
运行
过程
中
总得使用一定的
内存
空间,因为数据也要占用空间。这些存储数据的
内存
空间大致可分为三类: - 全局变量:编译工具链接的时候就静态的分配好了 - 局部变量:调用子函数的时候,在栈上分配 - 通过malloc分配,可以通过free释放,重复利用 - 每个进程都有4GB的空间,但是这4GB空间并不是都在使用,有没有
一个
地方在记录着哪些地址空间已经使用了,哪些没有使用? - 肯定有
一个
地方在记录 - 怎么记录线性地址是否是可以用的? - 每个进程都有自己的线性地址管理
程序
在
内存
中
的
运行
原理
一、背景介绍 当进程被加载到
内存
时,会被分成很多段 bss段: bss段(bss segment)通常是指用来存放
程序
中
未初始化的全局变量的一块
内存
区域。 bss是英文Block Started by Symbol的简称。 bss段属于静态
内存
分配。 data段: 数据段(data segment)通常是指用来存放
程序
中
已初始化的全局变量的一块
内存
区域。 数据段属于静态
内存
分配。 text段: 代码段(code segment/text segment)通常.
如何在易语言里
运行
c,【易语言】在
内存
中
运行
EXE
该楼层疑似违规已被系统折叠隐藏此楼查看此楼.版本 2.支持库 spec.
程序
集
程序
集1.子
程序
_启动子
程序
, 整数型_临时子
程序
() ' 在初始化代码执行完毕后调用测试代码返回 (0) ' 可以根据您的需要返回任意数值.子
程序
_临时子
程序
.局部变量 信息,
运行
信息在
内存
中
运行
EXE (读入文件 (“C:\Windows\system32\winlogon.exe”), , 信息...
Windows SDK/API
1,183
社区成员
22,335
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章