直接在内存中运行资源中的执行文件的问题(100分)

  • 主题发起人 主题发起人 wynney
  • 开始时间 开始时间
W

wynney

Unregistered / Unconfirmed
GUEST, unregistred user!
在盒子上得不到答案 只有来请教这里的高手了

我的想法是不让资源释放到硬盘再执行
而是直接释放到内存中执行

在这里有兄弟已经公布了源码
http://www.2ccc.com/article.asp?articleid=3228
但是资源文件中的可执行文件只能是Delphi的
“可以运行所有类别EXE的,这个修改简单,你在MemoryRun单元加上JEDI的API声明文件既可,或者手动做个Convert,代码可以参考UPX的”

作者说这样做可以运行其他类别的EXE
我不懂他的意思,需要加那一个JEDI的API声明文件呢?
小弟学Delphi不久
各位大哥有没办法啊 分数不多谢谢指点下
 
学DELPHI不久就研究这个啊?厉害.

GOOGLE搜索 PEUnit 这个关键字,有你想要的代码
 
感谢楼上的兄弟!
可惜我是想调用资源文件
不知道怎么修改
 
http://forum.eviloctal.com/read-htm-tid-16803.html
这个我试过是可以的。
它的原理是随便启动一个EXE(例子里面好像是宿主)把主线程暂停。然后把我们要运行的数据拷贝到该进程的空间,处理。然后把主线程的代码指针修改到我们的EXE数据的入口。启动线程。
 
学习帮顶
 
** 从资源文件载入EXE
** exefile.rc
** 1 EXE "E:/Delphi Projects/TK/Bin/TK.exe"
var
Buf : Pointer;
Size : DWORD;
ProcessId: Cardinal;
ResHandle:Cardinal;
begin
ResHandle := FindResource(hInstance, Pointer(1), 'EXE');
if ResHandle > 0 then
begin
Size := SizeofResource(hInstance, ResHandle);
Buf := LockResource(LoadResource(hInstance, ResHandle));
MemExecute(PChar(Buf)[0], Size, '', ProcessId);
end;
end;
 
to:轻舞肥羊
你的代码是正确的,我也按原先的哪个代码修改了下
**Target.rc
**Setup eXeFile Target.exe
var
ABuffer: array of byte;
ProcessId: Cardinal; //进程ID
Res: TResourceStream; //资源流
begin
Res := TResourceStream.Create(HInstance,'Setup','eXeFile'); //创建资源
Application.Terminate;
try
SetLength(ABuffer, Res.Size); //设置大小
Res.ReadBuffer(ABuffer[0], Res.Size); //开始读了
MemExecute(ABuffer[0], Res.Size, '', ProcessId); //调用PEUnit
finally
Res.Free;
end;
end;

可否帮我看看,这2个那一个执行效果好一些?
另外,我测试了下,如果资源为非标准exe[比如屏幕录象生成的exe],就会出错
大哥有没解决之法?
 
屏幕录像生成的EXE是一个播放器+数据。数据附在EXE文件的后面。当EXE加载的时候去读取自身文件后面的数据。
上面我给你的内存执行代码因为是执行的宿主EXE文件,即便后来内存中换成了屏幕录像的EXE,但读取文件中的数据的时候读取的是宿主的EXE文件,宿主的EXE后面当然没有他要的数据了。
原理是这样的,具体解决方案你自己去想
 
to:wr960204
首先分数只有100,轻舞肥羊比你先帮助我,所以我只能这样去分配分数了 不好意思啊
另外,你说的原理我清楚,兄弟可否出个解决的法子?
 
后退
顶部