如何从内存中运行一个程序。

dododo 2003-11-10 06:07:03
有一个EXE已经被我读到内存里了,现在想不借助硬盘运行它,可以吗??
...全文
153 13 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
关注

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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