如何将自已的EXE文件一运行就捆绑到另外一个EXE文件中去 原理讨论过的(简单的那一种)。复杂如病毒的就不说了,还没有那个水平。:)代码:http://kingron.myetang.com/ --〉 软件下载 --〉文件分解与合并(源代码)。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我说的是当宿主程序一运行我的程序也就自动运行的那种,我看到过一个这样一个捆绑软件就是可以将两个可执行程序捆邦在一起,一运行两个程序都会运行,请问怎么做呀,最好有源程序,我的EMAIL是[email protected],谢谢。(我可不是想害人,只是有点好奇罢了) K,20'难道要别人给你写出代码啊?原理就是那个样子的(简单的)。把我的代码稍微修改一下,在程序自动释放资源之后,自动Winexec or Shellexecute不就行了? 不要问那么简单的问题lovejingtao.126.com yypp()兄,我正有此意那位大哥能帮忙呀?(说白了就是病毒,就是不用出现在WINDWOS中的RUN什么的里面,而是让它自动捆绑到一个WINDOWS必须运行的程序上而自动运行) 拷贝的,呵呵。参考参考。文件合并器的制作方法 作者:王昊 从想到做文件合并器到现在已经有一个多月了,但是一直没有静下心来想它的实现方法. 昨天看数学看烦了, 我终于忍不住扔开了书,开始着手"文件合并器"的编制.3小时后,终于有了眉目,今天又改了一下.现在终于能够和 各位分享我的喜悦了.我愿意将我的方法写给大家,也希望各位高手不吝赐教. 先看看我们的目的:编写一个程序A,它能够将两个可执行程序B和C合并在一起,形成 一个新的可执行程序D. 要让用户执行D的时候,相当于同时运行B和C两个程序. 我的开发工具:我现在能够用VB和DELPHI中的任何一个开发这个软件.这次我用的是 DELPHI.如果你需要,也可以用VC或BCB来完成. 下面我用这三个小时中我考虑的东西为线索来讲讲主要的原理. 一. 我的疑惑. 将两个可以执行的程序合并在一起会变成什么东西?这是我的第一个疑惑.要解 决这个问题,首先要学会 如何将两个文件合并在一起.我想到了内存流(MemoryStream),它能极方便的完成这个步 骤.假设有两个可执行文件f1, f2.现在要把他们合并在一起.下面给出原代码. var strmSource,strmDest:TMemoryStream; begin //先读f1 strmSource:=TMemoryStream.Create; strmSource.loadfromfile(f1); //拷贝到strmdest strmDest:=TMemoryStream.Create; strmDest.copyfrom(strmSource,strmSource.size); strmSource.clear; //再读f1 strmSource.loadfromfile(f2); //拷贝到strmdest strmDest.seek(strmDest.size,soFromBeginning); strmDest.copyfrom(strmSource,strmSource.size); strmSource.free; //这时strmDest里面便是两个文件合并后的内容了.将它保存为文件 strmDest.SaveToFile('dest.exe'); strmDest.free; end; 我惊讶的发现,执行dest.exe就相当于执行f1!!为了确认,我将原代码中f1和f2的 读入顺序对调,得到的新的dest.exe执行竟然相当于执行f2!!(此处省略了N个感叹号).我又用同样的方法在f1 的后面添加很多无意义的字节,得到的新的f1运行竟然很正常.现在我们知道了,将两个或者多个可执行文件合并在 一起,得到的新文件执行时只是执行第一个文件.这是非常关键的一步. 二.如何分离? 合并没有问题了,如何分离呢?在知道原来的两个文件的大小的情况下,这很容易 作到.假设i1和i2是原来两个文件的大小(字节).合并后的文件是"dest.exe". var strmSource,strmDest:TMemoryStream; Begin //先读dest.exe strmSource:=TMemoryStream.Create; strmSource.loadfromfile('dest.exe'); //拷贝f1到strmdest strmDest:=TMemoryStream.Create; strmDest.copyfrom(strmSource,i1); //保存f1 strmDest.SaveToFile(f1); strmDest.clear; //拷贝f2到strmdest strmSource.seek(i1,soFromBeginning); strmDest.copyfrom(strmSource,i2); strmDest.SaveToFile(f2); strmDest.free; strmSource.free; end; 三.总体思路. 在解决了上述问题后,我的总体思路就出来了.假设我给用户的程序是A,它能把 B和C合并起来得到D.那么D具有什么特征呢?D应该至少由三个部分组成(请注意是"至少"):第一部分是一个可 执行的程序,我把它叫做 标准程序S,他能将D的第二部分和第三部分(就是原来的可执行文件B和C)读出来,保存在磁盘上,然后执行他们.但大家看了"如何分离"后应该知道,只有我们知道了B和C的长度时,才能方便的从D中读出他们.而为了使D可以在另一个用户的机子上也能够运行,我认为B和C的长度信息应该保存在D的最后.于是,D应该具有四个部分: 1: S 2: B 3: C 4: 长度信息 那么,既然我给用户的程序是A,那么这里的标准程序S又从何而来呢?标准程序S又应该保存在哪里呢? 有两个办法.第一,给用户的程序包含两个文件,一个是A,一个是S.但我觉得这样不够 爽.于是我用了另一个方法: 将S连在A的后面,成为A'. 于是乎,当用户执行A'时,A'要求用户选择两个可执行文件B和C.当用户点击确定时, A'将它自身所带的S与B和C合并起来,形成D.然后,用户便可以执行D了,这时的D并不依赖于A'.D执行时,实际上执行的是它的第一部分S,S首先从D的最后取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目 录.然后调用ShellExecute执行他们.这样就达到了我们的目的. 那么,长度信息如何定义呢?如何将S连在A的后面呢?S如何完成自身的功能呢?这就是 我下面要讲的. 四.保存长度信息. 我先讲一讲如何把一个字符串写入内存流.其实我自己也不知道如何直接将一个 字符串的内容读到内存流中,于是我采取了先将字符串内容写入一个临时文件中,然后用loadformfile将文件内容读入内存流中. 然而,我们必须知道连接在D后面的长度信息的具体长度,也就是说用几个字节保 存,才能让S读出长度信息.我考虑再三,决定用32个字节来表示每个文件的长度,虽然大多数情况下,文件大小不会超出100M. 看看这里的代码: var strmSource,strmDest:TMemoryStream; s1,s2:string; f:TextFile; begin //先用上面的方法将S和B与C的内容写入strmdest,现在要在strmDest里面添 加长度信息 //假设s1,s2里放有B和C的大小,先把他们变为32个字节. while length(s1)<32 do begin s1:='0'+s1; end; while length(s2)<32 do begin s2:='0'+s1; end; //s1存入文件 assignfile(f,'tmp'); rewrite(f); try write(f,s1); finally closefile(f); end; //文件内容读入strmSource strmSource:=TMemoryStream.Create; strmSource.loadfromfile('tmp'); //加到strmDest后面 strmDest.copyfrom(strmSource,strmSource.size); strmSource.clear; deletefile('tmp'); //s2存入文件 assignfile(f,'tmp'); rewrite(f); try write(f,s2); finally closefile(f); end; //文件内容读入strmSource strmSource:=TMemoryStream.Create; strmSource.loadfromfile('tmp'); //加到strmDest后面 strmDest.copyfrom(strmSource,strmSource.size); strmSource.free; deletefile('tmp'); end; 利用代码里的方法,便可将长度信息保存在D的最后了. 五.标准文件. 现在我想大家感到疑惑的就是标准文件S了,这到底是个什么玩意儿?怎么做它? 其实,我们在前面已经讲过了,"S首先从D的最后取得长度信息,然后根据这些长度 信息读出B和C,保存于硬盘上的某个目录. 然后调用ShellExecute执行他们".要注意这里的S和D是在一起的,S只不过是D的第一部分.他们的文件名是一样的了.于是就变成了S的功能是从它自身的后面取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目录.然后调用ShellExecute执行他们.我想,具体的方法我前面已经讲的很清楚了.只要记住长度信息是分别用32个 字节表示的就行了. 六.完整步骤 先编写S,然后编写A.再写一个程序E将S和A连接起来,S放在A的后面,成为A'.将A'发布给用户. 七.注意事项. 这个程序技巧性的确很强,但是我认为正常的人很少会用它.但对那些想散播病毒的人来说,却是一大利器.因此,我在这里要警告这部分人:制作或散发病毒是违反法律的,将受到法律允许范围内的 最高处罚.请好自为之。 而该程序的思路则有很巧妙的应用。你可以将DLL或其他需要的文件连接在你的程序后面.让你的程序运行时先解出这些文件。这样就能发布只有一个执行文件的程序了,比较方便,可以帮助VB程序员发布伪“绿色软件” 好了,就写到这里。有空我再写点经验出来。 谢谢大家赏脸看我的文章 呵呵,你说的思路和KINGRON的是一样的。但是如果我们需要把一个文件(假设这个文件是f1)捆绑在WINDOWS的SHELL文件Explorer.exe上,以便通过Explorer.exe的执行来运行我们的程序,那么如果按照你的思路就是把f1和Explorer.exe和f1合并成一个新文件,这个新文件名必须是Explorer.exe,这样WINDOWS启动SHELL的时候才会执行他,不过现在这个Explorer.exe已经不是原来那个Explorer.exe,所以WINDOS启动就会不正常。所以你上面说的这个方法虽然可以合并两个EXE文件,但是不是lt2000所需要的那种“如何将自已的EXE文件一运行就捆绑到另外一个EXE文件中去”。他需要的效果是把f1捆绑到Explorer.exe里,由Explorer.exe来执行f1,这个问题也困扰了我很久,我想如果要实现的话,肯定要设计到PE格式文件的改写!难度太大了。 TO :yypp():是倒也是,不过也还是很启发性,我以前就搞不懂为什么将两个可执行文件捆在一起形成一个可执行文件但运行时是运行两个程序,现在总算是搞明白了。也谢谢eaglesky(鹰长空) 同志的解答。 定义了个const类型可是超过了255个字符,怎么办? delphi 调用 C++写的DLL 的参数问题 "基础类“哪里去了? fastreport动态设计问题? 不明,点选 树状控件的结点的时候,如何取得这个节点的index? 高手,帮我解决这个问题好吧?非常感谢! 存储过程的问题求教! 大家幫忙看看,用delphi連接note庫,看看問題出在那裏。 不明白!?求救,我用纪录模拟C++中的远程结构体指针...(在线等) 如何压缩AVI ? ado连接问题? Delphi调用VB COM的问题
lovejingtao.126.com
文件合并器的制作方法
作者:王昊
从想到做文件合并器到现在已经有一个多月了,但是一直没有静下心来想它的实现方法. 昨天看数学看烦了, 我终于忍不住扔开了书,开始着手"文件合并器"的编制.3小时后,终于有了眉目,今天又改了一下.现在终于能够和 各位分享我的喜悦了.我愿意将我的方法写给大家,也希望各位高手不吝赐教.
先看看我们的目的:编写一个程序A,它能够将两个可执行程序B和C合并在一起,形成
一个新的可执行程序D. 要让用户执行D的时候,相当于同时运行B和C两个程序.
我的开发工具:我现在能够用VB和DELPHI中的任何一个开发这个软件.这次我用的是
DELPHI.如果你需要,也可以用VC或BCB来完成.
下面我用这三个小时中我考虑的东西为线索来讲讲主要的原理.
一. 我的疑惑.
将两个可以执行的程序合并在一起会变成什么东西?这是我的第一个疑惑.要解
决这个问题,首先要学会 如何将两个文件合并在一起.我想到了内存流(MemoryStream),它能极方便的完成这个步 骤.假设有两个可执行文件f1, f2.现在要把他们合并在一起.下面给出原代码.
var
strmSource,strmDest:TMemoryStream;
begin
//先读f1
strmSource:=TMemoryStream.Create;
strmSource.loadfromfile(f1);
//拷贝到strmdest
strmDest:=TMemoryStream.Create;
strmDest.copyfrom(strmSource,strmSource.size);
strmSource.clear;
//再读f1
strmSource.loadfromfile(f2);
//拷贝到strmdest
strmDest.seek(strmDest.size,soFromBeginning);
strmDest.copyfrom(strmSource,strmSource.size);
strmSource.free;
//这时strmDest里面便是两个文件合并后的内容了.将它保存为文件
strmDest.SaveToFile('dest.exe');
strmDest.free;
end;
我惊讶的发现,执行dest.exe就相当于执行f1!!为了确认,我将原代码中f1和f2的
读入顺序对调,得到的新的dest.exe执行竟然相当于执行f2!!(此处省略了N个感叹号).我又用同样的方法在f1
的后面添加很多无意义的字节,得到的新的f1运行竟然很正常.现在我们知道了,将两个或者多个可执行文件合并在 一起,得到的新文件执行时只是执行第一个文件.这是非常关键的一步.
二.如何分离?
合并没有问题了,如何分离呢?在知道原来的两个文件的大小的情况下,这很容易
作到.假设i1和i2是原来两个文件的大小(字节).合并后的文件是"dest.exe".
var
strmSource,strmDest:TMemoryStream;
Begin
//先读dest.exe
strmSource:=TMemoryStream.Create;
strmSource.loadfromfile('dest.exe');
//拷贝f1到strmdest
strmDest:=TMemoryStream.Create;
strmDest.copyfrom(strmSource,i1);
//保存f1
strmDest.SaveToFile(f1);
strmDest.clear;
//拷贝f2到strmdest
strmSource.seek(i1,soFromBeginning); strmDest.copyfrom(strmSource,i2);
strmDest.SaveToFile(f2);
strmDest.free;
strmSource.free;
end;
三.总体思路.
在解决了上述问题后,我的总体思路就出来了.假设我给用户的程序是A,它能把
B和C合并起来得到D.那么D具有什么特征呢?D应该至少由三个部分组成(请注意是"至少"):第一部分是一个可
执行的程序,我把它叫做 标准程序S,他能将D的第二部分和第三部分(就是原来的可执行文件B和C)读出来,保存在磁盘上,然后执行他们.但大家看了"如何分离"后应该知道,只有我们知道了B和C的长度时,才能方便的从D中读出他们.而为了使D可以在另一个用户的机子上也能够运行,我认为B和C的长度信息应该保存在D的最后.于是,D应该具有四个部分:
1: S
2: B
3: C
4: 长度信息
那么,既然我给用户的程序是A,那么这里的标准程序S又从何而来呢?标准程序S又应该保存在哪里呢?
有两个办法.第一,给用户的程序包含两个文件,一个是A,一个是S.但我觉得这样不够 爽.于是我用了另一个方法: 将S连在A的后面,成为A'.
于是乎,当用户执行A'时,A'要求用户选择两个可执行文件B和C.当用户点击确定时,
A'将它自身所带的S与B和C合并起来,形成D.然后,用户便可以执行D了,这时的D并不依赖于A'.D执行时,实际上执行的是它的第一部分S,S首先从D的最后取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目
录.然后调用ShellExecute执行他们.这样就达到了我们的目的.
那么,长度信息如何定义呢?如何将S连在A的后面呢?S如何完成自身的功能呢?这就是
我下面要讲的.
四.保存长度信息.
我先讲一讲如何把一个字符串写入内存流.其实我自己也不知道如何直接将一个
字符串的内容读到内存流中,于是我采取了先将字符串内容写入一个临时文件中,然后用loadformfile将文件内容读入内存流中.
然而,我们必须知道连接在D后面的长度信息的具体长度,也就是说用几个字节保
存,才能让S读出长度信息.我考虑再三,决定用32个字节来表示每个文件的长度,虽然大多数情况下,文件大小不会超出100M.
看看这里的代码:
var
strmSource,strmDest:TMemoryStream;
s1,s2:string;
f:TextFile;
begin
//先用上面的方法将S和B与C的内容写入strmdest,现在要在strmDest里面添 加长度信息
//假设s1,s2里放有B和C的大小,先把他们变为32个字节.
while length(s1)<32 do
begin
s1:='0'+s1;
end;
while length(s2)<32 do
begin
s2:='0'+s1;
end;
//s1存入文件
assignfile(f,'tmp');
rewrite(f);
try
write(f,s1);
finally
closefile(f);
end;
//文件内容读入strmSource
strmSource:=TMemoryStream.Create;
strmSource.loadfromfile('tmp');
//加到strmDest后面
strmDest.copyfrom(strmSource,strmSource.size);
strmSource.clear; deletefile('tmp');
//s2存入文件
assignfile(f,'tmp');
rewrite(f);
try
write(f,s2);
finally
closefile(f);
end;
//文件内容读入strmSource
strmSource:=TMemoryStream.Create;
strmSource.loadfromfile('tmp');
//加到strmDest后面
strmDest.copyfrom(strmSource,strmSource.size);
strmSource.free;
deletefile('tmp');
end;
利用代码里的方法,便可将长度信息保存在D的最后了.
五.标准文件.
现在我想大家感到疑惑的就是标准文件S了,这到底是个什么玩意儿?怎么做它?
其实,我们在前面已经讲过了,"S首先从D的最后取得长度信息,然后根据这些长度
信息读出B和C,保存于硬盘上的某个目录. 然后调用ShellExecute执行他们".要注意这里的S和D是在一起的,S只不过是D的第一部分.他们的文件名是一样的了.于是就变成了S的功能是从它自身的后面取得长度信息,然后根据这些长度信息读出B和C,保存于硬盘上的某个目录.然后调用ShellExecute执行他们.我想,具体的方法我前面已经讲的很清楚了.只要记住长度信息是分别用32个
字节表示的就行了.
六.完整步骤
先编写S,然后编写A.再写一个程序E将S和A连接起来,S放在A的后面,成为A'.将A'发布给用户.
七.注意事项.
这个程序技巧性的确很强,但是我认为正常的人很少会用它.但对那些想散播病毒的人来说,却是一大利器.因此,我在这里要警告这部分人:制作或散发病毒是违反法律的,将受到法律允许范围内的
最高处罚.请好自为之。
而该程序的思路则有很巧妙的应用。你可以将DLL或其他需要的文件连接在你的程序后面.让你的程序运行时先解出这些文件。这样就能发布只有一个执行文件的程序了,比较方便,可以帮助VB程序员发布伪“绿色软件”
好了,就写到这里。有空我再写点经验出来。
谢谢大家赏脸看我的文章
如果我们需要把一个文件(假设这个文件是f1)捆绑在WINDOWS的SHELL文件Explorer.exe上,以便通过Explorer.exe的执行来运行我们的程序,那么如果按照你的思路就是把f1和Explorer.exe和f1合并成一个新文件,这个新文件名必须是Explorer.exe,这样WINDOWS启动SHELL的时候才会执行他,不过现在这个Explorer.exe已经不是原来那个Explorer.exe,所以WINDOS启动就会不正常。所以你上面说的这个方法虽然可以合并两个EXE文件,但是不是lt2000所需要的那种“如何将自已的EXE文件一运行就捆绑到另外一个EXE文件中去”。
他需要的效果是把f1捆绑到Explorer.exe里,由Explorer.exe来执行f1,这个问题也困扰了我很久,我想如果要实现的话,肯定要设计到PE格式文件的改写!难度太大了。
是倒也是,不过也还是很启发性,我以前就搞不懂为什么将两个可执行文件捆在一起形成一个可执行文件但运行时是运行两个程序,现在总算是搞明白了。也谢谢eaglesky(鹰长空) 同志的解答。