ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 给VB/VBA加密的一种方法

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-8-4 09:54 | 显示全部楼层 |阅读模式
本帖最后由 yiyiyicz 于 2014-8-4 23:00 编辑

在这里首先要感谢“心电感应”坛友,因为他耐心的帮助,我的账号才没有被废掉。许多资料以及和EH中各位坛友的讨论记录,得以保存。在此深表谢意!
关于“加密问题”,对谁来说都难办。以下是针对工程应用。如CAD二次开发,特殊的排程排产,这些都包含了一整套的计算过程。
说到加密,可能最先想到的是软件加密方法。但是,有矛就有盾,有正(加密)就有反(破解)。何况我等草莽出身,那些东西实在是玩不转。
经过摸索,我觉得VBA加密,基本上就是样子货,不堪一击;VB6编译后运行,加密效果比较好。因为反编译后得到是类似汇编语言,不好懂。
当然,我们还可以让反编译出来的东西读起来难上加难。这对我们这些非软件专业的人并不难。
1,  程序中所有的变量都不带物理意义。也就是变量大排行,如A1\A2\\An
2,  删除所有的注释
3, 将整套计算逻辑中的关系,用一个关系表来代替(部分计算逻辑关系也可以)。与此同时,用类模块编程来实现运行中运算功能/子例程/函数/事件等跳转。换句话说,就是利用类模块+关系表,实现类似的实现面向对象的“继承”效果。在程序代码中将会出现一系列复杂的对象变量引用及其赋值。下面的简单代码,就是一个实例(是“委托”,也是“回调函数”)。利用上面提到的表,加上委托,可以实现继承,甚至是多层继承\多根继承。
反编译不难做。但是读懂软件内容,恐怕只有和你同专业的才有兴趣。当变量名看不出任何意义;看不到一条注释;一堆对象变量引用\赋值。这些足可以让人就此止步。就算有人玩命去破解,那他至少要付出巨大的时间代价,而且他要能从头到尾猜出你的计算过程和逻辑,这太难了。
下面是一个简单的类模块的实例(如果没有注释也能读懂,请发帖讲一下,这肯定是工程计算高手加VB高手


  1. '// 模块 T01Practice 运行Sub Prc()。这段代码写在sheet下也可以
  2. Sub Prc()
  3. Dim Reslut As Double, Zx1 As Double, Zx2 As Double, Exp As Double
  4.     Zx1 = 1#
  5.     Zx2 = 10#
  6.     Exp = 0.001
  7.     MainFunc New T01Func1, Reslut, Zx1, Zx2, Exp
  8.     MsgBox "根= " & Reslut
  9.     Reslut = 0
  10.     MainFunc New T01Func2, Reslut, Zx1, Zx2, 0.01
  11.     MsgBox "根= " & Reslut
  12. End Sub
复制代码


  1. '// 模块:T01MainFun
  2. Sub MainFunc(Fun As T01InterFace, Ta As Double, Tb As Double, Tc As Double, Td As Double)
  3. Dim J As Integer, Jmax As Integer, DX As Double
  4. Dim Fmid As Double, F As Double, Rtbis As Double
  5. Dim X1 As Double, X2 As Double, Xmid As Double, Xacc As Double
  6. Rtbis = Ta
  7. X1 = Tb
  8. X2 = Tc
  9. Xacc = Td
  10. Jmax = 40
  11. Fun.BeCallFunc Fmid, X2, 0, 0, 0
  12. Fun.BeCallFunc F, X1, 0, 0, 0
  13. If F < 0# Then
  14. Rtbis = X1
  15. DX = X2 - X1
  16. Else
  17. Rtbis = X2
  18. DX = X1 - X2
  19. End If
  20. For J = 1 To Jmax
  21. DX = DX * 0.5
  22. Xmid = Rtbis + DX
  23. Fun.BeCallFunc Fmid, Xmid, 0, 0, 0
  24. If Fmid <= 0# Then Ta = Xmid
  25. If Abs(DX) < Xacc Or Fmid = 0# Then Exit Sub
  26. Next J
  27. End Sub
复制代码

  1. '// 类模块 T01InterFace
  2. Public Sub BeCallFunc(Tep1 As Double, Tep2 As Double, Tep3 As Double, Tep4 As Double, Tep5 As Double)
  3. 'modul
  4. End Sub
复制代码
  1. '// 类模块 T01Func2

  2. Implements T01InterFace

  3. Private Sub T01InterFace_BeCallFunc(Tep1 As Double, Tep2 As Double, Tep3 As Double, Tep4 As Double, Tep5 As Double)
  4. Dim X As Double
  5. X = Application.WorksheetFunction.Radians(Tep2)
  6. Tep1 = X + 0.5 * Sin(X) - 8
  7. End Sub
复制代码
  1. '// 类模块 T01Func1

  2. Implements T01InterFace

  3. Private Sub T01InterFace_BeCallFunc(Tep1 As Double, Tep2 As Double, Tep3 As Double, Tep4 As Double, Tep5 As Double)
  4. Tep1 = 5 * Tep2 * Tep2 - 2 * Tep2 - 6
  5. End Sub
复制代码

注释见后

TA的精华主题

TA的得分主题

发表于 2014-8-4 10:20 | 显示全部楼层
讲解的不错,多谢楼主分享

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-8-4 22:54 | 显示全部楼层
本帖最后由 yiyiyicz 于 2014-8-5 07:39 编辑

1楼实例代码的要点是:将函数作为参数,进而代码重用
1楼实例代码是要用二分法求方程的数值解,计算过程就是不断缩小方程的有根区间。而有根区间的左右端点就是由函数求出。在实际工程计算中,有n个问题需要求出数值解,而与问题对应的曲线方程各不相同。
解决办法不止一种。可以用select case … end select;还可以用自动化方法。参见http://club.excelhome.net/forum.php?mod=viewthread&tid=1129761&extra
我们这里用的类模块也是一种方法。思路是将二分法求解做成一个模板,各个问题求解时只需要调用这个模板就可以了。如此一来,将函数作为参数就成为关键。
以下先解释各个模块、类模块的各自作用。为了简单,实例代码中只用了两个曲线方程,二分法的代码也做了最大限度的简化。
1)在模块“模块 T01Practice”中,实际工程计算的整体过程写在这里。这段代码关键的地方是“MainFunc New T01Func1, Reslut, Zx1, Zx2, Exp”这句代码。MainFunc是调用另一个模块中二分法求解工具。紧随其后的New T01Func1是一个实例化的对象(T01Func1,是对象变量,是赋值之后的对象变量),这个T01Func1就是一个在二分法中要用到的一个曲线方程。在它后面的都是参数
2)MainFunc的构造是在模块“模块:T01MainFun”中完成的。
注意,Sub MainFunc(Fun As T01InterFace, Ta As Double, Tb As Double, Tc As Double, Td As Double),T01InterFace是类模块“类模块 T01InterFace”定义的虚拟类。作为接口使用。后面有进一步解释
这里定义了用二分法求数值解的模板。
再看Fun.BeCallFunc Fmid, X2, 0, 0, 0,这句是典型虚拟类的使用,也把它理解成模板。数学上它是求有根区间的一个端点值。
3)类模块 T01InterFace,就是一个典型的接口,虚拟类。它定义了一个空过程BeCallFunc,以及一些参数。“空过程BeCallFunc”请看接口的解释
'modul没有太大的作用,主要是担心在VB编译时出错而加上的。
4)类模块“类模块 T01Func2”、类模块“类模块 T01Func1”
这些是具体实现的类模块。可以有n个。每个类模块中写一个将用到的曲线方程,也就是和MainFunc(Fun As T01InterFace对应。
注意:先写上implements语句,然后先下拉左侧下拉菜单选定,再下拉右侧下拉菜单选定。再写曲线方程
小结:
在一个模块中写整个计算处理过程的代码,看1)
在另一个模块中写作为公共处理使用的模板,看2)。有两点要注意
Sub MainFunc(Fun As T01InterFace
Fun.BeCallFunc Fmid, X2, 0, 0, 0
构造一个接口,注意写法,看3)
Public Sub BeCallFunc(
最后写若干个类模块,写好曲线方程,即与Fun As T01InterFace及BeCallFunc对应的东西
还有一点,变量对应别搞错
类模块的基础知识是必须的。

TA的精华主题

TA的得分主题

发表于 2014-8-16 16:28 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
不学封装的原因是因为自己的代码还不值得封装。尤其对于VBA来说,绝大多数程序没有通用性,因为它所解决的are specific problems not general ones.m没有通用性

点评

有所为而有所不为,关键在于认识自我,赞!  发表于 2014-8-16 21:58

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-24 09:07 | 显示全部楼层
类模块,不仅是VB的重要技术之一,更是编程的一种思路

TA的精华主题

TA的得分主题

发表于 2016-3-2 21:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
太高深莫测了

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-3-18 10:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
说一个解读程序的实例
一个研究生,在我们办公室坐了差不多一年,就是读一套有限元程序。是源程序,带英文注释
这位一声不响,每天都挺准时的。谁也不知道他弄得怎么样。只是看到他每天都抱着一摞打印出来的程序代码,有一两尺高
等到快结束的时候,我去问问他,怎么样了?
这位说,也就是读懂了大概意思,但还是写不出详细的流程图
这是专业的人读专业的软件(不是软件专业),读的是源程序,还不是反编译出的东西
如果是反编译出来的东西,估计就没人愿意读了

TA的精华主题

TA的得分主题

发表于 2017-1-10 19:12 | 显示全部楼层
思路值得借鉴下,回去慢慢研究。

TA的精华主题

TA的得分主题

发表于 2017-1-10 20:05 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-9-19 19:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 12:28 , Processed in 0.047167 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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