如何运行资源文件中的EXE文件(50分)

任远

Unregistered / Unconfirmed
GUEST, unregistred user!
我是菜鸟,需要将一个EXE文件用BRCC32编译进了RES文件中,我已经编
译好进了,但我不知道应该如何来运行它,还有一个问题,那就是如何
在软件运行中将资源文件中的EXE另存为外部文件,如何在资源文件中
的EXE文件运行后自动结束包含它的EXE文件?
以下是我在formcreate中的部分语句:

procedure TForm1.FormCreate(Sender: TObject);
var
hRes,hResInfo:Thandle;
ptrexe:pChar;
begin
hresinfo:=findresource(hinstance,'exam','EXE');
hres:=loadresource(hinstance,hresinfo);
if hres>32 then
ptrexe:=lockresource(hres);
//此处应该如何来操作
end;
 
有创意!
 
其中ExtractRes为自定义函数,它的作用是把head.exe从资源文件中取出来。
Function ExtractRes(ResType, ResName, ResNewName : String):boolean;
var
Res : TResourceStream;
begin
try
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
try
Res.SavetoFile(ResNewName);
Result:=true;
finally
Res.Free;
end;
except
Result:=false;
end;
end;

你可以根据这个函数(ExtractRes),保存EXE文件!
 
将EXE文件从资源中释放成外部文件我已经解决,而且只有两条语句,但我现在需要的是
在资源中运行该EXE(DLL)文件。
 
var WinTempdir: string;

// 第一个过程是释放exe
//第2个过程是调用 第一个过程并执行释放出的exe

Procedure TNetUpdate.ExtractUpdateResource;
Var
reshandle: THandle;
hglobal: THandle;
ressize: dword;
ptr: pointer;
binfile: File Of byte;
Srcname: String;
buf: Array[0..MAX_PATH] Of Char;
Begin
// UPD 是以资源方式编译进去的exe 的资源名
ResHandle := FindResource(hinstance, 'UPD', PChar(RT_RCDATA));
hglobal := LoadResource(hinstance, reshandle);
Ressize := SizeOfResource(hinstance, reshandle);
ptr := LockResource(hglobal);
//取Windows Temp 目录
If (Length(WinTempDir) >= 1) And (WinTempDir[Length(WinTempDir)] <> '/') Then
WinTempDir := WinTempDir + '/';

//准备释放到temp 目录下的 upd.exe
SrcName := WinTempDir + 'upd.exe';

//写 upd.exe
AssignFile(binfile, SrcName);
Rewrite(binfile);
Blockwrite(binfile, ptr^, ResSize);
Closefile(binfile);
End;

//********************************************************
//********************************************************

//执行释放出来的 EXE
Procedure TNetUpdate.RestartProgram;
Var
proch: dword;
allow: Boolean;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
StartErrorCode: dword;
TmpBuf: Array[0..1024] Of char;
RestartParam : String;
Begin
Allow := True;
//调用上面的释放过程, 从资源文件 wupdate.res 中提取出 upd.exe 的压缩文件资源
ExtractUpdateResource;

//取得当前进程ID
proch := GetCurrentProcessID;

FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOWNORMAL;

If Not CreateProcess(Nil,
pchar(WinTempdir + 'upd.exe '),
Nil,
Nil,
true,
CREATE_NEW_CONSOLE Or NORMAL_PRIORITY_CLASS, { creation flags }
Nil, { pointer to new environment block }
Nil, { pointer to current directory name, PChar}
StartupInfo, { pointer to STARTUPINFO }
ProcessInfo) Then
Begin
StartErrorCode := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
Nil,
StartErrorCode,
0,
TmpBuf,
SizeOf(TmpBuf),
Nil);
End;
End;
 
单纯释放成EXE文件并执行,以下语句即可:
Res := TResourceStream.Create(Hinstance, 'aaa.exe', 'aaa');
Res.SavetoFile('aaa.exe');
winexec('aaa.exe',sw_Normal);
但我现在需要不释放出来即运行,这是重点。
 
难道没有人知道答案吗?!
 
不要总制造病毒
 
不明白这样做有什么好处,把EXE放到RES里,有必要吗?
 
实际上,我是需要将一个VFP编译的EXE文件放在Delphi编译的EXE的文件中,因为针对VFP
的反编译软件太多了,市面上的加密软件也不保险,想自己做一个,仅此而已。
实际上,我已经可以做到将另一个EXE文件包含进Delphi编译的EXE文件中,但是,只
有将其释放出来才可以运行,我需要的是如何不释放而运行它。
 
那你的首先掌握windows如何从加载Exe到内存并将控制权交给他
 
最好能简单给个语句,我在Delphi方面较菜!

 
呵呵,简单语句?
好像没有吧?
上面的方法也不是太麻烦。
用完了exe,就删除好了
 
不好,会曝露的!而且,Delphi编译的EXE文件要不断检查另一EXE是否运行完,不妥!
 
嘿嘿,这好像属于加密解密的范畴,我叫你个简单的方法,也不用delphi包含他了,就用
asprotect 1.23加个壳,一般人就解不开,不信你解解试试。
用delphi资源的标准方法就必须释放出来,不过你可以释放到windows/temp目录里。
 
Asprotect我用过,对VFP编译的EXE文件加密后不能运行,你试过加密VFP编译的EXE文件吗?
另外,文件释放到c:/windows/temp不行,因为我的VFP程序有路径问题,许多操作都是直接
在默认目录中的。

难道就没有办法不释放就运行吗?

 
普通都是採用先釋放再运行,路径问题可用函数获取当前程序路径解决.不释放就运行,比较有难度,我
等庸手无能无力.
 
我也提过类似的问题,真正的高手可能不愿回答这个问题。
 
灌水: 参照系统装载可执行文件并运行的过程。
 
顶部