VBA暗码密匙加密技术
"VBA语言専攻"一共推出四种VBA代码的加密加密模式:
方案一: 程序文件的加密及解密:用于工程密码破解,工程不可查看设置,破解工作表保护,有第三方软件支持。可加密,可破解。无需特别理论支持.
方案二: VBA代码加密解决方案:将VBA主程序代码手工转码VBS,打包exe可执行文件,主程序文件运行时指向可执行exe文件。可加密,exe文件破解难度大。需要手工将VBA代码改写成VBS脚本。需要一定程度VBA理论支持。
方案三: VBA暗码加密技术:5大模块支持,明文代码自动加密,每行可读,整体逻辑关系不可阅读。可加密,加密后的代码可以运行,整体代码难于阅读。按程序要求直接加密,无第三方软件。
方案四: VBA 暗码密匙加密技术:明文不可读,逻辑关系不可阅读;需要获得密匙解密查看代码。可以深度加密,加密后代码不可阅读。按程序要求直接自动加密运行,无第三方软件.
四种方案比较如下:

VBA暗码密匙加密技术
这个资料是"VBA语言専攻"提供给大家一份专业加密策略,涉及到:
1无差别数据可逆转换。这个技术要保证代码的可逆还原,不可出现任何差别,保证按
原逻辑运行。
2密匙加密技术。这个技术对转换后的数据进行二次加密,保证代码的不可破译
3基于栈式状态管理的中间代码(这也是方案三的理论)。这个技术中间状态的代码是
运行后即刻销毁的,为了防止他人在代码运行过程中获得代码,采用了方案三基于栈式状
态管理的代码技术,即使他人获得了中间状态代码,也无法还原源码。
我们先来看下面的代码:
Sub mynzAA()
Dim cell As Range
Dim end_row As Long
Dim myRang As Range
Sheet2.Select
end_row = Sheet2.Range("A1").End(xlDown).Row
Set myRang = Sheet2.Range("B2:B" & end_row)
'循环选择范围中的每个单元格
For Each cell In myRang
cell.Offset(0, 1).Clear
cell.Offset(0, 1).Value = Day(cell.Value) / Day(Now())
Next cell
End Sub
Sub mynzBB()
Dim cell As Range
Dim end_row As Long
Dim myRang As Range
Sheet2.Select
end_row = Sheet2.Range("A1").End(xlDown).Row
Set myRang = Sheet2.Range("B2:B" & end_row)
For Each cell In myRang
cell.Offset(0, 1).Clear
cell.Offset(0, 1).Value = Month(cell.Value) * Month(Now())
Next cell
End Sub
一共两段代码,给出了数据的转换逻辑,如果不想让他人了解到代码或者不想让他人看到代码的逻辑,可以按照第四种方案进行加密处理,结果如下:
Sub mynzAA()
'NZCgAzAF8AEABRAFMALAA9AEkALwA7AFUAMwAPAAkAIwAEAA==
'NZCgAzAF8AEABXAFgAJAAOABsAAQA/AFUAIAAdAEcACAAOAAEARAA=
'NZCgAzAF8AEABfAE8AEgAwAAcACQBoADQAEgBOADUAJQAPAAgARgA=
'NZHQAyAFcAVQBGAAQAbgACAAwAAgAtABYAFQA=
'NZKwA0AFYAbwBAAFkANwBxAFQATgAbAB0ABAALABMAdgBPAD0AQgA4ACUAJABmABkAWgBCABoA
AAB1AHgASQBIAGgANgAJABwATwBwAFgARgAKAHgABwAvACoAcgBKAFwAdgBZADcAPwBAAEAA
GgAaABYA
'NZHQA/AEYAEABfAE8AEgAwAAcACQBoAEgAQQA9AA8AIQAEABsAEQB4ABAAIAAgAD0AVwAYAHEA
XgAyAHkAXwBYAGEAVQBHAE4AJAAsABMARwAWAGYAawBhAGgAegBxAFgAQAAeAHUAaQBAAE4A
bgBVACIABgAVAGwAVwBZAAoAdgBkAGEAKwA0AFYAbwBAAFkANwB4AA==
'NZaQDwX51zOZDbYjWDtFZ8Tu12oWtiTiBTIlFSaA==
'NZbgB6ABIAEAB2AF8ALQBxAC8ALQAXAEQAQQAvABQAZAAvAAoAVAB2AAEALgAiADYAVwBTAEYA
XwAvAD8AAAB1AHgASQBIAGgANgAJABwATwBwAFgARgAKAHgABwAvACoAcgBKAFwAdgBZADcAPwBAAEAA
略去部分代码
'NZAgA7AFAAVQBeAGkABQAOAFsAVAA=
End Sub
以上代码是完全不可读不可理解的。
加密的效果测评(部分测评,还有噪音指数指标,待以后给大家讲解):

AI 反编译能力结果:

这是几轮测试后AI给我的结果,仍是无法破解。
下面我将详细讲解这个技术。
这个资料是"VBA语言専攻"提供给大家一份专业加密策略,涉及到 ① Base64 数据转换 ② 密匙与字符间的XOR转换 ③ 基于栈式状态管理的扁平化代码. 资料提供给大家一共两个文件,其一是代码加密,其二是代码分发:

4.1 技术讲解
4.1.1 Base64 是一种将二进制数据转换为可打印 ASCII 字符的编码方式,主要用于在仅支持文本的环境(如电子邮件、XML、JSON 或 URL)中安全地传输和存储二进制数据。
4.1.2 为什么需要"栈式"管理?问题根源:在混淆后的代码中,内层循环结束后需要准确返回到外层循环的下一个迭代点。如果仅用单一变量记录状态,嵌套层级加深时会发生状态覆盖。栈的作用:利用"后进先出"(LIFO)特性,确保每一层循环或逻辑块拥有独立的状态快照(如当前索引、临时变量值),退出时能精准恢复上一层状态。
4.1.2.1入栈(Push):在进入新的逻辑块(如内层 For Each 转换后的标签 Label_S_X)前,将当前外层的关键状态(如外层索引 FI_1)存入集合。
4.1.2.2出栈(Pop):在逻辑块结束(如 Label_E_X)后,从集合末尾取出状态,恢复外层变量的值。
4.1.3控制流平坦化(Control Flow Flattening)是一种作用于代码控制流图的高级混淆技术,其核心目的是通过重组代码的执行逻辑,极大增加逆向分析和静态分析的难度。在4.1.2 的基础上实现不改变代码的执行结构(不需要动态创建模块),而是通过数学变换和状态机跳转打乱代码的阅读顺序。从而达到控制流平坦化.
4.1.3.1. 核心原理 正常代码的控制流通常具有清晰的层级结构(如顺序执行、if-else 分支、循环嵌套等),这种结构在控制流图中表现为基本块之间有明确的前后依赖关系。
4.1.3.2 控制流平坦化的基本思想是打破这种自然的层级结构,将函数体内的所有基本块(Basic Blocks)提取出来,放置在一个大的循环结构中,并通过一个"主分发器"(Dispatcher)或状态变量来控制下一个执行哪个基本块。
4.1.3.3. 变换前(正常代码):代码按照逻辑自然流动。
4.1.2.3变换后(平坦化代码):所有逻辑块被扁平化地排列在一个巨大的 Switch-Case 或 If-Else 分发器中。
4.1.2.4 引入一个状态变量(例如 state),进入一个死循环或主循环。根据 state 的值,分发器决定跳转到哪个代码块执行。每个代码块执行完毕后,会修改 state 的值,指向下一个要执行的块,然后回到分发器。此时,控制流图变成了一个以分发器为中心的"星型"或"轮辐型"结构,基本块之间失去了直接的调用关系,全部通过分发器间接连接。
4.1.2.5 主要作用与影响
增加逆向难度:由于代码的执行顺序不再由物理位置决定,而是由运行时的状态变量动态决定,静态分析工具很难还原出原始的代码逻辑和算法意图。
4.1.2.6 原本清晰的循环和分支结构被掩盖,分析人员难以识别哪些代码属于同一个逻辑块,也难以进行符号执行或污点分析。
4.1.2.7 性能开销:虽然提高了安全性,但由于引入了额外的状态判断和跳转指令,通常会带来一定的运行时性能损耗。
4.2 代码加密程序
4.2.1 VBA_DarkCodeKeyEncryption.xlsm 这个程序用于给代码加密.
4.2.2 把需要加密的代码放置在模块1中,注意我在模块设计时加了一个备份模块,用于备份数据
4.2.3 点击"暗码加密模块1代码"按钮:

点击后:

4.2.4 点击"X64加密模块1代码"按钮:

这个按钮的作用是将第一次加密后的代码,转换成Base64 代码,然后再XOR 密匙字符,形成最终的代码,效果如下:

这个时候的代码就完全失去了真正的意义。不可读,不可理解。如果解密需要密匙,而且只能解密到平坦代码(平坦代码和普通代码是不可逆的)。
4.3 加密后程序的分发

4.3.1 资料中VBA_ProgramDistribution.xlsm程序是代码的分发程序,用户首先要把必要的工作表数据转移到这个文件中,同时把上面加密好的代码复制到模块1中。

4.3.2 在FunctionMoudle 模块中代码是平坦代码,这个模块的作用是解密"解密代码"
4.3.3 程序运行时,4.3.2中产生的模块代码会解密模块1中代码,存放到临时模块中,解密后的代码是平坦码,解密完成后销毁4.3.2中自动添加的模块。
4.3.4 程序继续运行,此时根据用户要求会运行4.3.3程序中指定的临时模块中的某个过程,运行完成后销毁4.3.3中产生的临时模块.
4.3.5 Module1 模块:这个模块的内容是完成上述程序运转的驱动顺序。
4.4 密匙的管理
4.4.1 在加密程序中,给出了密匙的值,这个密匙设置在............中,程序以此来加密代码。
4.4.2 在程序分发时,尽可能不要动我给出的分发程序模版(这个程序中的工作表除了sheet1的其他工作表是可以修改添加及删除的)。在我给出的这个程序分发模版中,我已经加入了密匙证书。
4.4.3 如果您用其他的模版,要运行一遍4.4.1给出的密匙添加过程。
程序在运行过程中首先利用UDF解密"解密代码"(UDF中是平坦码),"解密代码"是Base64 数据转码的平坦码+密匙后的密码,作用是解密模块1中的代码,无中间过程。即使中间截获也只是平坦码,无法破译。