excel API Hook 的应用 绕过 VBA 密码保护
发布时间:2022-08-23 22:11:41
这是一段从网络收集的代码, 代码运用 API Hook 来绕过 VBA 的密码保护机制,在 VBE 中可以直接查看加密的 VBA 工程而不需要密码验证。网络转载,非原创,感谢作者提供的强大代码。注意:本代码不能用于 64 位 Office, 有时间我会把它修改一下,使其可以用于 64 位 Office。
'***************************************************************************
'*
'* MODULE NAME: Protected VBA project Picklock(PVP)
'*
'* Usage: 运行FrmHookMain窗口,点补丁,然后双击工程窗口中有密码保护的模块
'* 应该能够直接打开了:)
'*
'*
'* DESCRIPTION: 在写中文字符串转换为拼音函数(HzToPy)过程中,第一次发现VBA功能的强大.
'* 于是这次尝试将其他语言中比较好写的API HOOK移植成VBA代码,
'* 正好顺便把VBA密码保护去掉,喜欢加密码的朋友不要生气啊:)
'* 总的来说VBA的写法和其他语言区别不大,但VBA毕竟不太方便,代码必须放在标准模块中.
'* 再有就是对指针的支持实在有限,于是最后选择了一种写起来最简单的API hook方法,
'* 就是所谓的陷阱法.如果你不太清楚什么是API HOOK,请求助于google.
'*
'* Theory: 这里就不说API hook的方法了,都是传统方法没什么可说的,这里只
'* 简单说下VBA模块密码破解.其实这些我也不是很了解,毕竟知道加密过程
'* 用处不大,这个问题上我比较关心结果:)
'* 判断有密码以及提示输入密码都是VBE6.dll干得好事.如果有密码,
'* VBE6.dll会调用DialogBoxParamA显示VB6INTL.dll资源中的第4070号
'* 对话框(就是那个输入密码的窗口),若DialogBoxParamA返回值非0,
'* 则VBE会认为密码正确,然后乖乖展开加密模块的资源.很显然其中存在很大
'* 漏洞,就像给日记本加上了锁,但里面全是活页,我们不需要打开锁,只要从侧面
'* 取出活页就可以了.这个从侧面取活页的过程就是hook住DialogBoxParamA函数,
'* 若程序调用DialogBoxParamA装入4070号对话框,我们就直接返回1,让
'* VBE以为密码正确.
'*
'* PS: PVP是在一个叫Advanced VBA Password Recovery (AVPR)的软件启发下
'* 作出来的,AVPR提供了一个VBA Backdoor功能就是跳过密码直接查看工程资源.
'* 它的原理和PVP一样,但用了通用性比较差的方法,适用系统比较有限,而PVP的方法
'* 理论上适用于所有采用第4070号对话框录入密码的Office系统.
'* 经测试PVP适用于Office 2002, 2003, 2007,其他版本尚未测试,但估计依然有效.
'* 在2000和XP系统上测试通过,但条件限制没有在Vista系统上测试,听说Vista有些机制
'* 可能影响API hook,暂时没机会测试就先这样吧~
'*
'* *64位操作系统下面的API hook代码肯定运行出错,就不要测试了
'*
'***************************************************************************
Option Explicit
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Long, Source As Long, ByVal Length As Long)
Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
ByVal lpProcName As String) As Long
Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" _
(ByVal hInstance As Long, ByVal pTemplateName As Long, ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As Long
Dim Flag As Boolean
Private Function GetPtr(ByVal Value As Long) As Long
'获得函数的地址
GetPtr = Value
End Function
Public Sub RecoverBytes()
'若已经hook,则恢复原API开头的6字节,也就是恢复原来函数的功能
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As Long
Dim OriginProtect As Long
Hook = False
'VBE6.dll 调用 DialogBoxParamA 显示 VB6INTL.dll 资源中的第 4070 号对话框(就是输入密码的窗口)
'若 DialogBoxParamA 返回值非 0,则 VBE 会认为密码正确,所以我们要 hook DialogBoxParamA 函数
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
'标准 api hook 过程之一: 修改内存属性,使其可写
If VirtualProtect(ByVal pFunc, 6, &H40, OriginProtect) <> 0 Then
'标准api hook过程之二: 判断是否已经hook,看看API的第一个字节是否为&H68,
'若是则说明已经Hook
MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
If TmpBytes(0) <> &H68 Then
'标准 api hook 过程之三: 保存原函数开头字节,这里是6个字节,以备后面恢复
MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
'用 AddressOf 获取 MyDialogBoxParam 的地址
'因为语法不允许写成p = AddressOf MyDialogBoxParam,这里我们写一个函数
'GetPtr,作用仅仅是返回 AddressOf MyDialogBoxParam 的值,从而实现将
'MyDialogBoxParam 的地址付给p的目的
p = GetPtr(AddressOf MyDialogBoxParam)
'标准api hook过程之四: 组装API入口的新代码
'HookBytes 组成如下汇编
'push MyDialogBoxParam的地址
'ret
'作用是跳转到MyDialogBoxParam函数
HookBytes(0) = &H68
MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
HookBytes(5) = &HC3
'标准api hook过程之五: 用HookBytes的内容改写API前6个字节
MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
'设置hook成功标志
Flag = True
Hook = True
End If
End If
End Function
Private Function MyDialogBoxParam(ByVal hInstance As Long, _
ByVal pTemplateName As Long, _
ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, _
ByVal dwInitParam As Long) As Integer
If pTemplateName = 4070 Then
'有程序调用DialogBoxParamA装入4070号对话框,这里我们直接返回1,让
'VBE以为密码正确了
MyDialogBoxParam = 1
Else
'有程序调用DialogBoxParamA,但装入的不是4070号对话框,这里我们调用
'RecoverBytes函数恢复原来函数的功能,在进行原来的函数
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
'原来的函数执行完毕,再次hook
Hook
End If
End Function
1文件名称 | 1下载链接 |
---|---|
VBA 免密查看.zip | http://pan.baidu.com/s/1eQCGYlk |
excel API Hook 的应用 绕过 VBA 密码保护的下载地址:


猜你喜欢
- 众所周知,CPU使用率就是电脑运行的程序占用的CPU资源,表示机器在某个时间点运行程序的情况。一般情况下CPU占了100%的话电脑就会慢下来
- 很多小伙伴在使用显卡的时候都会需要查看自己的显卡驱动但是不知道在哪里看,因此今天就给你们带来了显卡驱动查看位置详细介绍,还不清楚的小伙伴赶快
- 在wps ppt中是可以制作一个小相册的,你知道怎么做吗?对于新手来说还是有一定难度,怎么办?下面小编就为你介绍wps幻灯片如何制作相册的方
- 小伙伴们是不是经常使用wps表格来工作呢,但是在表格操作中,是不是会遇到某些较为复杂的任务,比如多条件数据求和,比如查找或引用另外工作表中符
- ppt文件中想要画一个可爱的小猫,该怎么画呢?这就需要使用ppt的画图工具,下面我们就来看看ppt绘制猫咪的教程,需要的朋友可以参考下猫是人
- 显卡升级对电脑有影响吗?这个问题首先需要知道显卡是什么东西,它是决定电脑画面显示质量的决定性硬件之一,那么升级显卡的话肯定就是会
- WPS能打开pdf却不能打印该怎么解决?想用wps打开pdf并打印,结果发现,没办法打印,那是因为wps目前只能打开PDF文件却不能打印复印
- 在很多比较正式的文档、书籍或杂志中常能看到,在每一页页面底部会有一些内容,例如:本页页码、总页数、日期、公司标志、文档标题、文件名或作者名等
- 苹果刚刚已经发布了 27 英寸 iMac 5K 的更新版本,外观没变,主要是性能的升级,处理器全面为英特尔第10 Comet Lake处理器
- 使用电脑的用户相信都会为自己的电脑设置一下开机密码,也只有知道开机密码的人才能够进入系统桌面,不过最近有win7系统用户,想修改登录密码,却
- 在Word2010文档中可以突出显示查找到的内容,并为这些内容标识永久性标记。即使关闭“查找和替换”对话框,或针对Word2010文档进行其
- ①如果电脑上没安装Word2007,那么看到的就是下图的样子。 ②右击文档,选择打开方式--选择默认程序。 &nb
- WPS2019分页插图怎么用?wps2019幻灯片有很多页,想要将多张图分别插入到幻灯片中个,该怎么操作呢?下面我们就来看看wps多张图分别
- 1.打开需要绘制正负数据条的Excel表格 2.选中需要绘制条形图数据,依次点击工具栏的“样式”→“条件样式”→“
- 大家在用word做文件时有时想要给文档添加水印,怎么办呢?其实很简单,下面小编来教大家怎么做我们在处理word文档的时候,往往需要增加一些,
- 一年一度,母亲节到来了,你给妈妈送上了年新的祝福了没?今天小编给大家整理了6个母亲节视频素材,编辑文本图层。 母亲节素材编辑文本图层, 每次
- ①单击进入“插入”选项卡,在“符号”选项组中选择“公式”按钮; ②在弹出的“公式编辑器”对话框中输入你想要的公式符
- 由于《地牢围攻》1代是属于XP时代开发的游戏,而现在的电脑大部分都是win7、win10,因此很多用户用Win7电脑下载安装好《地牢围攻》后
- 在macOS的Safari 浏览器中会有自动下载和开启文档的功能,这就增加了MacOS的安全隐患。如果想让macOS 能更安全,建议将Saf
- 使用win7系统的用户都知道,在运行一些游戏应用的时候,右下角任务栏会显示图标,熟知的人一看就知道你运行了什么程序,为了不让人看到就需要对其