一种隐藏VBA代码模块和恢复可见的方法

news/2025/3/11 9:27:53/文章来源:https://www.cnblogs.com/wwwzgy/p/18622409
        为了保护自己写的VBA程序代码不被他人抄袭,你可能想到给程序添加查看密码。然而这种密码是很容易被破解的,其中的一种破解方法详见我之前写的一篇文章:如何把Excel的VBA程序封装成DLL并分发给他人使用。其实还有很多种破解方法,包括下面即将介绍的这种隐藏代码模块的方法也可以改造成破解密码的方法。除了使用密码,其实还可以使用代码混淆和隐藏代码模块的办法。下面就介绍一种可以隐藏代码模块的方法。
          VBA程序的文件其实是一种“复合文件”,无论是在Excel里写的VBA程序,还是在Solidworks里写的程序,都属于这种“复合文件”。首先要了解这种“复合文件“的内部结构,下面用一个VBA方法(可以在Excel里写,也可以在solidworks里写这个方法)打印出一个Solidworks里编写的swp程序文件的内部结构,代码如下:
'打印出复合文件的内部目录结构
PrivateSub Test_PrintDirs()
Dim fAs CFile
Set f= New CFile()
'打开文件,以字节方式打开
f.OpenFile "D:\VBA\隐藏模块测试.swp"
Dim cf As CCompoundFile
Set cf=New CCompoundFile
Dim ret As String
ret= cf.Parse(f)
If VBA.Len(ret) Then
Debug.Print ret
EndIf
Dim fs() As String
fs= cf.DirsName()
Dim i As Long
For i=0 To UBound(fs)
Debug.Print i, fs(i)
Next
Set cf=Nothing
Set f=Nothing
End Sub
View Code

上面这段代码用于打印“D:\VBA\隐藏代码测试.swp”这个“复合文件”的内部结构,这个文件在solidworks里打开的结果如下图所示,代码主要由Main和Hide这两个模块组成,还有一个UserForm1窗体。

 运行上面的代码段后,得到下面这样的输出结果:

0            Root Entry1            Root Entry\apc2            Root Entry\apc\The VBA Project3            Root Entry\apc\The VBA Project\_VBA_Project4            Root Entry\apc\The VBA Project\Host Project Item Names5            Root Entry\apc\The VBA Project\VBA Project Data6            Root Entry\apc\The VBA Project\Host Project Items7            Root Entry\apc\The VBA Project\VBA Project Signature8            Root Entry\apc\The VBA Project\Host Project Item Names\ThisLibrary9            Root Entry\apc\The VBA Project\Host Project Item Names\Project_Data_CurVer10           Root Entry\apc\The VBA Project\Host Project Item Names\Host Project Item List Data11           Root Entry\apc\The VBA Project\_VBA_Project\VBA12           Root Entry\apc\The VBA Project\_VBA_Project\PROJECTwm13           Root Entry\apc\The VBA Project\_VBA_Project\PROJECT14           Root Entry\apc\The VBA Project\_VBA_Project\VBA\ThisLibrary15           Root Entry\apc\The VBA Project\_VBA_Project\VBA\Main16           Root Entry\apc\The VBA Project\_VBA_Project\VBA\__SRP_217           Root Entry\apc\The VBA Project\Host Project Item Names\ThisLibrary\Project Item Data18           Root Entry\apc\The VBA Project\Host Project Item Names\ThisLibrary\Control List Data19           Root Entry\apc\The VBA Project\Host Project Item Names\ThisLibrary\ReqControl List Data20           Root Entry\apc\The VBA Project\_VBA_Project\VBA\__SRP_321           Root Entry\apc\The VBA Project\_VBA_Project\VBA\UserForm122           Root Entry\apc\The VBA Project\_VBA_Project\UserForm1\f23           Root Entry\apc\The VBA Project\_VBA_Project\UserForm1\o24           Root Entry\apc\The VBA Project\_VBA_Project\UserForm125           Root Entry\apc\The VBA Project\_VBA_Project\UserForm1\[1]CompObj26           Root Entry\apc\The VBA Project\_VBA_Project\UserForm1\[3]VBFrame27           Root Entry\apc\The VBA Project\_VBA_Project\VBA\Hide28           Root Entry\apc\The VBA Project\_VBA_Project\VBA\__SRP_429           Root Entry\apc\The VBA Project\_VBA_Project\VBA\__SRP_530           Root Entry\apc\The VBA Project\_VBA_Project\VBA\_VBA_PROJECT31           Root Entry\apc\The VBA Project\_VBA_Project\VBA\dir32           Root Entry\apc\The VBA Project\_VBA_Project\VBA\__SRP_033           Root Entry\apc\The VBA Project\_VBA_Project\VBA\__SRP_134           Root Entry\apc\The VBA Project\Host Project Item Names\ThisLibrary\ReqControl List Data\ReqControl List Data35           Root Entry\apc\The VBA Project\Host Project Item Names\ThisLibrary\Control List Data\Control_Data_CurVer36           Root Entry\apc\The VBA Project\Host Project Item Names\ThisLibrary\Control List Data\Control List Data
View Code

在这个“复合文件”内部,有许多组成文件,而VBA模块的定义就放在“Root Entry\apc\The VBA Project\_VBA_Project\PROJECT”这个文件里,我们只需要改写这个文件,就可以达到隐藏其中某个模块的目的。为了改写这个文件,首先要了解它有哪些内容,可以用下面这段代码把它的内容显示出来:

Private Sub Test_GetStream()
Dim f As CFile
Set f = NewCFile()
f.OpenFile"D:\VBA\隐藏模块测试.swp"
Dim cf As CCompoundFile
Set cf=New CCompoundFile
Dim ret As String
ret= cf.Parse(f)
Dim b() As Byte
ret= cf.GetStream("Root Entry\apc\The VBA Project\_VBA_Project\PROJECT", b)
If VBA.Len(ret) Then
Debug.Print ret
End If
Debug.Print VBA.StrConv(b, vbUnicode)
Set cf=Nothing
Set f=Nothing
End Sub
View Code

运行上面这段代码后,得到下面的输出结果:

ID="{6366A273-ED0F-4463-BE89-B6DD8ECD755B}"
Document=ThisLibrary/&H00000000
Module=Main
Module=Hide
Package={AC9F2F90-E877-11CE-9F68-00AA00574A4F}
BaseClass=UserForm1
Name="Macro4"
HelpContextID="0"
VersionCompatible32="393222000"
CMG="888A859389938993899389"
DPB="C4C6C9EF392A3A2A3A2A"
GC="00020D0E0E0E0EF1"[Host Extender Info]
&H00000001={3832D640-CF90-11CF-8E43-00A0C911005A};VBE;&H00000000[Workspace]
ThisLibrary=0, 0, 0, 0, C
Main=534, 155, 1812, 802, Z
UserForm1=49, 97, 1327, 744, , 756, 68, 2034, 715, 
Hide=224, 224, 1187, 708,
View Code

从上面的输出结果可以看到,程序文件一共有2个模块:Main和Hide,如果要隐藏Hide模块,那么只需要把Module=Hide这行删除即可。下面再用一段VBA代码来改写上面的“复合文件”,使Hide模块隐藏。

'改写对应的文件
Private Sub Test_ReWriteStream()
Dim f As CFile
Set f= New CFile()
f.OpenFile "D:\VBA\隐藏模块测试.swp"
Dim cf As CCompoundFile
Set cf=New CCompoundFile
Dim ret As String
ret= cf.Parse(f)
If VBA.Len(ret)Then
Debug.Print ret
End If
Dim b()As Byte
ret= cf.GetStream("Root Entry\apc\The VBA Project\_VBA_Project\PROJECT", b)
If VBA.Len(ret)Then
Debug.Print ret
End If
Dim strSrc As String
strSrc= VBA.StrConv(b, vbUnicode)
'替换后模块将被隐藏
'strSrc = VBA.Replace(strSrc, "Module=MMain" & vbNewLine, "")
strSrc= VBA.Replace(strSrc,"Module=Hide"& vbNewLine,"")
Debug.Print"更改后的文本:"& Chr(13)& strSrc
b= VBA.StrConv(strSrc, vbFromUnicode)
ret= b
Debug.Print"转换后的文本"& Chr(13)& ret
ret= cf.ReWriteStream("Root Entry\apc\The VBA Project\_VBA_Project\PROJECT", b)
If VBA.Len(ret) Then
Debug.Print ret
EndIf
Set cf=Nothing
Set f=Nothing
EndSub
View Code

经过改写文件后,再用solidworks打开swp文件,发现Hide模块不见了,但是程序还能正常运行。学会了隐藏模块的方法,那么恢复模块可见就很简单了,只需要给文件重新添加上对应的模块名即可。其实上面这种方法不仅可以隐藏模块,也可以用于解除VBA程序设置的密码,下次我们再详细说说如何解除程序密码。

上面的代码段用到了一些未公开的方法和代码,如果你想要深入学习和了解,请关注微信公众号“全栈开发的码农”,欢迎私信或留言探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/856893.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渗透测试-前后端加密分析之AES加密下的SQL注入

本文是高级前端加解密与验签实战的第9篇文章,也是最后一篇文章。本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过前后端加密进行SQL注入。本文是高级前端加解密与验签实战的第9篇文章,也是最后一篇文章。本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本…

Transformers 框架 Pipeline 任务详解(五):表格问答(table-question-answering)

本文全面介绍了 Transformers 框架中的 table-question-answering 任务,从基础概念到实际应用,再到如何构建和部署一个交互式的表格问答系统。无论是在商业智能、教育辅导还是金融分析等领域,Transformers 框架都能为我们提供强有力的支持,助力我们快速实现高效的表格问答解…

WPF实现加载的动态效果

思路: 1.创建一个画布,长宽100*100;<Canvas Width="100" Height="100">2.画布上创建一个圆,直径25,位于正上方中间,底色浅灰;<Style TargetType="Ellipse"><Setter Property="Width" Value="25"/>…

Derby 数据库介绍(2)--使用

本文主要介绍 Derby 的基本使用(简介可参考:Derby 数据库介绍(1)--简介),文中所使用到的软件版本:Java 1.8.0_341、Derby 10.14.2.0。 1、嵌入模式 直接使用 JDBC 连接数据库,可创建和启动数据库。 1.1、内存数据库@Test public void embeddedMemory() throws SQLException …

视野修炼第114期 | 2024JS现状调查结果

① 2024 JavaScript 现状调查结果 ② Text Fragment - 直接链接网页文本 ③ my-github-2024 - 2024 GitHub 报告生成 ④ 优秀的单页网站案例 ⑤ Gradienty - 一套CSS工具集 ⑥ 并发和并行的区别 ⑦ AI 音效生成欢迎来到第 114 期的【视野修炼 - 技术周刊】,下面是本期的精选内…

线程池工作原理

线程池综述 它的主要特点为:线程复用;控制最大并发数;管理线程。 使用线程池的好处有 第一:降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁带来的资源消耗 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建好就可以立即执行。 第三:提高线程的…

探讨:为什么大公司一定要使用微服务?

探讨:为什么大公司一定要使用微服务? | Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------…

实验6 模板类、文件I\O和异常处理

实验任务4#pragma once #include <iostream> #include <stdexcept>using namespace std;template <typename T> class Vector { public:Vector(int n, int value=0);Vector(Vector<T> &v);~Vector();int get_size() const;T& at(int i);T&…

千峰教育--Netty 再学习 1 网络模型概述(BIO、NIO、AIO)、BIO 逻辑实现及其局限性(单线程服务端、多线程服务端、线程池服务端)

课程介绍 1 网络模型概述 2 Channel 详解 3 Buffer 详解 4 Selector 详解 5 NIO综合案例-聊天室 6 AIO概念及实现 1 网络编程IO 模型介绍 1.1 BLockingIO Blocking IO也称BIO,及同步阻塞IO。Java 的 io 包基于流模型实现,提供了FIle,FileInputStream,FileOutputStream等输…

ZBlog升级之后出现后台登录错误

升级 1.7.3.3260 之后出现后台登录错误( 提示非法访问,验证码不显示,验证码报错 ) 这是因为 1.7.3.3260 增加了对后台登录的 2 个保护功能,因为主题插件的兼容性原因或其它原因造成功能不正常,可以在 option.php 里关掉 CSRF 保护功能或是验证码功能,或是 2 个都关闭 使…

织梦源码后台更新系统后,网页错乱的解决方法

覆盖模板文件下载之前使用的模板文件。 覆盖 templets/default 目录下的文件。 如果使用的是其他模板目录,确保更新不会影响到这些目录。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站…

解决Dede织梦上传图片失败 ERROR:Copy Uploadfile Error! 提示

错误显示:拷贝(复制)上传文件出错! 原因:上传的文件损坏。 上传目录无写权限。解决方法:尝试上传其它图片。 给uploads写入权限:Linux服务器:通过FTP设置 uploads 目录为777权限,子文件夹选择继承。 Windows 2003服务器:右键文件夹属性 -> 安全 -> 添加账户 -&…