ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何破解VBA工程密码【使用VB.Net语言】

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-3-14 19:37 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 ryueifu2 于 2019-3-14 19:39 编辑

大家好!


破解工程密码的代码,VBA版本的很多,也很好用。 能不能把这个功能改写成VB.Net版本呢?
里面有很多API函数,之前我改写过一回,没成功。


VBA版的,大家可以参考下面的链接。


API hook 演示(破解VBA密码 http://www.360doc.com/content/11/0819/15/3416147_141692824.shtml


EXCEL vba工程密码破解 - 南京廖华 http://www.wodefanwen.com/lhd_97 ... y29wt5t00z5f_1.html

''''
  1. Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
  2.         (Destination As Long, Source As Long, ByVal Length As Long)
  3. Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
  4.         ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
  5. Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
  6. Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
  7.         ByVal lpProcName As String) As Long
  8. Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _
  9.         ByVal pTemplateName As Long, ByVal hWndParent As Long, _
  10.         ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
  11. Dim HookBytes(0 To 5) As Byte
  12. Dim OriginBytes(0 To 5) As Byte
  13. Dim pFunc As Long
  14. Dim Flag As Boolean
  15. Private Function GetPtr(ByVal Value As Long) As Long
  16.     '获得函数的地址
  17.     GetPtr = Value
  18. End Function
  19. Public Sub RecoverBytes()
  20.     '若已经hook,则恢复原API开头的6字节,也就是恢复原来函数的功能
  21.     If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
  22. End Sub
  23. Public Function Hook() As Boolean
  24.     Dim TmpBytes(0 To 5) As Byte
  25.     Dim p As Long
  26.     Dim OriginProtect As Long
  27.     Hook = False
  28.     'VBE6.dll调用DialogBoxParamA显示VB6INTL.dll资源中的第4070号对话框(就是输入密码的窗口)
  29.     '若DialogBoxParamA返回值非0,则VBE会认为密码正确,所以我们要hook DialogBoxParamA函数
  30.     pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
  31.     '标准api hook过程之一: 修改内存属性,使其可写
  32.     If VirtualProtect(ByVal pFunc, 6, &H40, OriginProtect) <> 0 Then
  33.         '标准api hook过程之二: 判断是否已经hook,看看API的第一个字节是否为&H68,
  34.         '若是则说明已经Hook
  35.         MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
  36.         If TmpBytes(0) <> &H68 Then
  37.             '标准api hook过程之三: 保存原函数开头字节,这里是6个字节,以备后面恢复
  38.             MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
  39.             '用AddressOf获取MyDialogBoxParam的地址
  40.             '因为语法不允许写成p = AddressOf MyDialogBoxParam,这里我们写一个函数
  41.             'GetPtr,作用仅仅是返回AddressOf MyDialogBoxParam的值,从而实现将
  42.             'MyDialogBoxParam的地址付给p的目的
  43.             p = GetPtr(AddressOf MyDialogBoxParam)
  44.             '标准api hook过程之四: 组装API入口的新代码
  45.             'HookBytes 组成如下汇编
  46.             'push MyDialogBoxParam的地址
  47.             'ret
  48.             '作用是跳转到MyDialogBoxParam函数
  49.             HookBytes(0) = &H68
  50.             MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
  51.             HookBytes(5) = &HC3
  52.             '标准api hook过程之五: 用HookBytes的内容改写API前6个字节
  53.             MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
  54.             '设置hook成功标志
  55.             Flag = True
  56.             Hook = True
  57.         End If
  58.     End If
  59. End Function
  60. Private Function MyDialogBoxParam(ByVal hInstance As Long, _
  61.     ByVal pTemplateName As Long, ByVal hWndParent As Long, _
  62.     ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
  63.     If pTemplateName = 4070 Then
  64.         '有程序调用DialogBoxParamA装入4070号对话框,这里我们直接返回1,让
  65.         'VBE以为密码正确了
  66.         MyDialogBoxParam = 1
  67.     Else
  68.         '有程序调用DialogBoxParamA,但装入的不是4070号对话框,这里我们调用
  69.         'RecoverBytes函数恢复原来函数的功能,在进行原来的函数
  70.         RecoverBytes
  71.         MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
  72.         hWndParent, lpDialogFunc, dwInitParam)
  73.         '原来的函数执行完毕,再次hook
  74.         Hook
  75.     End If
  76. End Function

  77. Public Sub Pojie()
  78.     If Hook Then Debug.Print "破解"
  79. End Sub
  80. Public Sub Normal()
  81.     RecoverBytes
  82. End Sub

复制代码


评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-21 19:16 | 显示全部楼层
友情支持,顶帖

TA的精华主题

TA的得分主题

发表于 2020-2-21 19:26 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-21 19:45 | 显示全部楼层
为什么要破解呢,自己编写代码不就好了吗?

TA的精华主题

TA的得分主题

发表于 2020-2-21 23:13 | 显示全部楼层
刘老师,VBA开发经典系列的第三部和第四部什么时候能出啊?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-23 18:37 | 显示全部楼层
willylucy 发表于 2020-2-21 23:13
刘老师,VBA开发经典系列的第三部和第四部什么时候能出啊?

最近在开发VBE方面的插件

https://www.cnblogs.com/ryueifu-VBA/p/10360048.html
VBE2019的下载、安装和使用(最新版2020.2.22)

TA的精华主题

TA的得分主题

发表于 2023-5-7 11:46 | 显示全部楼层
老师好,您这代码在64位office要如何改才能用呢?加了PtrSafe和long也改成了longlong或longptr都不行,运行后打开不了加密的VBE窗口,自动关闭了文件

TA的精华主题

TA的得分主题

发表于 2023-8-22 15:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
为什么提示”VarPtr不匹配“?

TA的精华主题

TA的得分主题

发表于 2024-6-22 10:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-6-25 19:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个厉害,记录一下
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 01:37 , Processed in 0.047995 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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