VBA密匙暗码加密技术

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中的代码,无中间过程。即使中间截获也只是平坦码,无法破译。

相关推荐
VBA633713 天前
VBA代码加密解决方案目录及说明
vba
VBA633721 天前
如何学习VBA之2.1.3 VBA的错误处理
vba
VBA63371 个月前
VBA高级应用30例 应用6 第5部分:5 利用VBA从XML文件中导出数值数据
vba
VBA63371 个月前
VBA信息获取与处理专题七第二节 网络通信过程的解读
vba
VBA63371 个月前
数组与字典解决方案第二十九讲 数组的创建方法小结及回填的注意事项
vba
小妖6662 个月前
excel 怎么在单元格内容自动加上一段文字不能用公式
excel·vba
VBA63372 个月前
VBA之Word应用第五章第五节 Range对象的属性(四)
vba
VBA63372 个月前
VBA信息获取与处理专题七第一节 网络通信基础
vba
yivifu2 个月前
怎样将Word文档中脚注引用后面的空格轻松删除
word·vba