如何用exe文件来生成exe文件

时间:2021-01-23 09:14:07
我现在正在想做一个单文件纯绿色并且不写注册表的小软件,但是想提供用户自定义的功能。我想做到不能写注册表不能写新文件,所以想到在用户自定义后把这个exe文件自身和用户自定义数据一起生成一个新的exe文件来取代原文件的办法来实现。我看到有不少软件有生成exe文件的功能阿,比如DeepFreeze Enterprize就可以生成对应客户端,我要的就是这种效果
希望大家帮忙想想办法哦

52 个解决方案

#1


跑到这里发帖了

#2


自己debug

#3


抱歉哦,我没有看清楚,本来准备在VB区发帖子的,结果发到VBScript了,sorry

#4


举列:
1.exe 执行后
生成2.tmp
在1.exe中执行2.tmp +参数(用户自定义数据) 并结束自己(1.exe)
2.tmp 把 得到的参数写入 1.exe(中间还是结尾看你需求了)
完全不生成新文件的好像比较麻烦

#5


不是啊,楼上的理解了我的意思,但是没有理解我的疑问在哪里

我的问题在于:因为exe文件是二进制文件,我们怎样把自定义数据放进新生成的exe文件,这个不像文本文件或者脚本文件一样可以直接写进去,也就是说按道理exe文件的内容对于我们来说是混沌一片,要改变它的内容除非拥有源代码修改之后重新编译,显然客户端又没有编译exe文件的环境

#6


把需要的数据追加到exe文件末尾就好了

#7


比如说你要把1个数组 a(100) as byte的 数据放到1.exe文件的末尾
这样做一般情况并不影响程序的执行,假设你的原始exe文件长度是20K即20480
'存数据
dim a(100) as byte,olof as long
olof=20480
open "e:\1.exe" for binary as #1
put #1,olof+1,a
close #1
'取数据
open "e:\1.exe" for binary as #1
get #1,olof+1,a
close #1

#8


呵呵,我的意思终于被理解了,我的表述能力不好哦
这样也可以?也就是说同一个文件既可以把它作为可执行程序来执行也可以把它作为数据来读写,而且没有影响?
那些数据追加到末尾对于可执行文件来说没有任何影响?
不过我想这个还是实现不了啊,因为在程序编译之前我们是不知道它的大小的
那么我们就不可能在写源代码时候就写进去编译(以及加壳)之后文件的大小啊?

#9


那加个标志好了 假设以 "eNd" 作为结尾
如果读取后不是这个字符说明还没有被写入特别数据

#10


文件大小可以运行的时候动态取得的吧

#11


程序编译之前我们是不知道它的大小的
==================================
虽然不知道编译exe的大小,但是知道附加数据的大小,还可以用FileLen得到合并后的"exe+附加数据"的大小.

#12


可以把另一个程序放进资源文件中,程序运行时,从资源文件读取并写成一临时文件,再用shell命令执行,程序关闭时顺便删除生成的临时文件

#13


虽然写 exe 是可以实现,但是为什么不单独写个配置文件呢?
写文件总是能被监视的,尤其写 exe 更是被反病毒程序监控,某些反病毒程序发现写 exe 会出对话框提问,何苦自找麻烦。
如果考虑安装卸载程序需要不增加新文件,可以将默认配置文件一起打包。

#14


是这样的,对于这个小程序有三个角色
第一方是编写者,也就是我,给第二方提供实用配置工具A,给第三方提供程序B(也就是我现在讨论的程序)
第二方利用实用配置工具A生成数据文件,将其写入到程序B中,得到一个配置好了的程序
第三方是用户,他直接获取配置好了的程序来使用

其目的就是为了第三方能得到最简易的使用体验,所以不应该弄好多配置文件喧宾夺主,写exe文件的操作是由第二方进行的,第三方几乎是不进行任何配置的

不知道这样解释是否足够明白,谁能帮忙解决这个问题呢?

#15


那么 ayalicer 的方法就可以了。
至于文件位的问题,可以取一个足够大的固定值。比如 B.exe 的大小为十几K,那么就将数据固定写在20K处,这样 B.exe 大小少量变化就无影响。

#16


也就是说估计这个大小?
那这样预计和现实之间相差的部分不就浪费了?
要是能紧密的连接,程序就可以更小啊
By The Way那个WinRAR的自解压程序是什么原理?
它能够把程序(也就是解压缩界面以及引擎)和数据结合为一体并且可执行啊

#17


要不浪费也行,将数据起始位置定义成一个常量,随便设一个值,编译成 exe,然后根据 exe 的大小更改常量值,再次编译 exe。
由于没有变动程序逻辑,所以两次 exe 的大小应该是一样的,以后都这么做,唯一麻烦的就是改一次程序要编译两次。

#18


顶11楼的
虽然不知道源文件的大小,但是知道新增数据的大小,把新增数据写入文件后面,然后在最后面写入一个固定长度的整数值(即文件大小),比如写入一个Long型,到时候从后往前读取一个long型的长度就可以了。然后再往前读long数据所表示的长度就是信息长度。就读出来了

#19


制作一个安装程序,把你的程序及控件都包含在资源文件中并在运行时将其释放出来,完成如下:
1、生成EXE文件(你的程序)
2、生成所需控件并注册。

此程序只用VB基本控件。

#20


18楼的有点道理
19楼几乎没有看我究竟要做什么,要是这个小程序还要这么费力的去安装它
那它本身就没有存在的意义了,它本身就是为了简化用户的操作的

#21


由于你要做那所谓的"绿色软件",那么你的那些信息也只能是使用这个EXE来作为载体了

现在的办法就是写在文件尾

我前段时间写了一个简单的下载者,不知道你是不是要的那种东西?

#22


五年前就经常研究的问题,现在发现这个问题实在太无聊.

#23


ding

#24


回复21楼
信息只能以exe文件为载体那是当然,我一提出这个问题就确定了这个观点,关键在于怎样放
flash不是有个把swf文件和flash player组合成一个exe文件方便用户使用吗?
就有点类似这个事情,把程序体和数据合到一块方便用户使用

#25


放个MAIL...

我实在没有找到哪里能上传附件-_-b

发给你算了

#26


我的邮箱owen1759(at)sina(dot)com
谢谢

#27


我以前的程序配置信息就是存在自身的EXE文件中,后来我换了个双核的CPU电脑发现,EXE的编码好象与以前的不一样了,我是把代码存在EXE的最后,结果发生写入信息的位置不准确,读也发生错误,就暂不用这个功能了,继续关注中...

#28


你直接说想用VB写个木马生成器不就完了嘛

#29


最简单的方法!!

用资源文件!!!!!!!!

微软提供了一系列的资源更新API函数!!!


给你个思路:

程序A为主程序,程序B为生成的程序,程序B必须预先留有几个空字符的字符类型资源,方便资源更新
程序B作为程序A的二进制资源

当用户运行程序A并设置好后,把程序A里面的程序B读取出来(别告诉我连这么简单的二进制资源读写都不会)
再利用LoadLibrary来读程序B,用FindResource来查找资源位置(根据资源类型和资源ID)
接着用LoadResource把资源读到变量或者内存中,把改变后的变量或内存用UpdateResource来更新
最后用FreeLibrary来释放程序B。

然后用Shell运行程序B,退出程序A!!


大概思路就这样,至于如何更新资源文件的话,自己上网找找,代码挺长的,没心机写!

#30


谢谢楼上的,这个办法看起来不错哦,虽然我对Windows API还不够了解

#31


最近也在研究这个,一起关注

#32


可能要研究有关EXE的文件结构,文件的大小等信息在EXE的文件头里都可以读取

看能不能把所有的配置参数声明成常量在程中占用一定的长度存放在数据段。编译后找出他们的地址

然后在生成新的EXE时其它部分照样COPY,只是根据新的配置值改写那样变量的位置。

#33


是像32楼那样说的实现的
但是不知道怎么写

#34


当一个a.exe被调入内存中时,文件开头地址可以加上跳转指令

jmp xxx

'这里为配置信息,固定长度字节数

xxx:
a.exe 文件开始执行的代码

....



a.exe可读取jmp xxx后面固定字节为作为配置信息。

按你说的第二方使用配置修改程序,如b.exe,来修改a.exe的配置信息,只要修改a.exe文件的配置信息段即可。

同理,也可以把b.exe合在a.EXE文件中,对其本身进行修改


#35


owen1759:

邮件已发,请查收!

抱歉这么久才发!

#36


谢谢,我看看哈

#37


35楼,能不能也发我一份?
谢谢

hellomh@21cn.com

#38


同求35楼的给一份 jerrell@21cn.com

#39


34楼的案例
http://www.arctechweld.com/1/示例.rar

"a.exe"为要进行配置的程序,有3个常数lvwStr1,lvwStr2,lvwStr3,a.exe运行时可调用这些常数

"写配置文件.exe"是对a.exe文件内的3个常数进行修改

#40


楼上的这位兄台,能发源代码吗

#41


案例
http://www.arctechweld.com/1/示例.rar
的源代码上传到CSDN里头, 下载地址还没出来

#42


楼主想做生成器,呵呵!

#43


案例 
http://www.arctechweld.com/1/示例.rar 

源代码
写Exe文件内常量值的案例源代码下载地址
http://d.download.csdn.net/filedown/aHR0cDovL2RsMi5jc2RuLm5ldC9kb3duNC8yMDA3MTExMS8xMTIyMzYwOTkzNi5yYXI=!282947

#44


楼上请去
http://topic.csdn.net/u/20071110/14/9795a581-436e-4688-a71b-e20841447152.html
回帖,我结贴给分

不过能不能再请教一下,a文件,就是那个被写有时是很大的,这样去找他的地址很麻烦,有什么好办法吗

#45


晕倒,貌似忘了发附件???

现在在外面出X,等回去后就补发....

抱歉抱歉....-_____-#

#46


现在就是不知道怎么才能快速的找到这个地址偏移量

#47


1.写程序的时候,先要给需修改的常量赋个值,最好是唯一性比较强的一串字母和数字组合,查找地址时容易找到

2.使用一些找偏移地址的软件查找出地址,如soft-ice,WinHex等,用unicode方式找出地址.

3.找出的地址需要+1,因为偏移是从0开始的

#48


经楼上的一说,自己试验了一会,明白了 

#49


owen1759@sina.com 
hellomh@21cn.com
jerrell@21cn.com 

已发~~~~请查收~~~

#50


47搂没看帖子
你无法要求配置者去安装并掌握这些软件,因为不是我自己配置的,那样的程序太没有广泛适用性了

#1


跑到这里发帖了

#2


自己debug

#3


抱歉哦,我没有看清楚,本来准备在VB区发帖子的,结果发到VBScript了,sorry

#4


举列:
1.exe 执行后
生成2.tmp
在1.exe中执行2.tmp +参数(用户自定义数据) 并结束自己(1.exe)
2.tmp 把 得到的参数写入 1.exe(中间还是结尾看你需求了)
完全不生成新文件的好像比较麻烦

#5


不是啊,楼上的理解了我的意思,但是没有理解我的疑问在哪里

我的问题在于:因为exe文件是二进制文件,我们怎样把自定义数据放进新生成的exe文件,这个不像文本文件或者脚本文件一样可以直接写进去,也就是说按道理exe文件的内容对于我们来说是混沌一片,要改变它的内容除非拥有源代码修改之后重新编译,显然客户端又没有编译exe文件的环境

#6


把需要的数据追加到exe文件末尾就好了

#7


比如说你要把1个数组 a(100) as byte的 数据放到1.exe文件的末尾
这样做一般情况并不影响程序的执行,假设你的原始exe文件长度是20K即20480
'存数据
dim a(100) as byte,olof as long
olof=20480
open "e:\1.exe" for binary as #1
put #1,olof+1,a
close #1
'取数据
open "e:\1.exe" for binary as #1
get #1,olof+1,a
close #1

#8


呵呵,我的意思终于被理解了,我的表述能力不好哦
这样也可以?也就是说同一个文件既可以把它作为可执行程序来执行也可以把它作为数据来读写,而且没有影响?
那些数据追加到末尾对于可执行文件来说没有任何影响?
不过我想这个还是实现不了啊,因为在程序编译之前我们是不知道它的大小的
那么我们就不可能在写源代码时候就写进去编译(以及加壳)之后文件的大小啊?

#9


那加个标志好了 假设以 "eNd" 作为结尾
如果读取后不是这个字符说明还没有被写入特别数据

#10


文件大小可以运行的时候动态取得的吧

#11


程序编译之前我们是不知道它的大小的
==================================
虽然不知道编译exe的大小,但是知道附加数据的大小,还可以用FileLen得到合并后的"exe+附加数据"的大小.

#12


可以把另一个程序放进资源文件中,程序运行时,从资源文件读取并写成一临时文件,再用shell命令执行,程序关闭时顺便删除生成的临时文件

#13


虽然写 exe 是可以实现,但是为什么不单独写个配置文件呢?
写文件总是能被监视的,尤其写 exe 更是被反病毒程序监控,某些反病毒程序发现写 exe 会出对话框提问,何苦自找麻烦。
如果考虑安装卸载程序需要不增加新文件,可以将默认配置文件一起打包。

#14


是这样的,对于这个小程序有三个角色
第一方是编写者,也就是我,给第二方提供实用配置工具A,给第三方提供程序B(也就是我现在讨论的程序)
第二方利用实用配置工具A生成数据文件,将其写入到程序B中,得到一个配置好了的程序
第三方是用户,他直接获取配置好了的程序来使用

其目的就是为了第三方能得到最简易的使用体验,所以不应该弄好多配置文件喧宾夺主,写exe文件的操作是由第二方进行的,第三方几乎是不进行任何配置的

不知道这样解释是否足够明白,谁能帮忙解决这个问题呢?

#15


那么 ayalicer 的方法就可以了。
至于文件位的问题,可以取一个足够大的固定值。比如 B.exe 的大小为十几K,那么就将数据固定写在20K处,这样 B.exe 大小少量变化就无影响。

#16


也就是说估计这个大小?
那这样预计和现实之间相差的部分不就浪费了?
要是能紧密的连接,程序就可以更小啊
By The Way那个WinRAR的自解压程序是什么原理?
它能够把程序(也就是解压缩界面以及引擎)和数据结合为一体并且可执行啊

#17


要不浪费也行,将数据起始位置定义成一个常量,随便设一个值,编译成 exe,然后根据 exe 的大小更改常量值,再次编译 exe。
由于没有变动程序逻辑,所以两次 exe 的大小应该是一样的,以后都这么做,唯一麻烦的就是改一次程序要编译两次。

#18


顶11楼的
虽然不知道源文件的大小,但是知道新增数据的大小,把新增数据写入文件后面,然后在最后面写入一个固定长度的整数值(即文件大小),比如写入一个Long型,到时候从后往前读取一个long型的长度就可以了。然后再往前读long数据所表示的长度就是信息长度。就读出来了

#19


制作一个安装程序,把你的程序及控件都包含在资源文件中并在运行时将其释放出来,完成如下:
1、生成EXE文件(你的程序)
2、生成所需控件并注册。

此程序只用VB基本控件。

#20


18楼的有点道理
19楼几乎没有看我究竟要做什么,要是这个小程序还要这么费力的去安装它
那它本身就没有存在的意义了,它本身就是为了简化用户的操作的

#21


由于你要做那所谓的"绿色软件",那么你的那些信息也只能是使用这个EXE来作为载体了

现在的办法就是写在文件尾

我前段时间写了一个简单的下载者,不知道你是不是要的那种东西?

#22


五年前就经常研究的问题,现在发现这个问题实在太无聊.

#23


ding

#24


回复21楼
信息只能以exe文件为载体那是当然,我一提出这个问题就确定了这个观点,关键在于怎样放
flash不是有个把swf文件和flash player组合成一个exe文件方便用户使用吗?
就有点类似这个事情,把程序体和数据合到一块方便用户使用

#25


放个MAIL...

我实在没有找到哪里能上传附件-_-b

发给你算了

#26


我的邮箱owen1759(at)sina(dot)com
谢谢

#27


我以前的程序配置信息就是存在自身的EXE文件中,后来我换了个双核的CPU电脑发现,EXE的编码好象与以前的不一样了,我是把代码存在EXE的最后,结果发生写入信息的位置不准确,读也发生错误,就暂不用这个功能了,继续关注中...

#28


你直接说想用VB写个木马生成器不就完了嘛

#29


最简单的方法!!

用资源文件!!!!!!!!

微软提供了一系列的资源更新API函数!!!


给你个思路:

程序A为主程序,程序B为生成的程序,程序B必须预先留有几个空字符的字符类型资源,方便资源更新
程序B作为程序A的二进制资源

当用户运行程序A并设置好后,把程序A里面的程序B读取出来(别告诉我连这么简单的二进制资源读写都不会)
再利用LoadLibrary来读程序B,用FindResource来查找资源位置(根据资源类型和资源ID)
接着用LoadResource把资源读到变量或者内存中,把改变后的变量或内存用UpdateResource来更新
最后用FreeLibrary来释放程序B。

然后用Shell运行程序B,退出程序A!!


大概思路就这样,至于如何更新资源文件的话,自己上网找找,代码挺长的,没心机写!

#30


谢谢楼上的,这个办法看起来不错哦,虽然我对Windows API还不够了解

#31


最近也在研究这个,一起关注

#32


可能要研究有关EXE的文件结构,文件的大小等信息在EXE的文件头里都可以读取

看能不能把所有的配置参数声明成常量在程中占用一定的长度存放在数据段。编译后找出他们的地址

然后在生成新的EXE时其它部分照样COPY,只是根据新的配置值改写那样变量的位置。

#33


是像32楼那样说的实现的
但是不知道怎么写

#34


当一个a.exe被调入内存中时,文件开头地址可以加上跳转指令

jmp xxx

'这里为配置信息,固定长度字节数

xxx:
a.exe 文件开始执行的代码

....



a.exe可读取jmp xxx后面固定字节为作为配置信息。

按你说的第二方使用配置修改程序,如b.exe,来修改a.exe的配置信息,只要修改a.exe文件的配置信息段即可。

同理,也可以把b.exe合在a.EXE文件中,对其本身进行修改


#35


owen1759:

邮件已发,请查收!

抱歉这么久才发!

#36


谢谢,我看看哈

#37


35楼,能不能也发我一份?
谢谢

hellomh@21cn.com

#38


同求35楼的给一份 jerrell@21cn.com

#39


34楼的案例
http://www.arctechweld.com/1/示例.rar

"a.exe"为要进行配置的程序,有3个常数lvwStr1,lvwStr2,lvwStr3,a.exe运行时可调用这些常数

"写配置文件.exe"是对a.exe文件内的3个常数进行修改

#40


楼上的这位兄台,能发源代码吗

#41


案例
http://www.arctechweld.com/1/示例.rar
的源代码上传到CSDN里头, 下载地址还没出来

#42


楼主想做生成器,呵呵!

#43


案例 
http://www.arctechweld.com/1/示例.rar 

源代码
写Exe文件内常量值的案例源代码下载地址
http://d.download.csdn.net/filedown/aHR0cDovL2RsMi5jc2RuLm5ldC9kb3duNC8yMDA3MTExMS8xMTIyMzYwOTkzNi5yYXI=!282947

#44


楼上请去
http://topic.csdn.net/u/20071110/14/9795a581-436e-4688-a71b-e20841447152.html
回帖,我结贴给分

不过能不能再请教一下,a文件,就是那个被写有时是很大的,这样去找他的地址很麻烦,有什么好办法吗

#45


晕倒,貌似忘了发附件???

现在在外面出X,等回去后就补发....

抱歉抱歉....-_____-#

#46


现在就是不知道怎么才能快速的找到这个地址偏移量

#47


1.写程序的时候,先要给需修改的常量赋个值,最好是唯一性比较强的一串字母和数字组合,查找地址时容易找到

2.使用一些找偏移地址的软件查找出地址,如soft-ice,WinHex等,用unicode方式找出地址.

3.找出的地址需要+1,因为偏移是从0开始的

#48


经楼上的一说,自己试验了一会,明白了 

#49


owen1759@sina.com 
hellomh@21cn.com
jerrell@21cn.com 

已发~~~~请查收~~~

#50


47搂没看帖子
你无法要求配置者去安装并掌握这些软件,因为不是我自己配置的,那样的程序太没有广泛适用性了