ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论]关于VBA与VBS及word文档隐藏与自已删除自己的杂谈

[复制链接]

TA的精华主题

TA的得分主题

发表于 2004-9-29 01:15 | 显示全部楼层 |阅读模式

守柔,你好,中秋快乐!

来信收到,我与你一样遇到了这个问题,最后虽然解决了,但我觉得实用的价值不大,没有意义。

下面我先附我用VBA做的例子,从原理上讲与你做的那个基本没有什么区别。我是先将原文处理成字符串,然后赋值给一个变量,这个变量放在VBA中(也就是说原文不可见),如果不启用宏,则页面上显示的是一些其他的东东,如果启用了宏,则用该变量的值替换掉页面的原文。我的目的是迫使读文者必须启用宏,才能读到应该读的正文,也正因为他启用了宏,所以我可以在指定的时间内删除正在读的这篇文章或是利用读文者关闭Word的事件,删除文章本身。

解下包后是两个文件,两个文件都请先用禁用宏打开,然后再用启用宏打开,以比较基不同。

sXPypSi9.rar (18.39 KB, 下载次数: 122)

做虽然是做得不错,但的确存在你说的那个问题——在VBS中,什么都是“透明”的

很过了一段时间,我才知道解决方法,但我觉得实际用处不大,简单叙述如下——

1、到微软去下载“Encoder”(专门对脚本进行加密的程序,比如“欢乐时光”病毒,为什么我们看到的时候是“乱码”?) 2、在命令行中用“screnc ”进行加密处理。 3、或是直接编写一个函数,将文档转为十六进制码,然后每个字加或减N,然后将文件整体的内容提交给函数进行转化。读文时,再用另一个函数将十六进制码反转减或加N,读出即可。

觉得用处不大的原因很简单——无论采用上面说的哪种方法,都只是对那些怕麻烦的人而言,是“保密”的,对于“愿意动脑筋”的人而言,这些文章无论你怎么加密,其实都是“透明”的——我就自己对“新欢乐时光、VBS·KJ”等脚本进行过反加密,基本不须费力就可以直接读出。。

不知你还记得否,曾经我们讨论关于加密的问题时,我说过——不管你怎么加密,都是防君子的——随你怎么加,我找一个支持十六进制的编辑工具来打开,可以轻易“修改或删除”你加的密码、就算你对文章代码进行了处理,一样可以进行破解!只是花的时间的多少而已。像现在网上破解Office文档密码的工具一样,因为你的密码必须“跟”着文档走,就说明密码是保存在文档编码的某个位置的,这个位置必然是有标记的(否则程序自己怎么去找它?)只要我知道了这个标记,我根本不会去搞什么“暴力破解”,而是直接就可以读出你的密码——文档的秘密如何保证?(我这里讲的这个东东,是最近有我发现的,网上已有了利用这个办法直接"清空"Office中Word/excel/access密码的东东。)

从上面所述的角度看,VBS能“直接”读在VBA中加了密的文档,是毫不奇怪的。我想,没有什么必要去找一个“绝对安全”的文档保存办法。 ========================================= 我认为VBS之所以可以读出VBA中的东东,而VBA读不出VBS中的东东,这跟微软的设计是完全相关的——

VBE是一个开放的体系,我们在VBE中编写VBA代码,请注意:VBE本身也可以利用VBA语句进行控制的!这是为了方便像C或VB等语言调用Office组件,但问题出来了——VBS也是一种语言,它也可以调用VBE的对象从而实现VBA中的一些相对较高级的功能。但Office中给出的"脚本编辑器"却不像VBE体系那样是开放的,你VBA语言是无法访问脚本编辑器的环境的,仅这一点,我觉得VBS在定位上肯定是比VBA适应适用性要广得多!所以VBS能读出VBA中加了密的东东,并不是一件奇怪的事。

========================================= 对你所说的的两个问题我是这样认识的—— 你谈到:一是关于vbscript工程保护的问题,按说,VBA工程可以保护,那么此脚本工程也可以保护,但不知是否有,有又如何保护;如果没有,又如何处理此类情况? 我见到的VBS脚本,几乎没有遇到过有“保护”过的,包括一些能实现高级功能的在内。有保护,如我前面所说——几乎百分之百可以肯定是像“欢乐时光”那样的病毒! 在Web中的VBS到是有保护起来的,那是为了怕代码泄密从而引起整个网站的安全性问题、或是为了保护某些作品的版权而为之的。最常见的就是有些网页禁止了我们的左右键。

但也正如我前面所说——这种程度的“加密与保护”基本就是摆设,要解迷实在太容易了。

你谈到的第二点:“WORD中对于保护文档一功能,纯粹是掩人耳目之事。”我完全同意!原因也是前面所说的——无论你怎么保护,都是只能防君子,不能防那些有耐心的人。从技术上讲,“完全的”加密保护,也是不可能的——“有矛就有盾,哲学不允许存在‘绝对’的东西。”

[此贴子已经被作者于2004-9-29 1:34:57编辑过]

TA的精华主题

TA的得分主题

发表于 2004-9-29 05:23 | 显示全部楼层

谢谢七兄,你的回答,我非常满意,某种意义上说有如醍醐灌顶、茅塞顿开之感。从你的回答中,我解读到以下信息,包括在这期间我的一些思考:

一:对于先低后高者,一切都好解决。我们可以采取禁用此VBS(Sub MicrosoftScriptEditor()

End Sub),在本文档或者在全局模块中;如果在全局模块中,要用到VBPROJECT中的一些代码,写入全局模板中,这是件容易的事情。

二:对于高者,则其代价为看不到真实的内容,但如果打开VBS的话,某些信息还是可见的,如我的作品和你的作品之一。

三:对于高手,一切都是徒劳!并再一次折服七兄对于病毒编码的反编译,我是望尘莫及的,自知之明还是有的。初一看,信息部:七叶一枝梅,还以为是国家信息安全部(主要是佩服七兄的功夫),搞笑了。

四:可以对原文进行函数加减码,如果不启用宏,则无法看到真实内容;只有启用宏,再在OPEN事件中触发这个函数工作,还原,才能看到真实内容,从这个意义上讲,此法最为科学,我以为,我们应该尽量不借用WORD以外的工具,当然有时会有借用OFFICE以内的程序,当然这象你说的还有MICROSOFT的一些工具,不管怎样,个中区别无论长短,但我还是立足于WORD,面向OFFICE,脱离外来工具(个人看法)。也就是我们达到了我们的目的和宗旨,如果取消宏,你不会有所收获,启用宏,你可以随意操纵;但关闭前,对你的修改结果,还得加减码处理;(这个问题,先前我从未考虑过!)

五:回过头来,看一下第一个问题中的情况,首先,我们不能对用户有过多期望,希望他们的宏安全性为低或者运行宏,如此,我们的控制权会削弱;还有对于VBE中VBPROJECT的修改与操作,很多杀毒软件对此特别过敏,下手决不留情,真病毒有时倒是睁一只眼,闭一只眼;另外,对于全局模板的修改,有些过分“病毒化”,一般用户可能不会容易受,但这是一种思路,一种很好的思路。

六:再说高手,删除NORMAL,或者对NORMAL工程有密码,已经不行了。

七:骂一下MICROSOFT,也觉得心里头好过一些(我是不是特傻蛋?)。你的WORD的文档保护竟然如此掩人耳目,简直不可理喻;而对于EXCEL,偏心多了,一个工作表有保护,整个工作薄中的VBS编辑器皆不可用;

不当处,请七兄指正!

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-9-30 21:56 | 显示全部楼层

守柔:

可能有一点我没有说清楚(你看我楼上贴子的时间就看得出来是半夜回的,没说清楚。)——

如你所说,我也是尽力希望立足于Office之内!!我上面的贴子并没有跳到Office外去,我没有说清楚的地方是“Encoder”与“screnc ”,其实这两个东东都在脚本编辑器中,并没有脱离Office,你在脚本编辑器的帮助文件中分别以这两个词为关键词进行搜索,可以找到加密的详细说明。

这是说,如果利用这个方法进行加密,Office并没有让我们失望,也就是我说的“可以”完成加密的任务,但缺少实用价值。

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-9-30 23:31 | 显示全部楼层

可能有些朋友没有这两个帮助文件(上一次讨论VBS时,建议朋友们下一个的,实际上在“脚本编辑器”中本文也有,但稍简单了点。),我把它复制在下面了,没有的朋友看一下—— 微软帮助文件——Windows Script V5.6 文档 -------------------------------------- 脚本 Encoder 语法 请参阅 脚本 Encoder 概述 | 使用脚本 Encoder | 脚本编码示例 对脚本源代码进行编码,以便使用户难以查看或修改源代码。

语法 SCRENC [/f] [/xl] [/l defLanguage ] [/e defExtension] 输入文件 输出文件

脚本 Encoder 语法有以下几个组成部分:

组成部分 说明 /s 可选。此开关用于指定脚本 Encoder 在无提示方式下工作,也就是说,不生成任何屏幕输出。如果省略该开关,则默认情况是提供详细的输出。 /f 可选。指定输入文件将要由输出文件覆盖。注意,该选项会破坏原来的输入源文件。如果省略该开关,将不会覆盖输入文件。 /xl 可选。指定不将 @language 指令添加到 .ASP 文件的顶端。如果省略该开关,就会将 @language 指令添加到所有的 .ASP 文件中。 /l defLanguage 可选。指定要在编码期间使用的默认脚本语言(JScript? 或 VBScript)。如果进行编码的文件内的脚本块不包含任何语言属性,则假定这些脚本块采用该指定语言。如果省略该开关,Jscript 就是 HTML 页和脚本小程序的默认语言,而 VBScript 是 Active Server Page 的默认语言。对于纯文本文件来说,默认脚本语言由文件扩展名(.js 或 .vbs)来确定。 /e defExtension 可选。使输入文件与特定的文件类型相关联。如果不能从输入文件的扩展名中明显知道文件类型(即输入文件的扩展名不是一个可识别的扩展名),但文件内容确实属于可识别的类型,则使用该开关。该选项没有默认设置。如果文件的扩展名不可识别,并且未指定该选项,脚本 Encoder 就会因该文件不可识别而失败。可识别的文件扩展名有:.asa、.asp、.cdx、.htm、.html、.js、.sct 和 .vbs。 inputfile 必需。要进行编码的输入文件名,包括任何与当前目录相关的必需路径信息。 outputfile 必需。要生成的输出文件名,包括任何与当前目录相关的必需路径信息。

说明 脚本 Encoder 可处理四种类型的文件,它们是:

ASP。这种格式由一个文本 Active Server Page 组成,该页包含有效的 HTML 以及 <SCRIPT> ... </SCRIPT> 标记或 <% ... %> 标记中的嵌入脚本块。使用这种格式的应用程序包括 Microsoft? Internet Information 服务 (IIS)。可识别的文件扩展名有 .asp、.asa 和 .cdx。 HTML。这种格式由一个文本文件组成,该文件包含有效的 HTML 和嵌入脚本块。使用这种脚本格式的应用程序包括 Microsoft FrontPage?、Microsoft? Visual InterDev? 和几乎所有的 Web 设计器和浏览器。可识别的文件扩展名有 .htm 和 .html。 纯文本。这种格式由一个文本文件组成,该文件只包含周围没有标记的脚本。使用这种脚本格式的应用程序包括 Windows? Scripting Host (WSH) 和 Microsoft? Outlook?。可识别的文件扩展名有 .js 和 .vbs,它们在编码后分别变为 .jse 和 .vbe。 脚本小程序。这种格式由一个文本文件组成,该文件内的 <SCRIPT> ... </SCRIPT> 标记中包含有效的脚本小程序代码。可识别的文件扩展名有 .sct 和 .wsh。 示例 下面的示例将介绍脚本 Encoder 的用法并简要说明生成的结果:

要对输入文件 test.html 进行编码,并生成输出文件 encode.html,请使用:

screnc test.html encode.html 要对输入文件 test.html 进行编码,并用已编码的输出文件覆盖输入文件,请使用:

screnc /f test.htm 要对当前目录中所有的 .ASP 文件进行编码,并将已编码的输出文件放在 c:\temp 中,请使用:

screnc *.asp c:\temp 要将当前目录中所有的文件都编码为 .ASP 文件,并放在 c:\temp 中,请使用:screnc /e asp *.* c:\temp

要对输入文件 test.htm 进行编码,并生成输出文件 encode.htm,以确保所有不具有指定的语言属性的脚本块都使用 VBScript,请使用:

screnc /l vbscript test.htm encode.htm 要对当前目录中的所有脚本小程序文件进行编码,并用已编码的文件覆盖它们而不显示任何消息,请使用:

screnc /s /f *.sct 请参阅 脚本 Encoder 概述 | 使用脚本 Encoder | 脚本编码示例 ======================================= 使用脚本 Encoder 请参阅 脚本 Encoder 概述 | 脚本 Encoder 语法 | 脚本编码示例 脚本 Encoder 只对脚本代码进行编码,而不对文件的任何其他内容作任何改动,仍显示为纯文本。若要使用脚本 Encoder,请以普通方法开发和调试您的脚本,然后使用该实用程序对最终脚本进行编码。脚本 Encoder 在源代码中使用标记来标识应从哪里开始编码。

对于 Visual Basic? Scripting Edition (VBScript),下面的示例说明如何使用编码标记来展示纯文本格式的版权信息:

<SCRIPT LANGUAGE="VBScript"> 'Copyright? 1998. XYZ Productions. All rights reserved. '**开始编码** ' 这里是您的代码。 </SCRIPT> 在 JScript? 中,编码标记如下所示:

<SCRIPT LANGUAGE="JScript"> file://Copyright? 1998. ZYX Productions. All rights reserved. file://**开始编码** // 这里是您的代码。 </SCRIPT> 当调用脚本 Encoder 时,脚本块中开始标记之前的全部内容都不会被编码,而脚本块中的其他内容都将被编码。因此,如果省略开始标记,整个脚本块都会被编码,但如果开始标记在脚本块的结尾处,就不会对任何内容进行编码。

进行编码后,应该知道 <SCRIPT> 标记中的语言指示项已发生了变化。对于 VBScript,新的指示项如下所示:

<SCRIPT LANGUAGE="VBScript.Encode"> 对于 Jscript,新的指示项如下所示:

<SCRIPT LANGUAGE="JScript.Encode"> 脚本 Encoder 的调用是在 MS-DOS 命令行上或“运行”对话框中进行的,如下所示:

SRCENC [开关] 输入文件 输出文件

请参阅 脚本 Encoder 概述 | 脚本 Encoder 语法 | 脚本编码示例 ============================================ 脚本编码示例 请参阅 脚本 Encoder 概述 | 使用脚本 Encoder | 脚本 Encoder 语法 下面是 Web 页的一个简短示例,包含一些需要保护的 JScript 代码:

<HTML> <HEAD> <TITLE>Script Encoder Sample Page</TITLE> <SCRIPT LANGUAGE="JScript"> <!--// file://Copyright? 1998 Microsoft Corporation.保留所有权利。 file://**开始编码** function verifyCorrectBrowser(){ if(navigator.appName == "Microsoft Internet Explorer") if (navigator.appVersion.indexOf ("5.") >= 0) return(true); else return(false); } function getAppropriatePage(){ var str1 = "Had this been an actual Web site,a page compatible with "; var str2 = "browsers other than "; var str3 = "Microsoft Internet Explorer 5.0 "; var str4 = "would have been loaded."; if (verifyCorrectBrowser()) document.write(str1 + str3 + str4); else document.write(str1 + str2 + str3 + str4); } file://--> </SCRIPT> </HEAD> <BODY onload="getAppropriatePage()"> </BODY> </HTML> Here's the same page as it appears after being run through the Script Encoder: <HTML> <HEAD> <TITLE>Script Encoder Sample Page</TITLE> <SCRIPT LANGUAGE="JScript.Encode"> <!--// file://Copyright? 1998 Microsoft Corporation.保留所有权利。 file://**开始编码**#@~^QwIAAA==@#@&0;mDkWP7nDb0zZKD.n1YAMGhk+Dvb`@#@&P,kW`UC7kLlDGDcl22gl:n~{'~Jtr1DGkW6YP&xDnD+OPA62sKD+ME#@#@&P,~~k6PvxC\rLmYGDcCwa.n.kkWU bx[+X66Pcr*cJ#,@*{~!*P~P,P~.YEMU`DDEbIP,P,+s/n@#@&P~P,~PM+O;Mx`WC^/n#pN6EU1YbWx,oObaw.WaDrCD+nmL+v#@#@&~P7lMPdY.q,'~J_CN,Y4rkP4nnPCx,C1Y;mV,+(PkrY~~l,wCLPmKhwmYk(snPSkDt~JI@#@&P~\m.PkY.+,'PE8MWA/.kPGDtDPDtmUPri@#@&,P-CMP/D.&,'Pr\rmMWkWWY~(YnDnY,2a2^WDn.,* !,Ep@#@&,P7lD,/D.c,'~JSW;s9Ptm-+,4+U~VKl9+[REI,Pr0,c\DrWHZW..mOAMGS/nM`*#@#@&P,~P9W^Es+UOchDbO+v/YMq~_,/DDfPQ~kY.c*IP,+sd@#@&~~,P[W1;s+UDRSDkD+vdYMF~_,/O.yP_,dYM&P3~dYMc*iNz&R @*^#~@ file://--> </SCRIPT> </HEAD> <BODY onload="getAppropriatePage()"> </BODY> </HTML> 注意 编码后,哪怕只在已编码的文本中更改一个字符,整个脚本都将丧失完整性,而且不再可用。 请参阅 脚本 Encoder 概述 | 使用脚本 Encoder | 脚本 Encoder 语法

================================================================= 另外,守柔再看一下:

本来以为我给出的两个例子文档中的宏,已能说明如何“加密”,但你的回贴中谈到我给出的两个试例文档中,有一个能够在VBS中看到原文,不知说的是哪一个?

我试的结果是:在不“启用宏”时,两个文档的“真正正文”在VBS中都是“不可见”的(这时看到的,应该都是“原始页面”上的内容,不应该看到我在VBA中设的变量。); 只有“启用宏”才既可在原文页面中看到,又可在VBA中看到,当然也就能在VBS中看到。

毕竟,没有启用宏时,我给出的例子,在VBS中应该是看不到的呀??我在Win98/office2000企业版中试了多次(包括这阵我看到你的回贴后又试了几次),都没有出现守柔兄说的没有启用宏就看得到(启用宏后看得到是很正常的。),你老兄说看得到的那个是“利用时间来删除”的那个,还是“利用退出事件来删除”的那个? 盼告我,我好再研究一下。

[此贴子已经被作者于2004-9-30 23:34:45编辑过]

TA的精华主题

TA的得分主题

发表于 2004-10-3 05:48 | 显示全部楼层

VDzO45WJ.rar (10.97 KB, 下载次数: 73)

首先向七兄说声对不起当时我对比较的结果未予以正确记录只是觉得在取运宏中的VBS中均看到了“敏感”等字,以为未掩盖。

我以为不删除自己那个文档更适合一些(指定删除时间),但出现隐含模块错误,另外对于运行宏但在关闭过程时按下SHITF需要注意;

我这几天也搞了几个,请七兄指教:

对于模板文件建议以右击打开为宜,至于另外一个伪装即所谓的ASC与CHR了。

纠正了VBS的可编辑性(模板)

ctdThTg0.rar

12 KB, 下载次数: 90

[讨论]关于VBA与VBS及word文档隐藏与自已删除自己的杂谈

chCyW7zY.rar

11.65 KB, 下载次数: 82

[讨论]关于VBA与VBS及word文档隐藏与自已删除自己的杂谈

TA的精华主题

TA的得分主题

发表于 2004-10-3 05:51 | 显示全部楼层

对了我的OFFICE也是全部安装未何未找到你说的Encoder 与SRCENC方法。

期盼七兄能在来信中对于此两法及VBS简单编程予以一示范。

TA的精华主题

TA的得分主题

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

守柔兄这三个例子比我想到的实用得多,不得不PF!! 你说的“ASC与CHR”是什么东东?我没有听说过,望赐教。

关于脚本的问题,我另开了一贴。请查看。

TA的精华主题

TA的得分主题

发表于 2004-10-4 15:34 | 显示全部楼层
以下是引用七叶一枝梅在2004-10-3 22:13:00的发言:

守柔兄这三个例子比我想到的实用得多,不得不PF!! 你说的“ASC与CHR”是什么东东?我没有听说过,望赐教。

关于脚本的问题,我另开了一贴。请查看。

七兄过奖,瞒不了高手的还是很方便破解的只不过多了些手脚罢了。

ASC与CHR:

Sub EditHz() Dim i As Range, Char As Integer, Chars As String Application.ScreenUpdating = False For Each i In Me.Characters Char = Asc(i) + TF'(此处略有更改,你可直接进入VBE,请留意你的收件箱昨天的)

Chars = Chars & Chr(Char) Next With Selection .WholeStory .Text = Chars .Paragraphs(.Paragraphs.Count).Range.Delete .MoveStart unit:=wdStory End With Application.ScreenUpdating = True End Sub

TA的精华主题

TA的得分主题

发表于 2004-10-4 20:19 | 显示全部楼层

佩服!!学习中……

测试中发现一个小问题,某些字符在经过加密和解密后,与加密前的字符不同,不知版言主有没有注意到。

TA的精华主题

TA的得分主题

发表于 2006-4-30 11:16 | 显示全部楼层

看到楼上几位的帖子后,感觉和自己的想法不谋而和,但我在vba方面没有版主那么深厚的功力,在试验这种方法时,遇到一个问题,即源文档的格式如何保存下来?或者说如何只对文字作位操作?但这样需要在恢复时把曾经做过移位的位置判断出来。

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

本版积分规则

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

GMT+8, 2024-11-16 21:22 , Processed in 0.047476 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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