Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
361 views
in Technique[技术] by (71.8m points)

excel - 有没有办法破解Excel VBA项目上的密码?(Is there a way to crack the password on an Excel VBA Project?)

I've been asked to update some Excel 2003 macros, but the VBA projects are password protected, and it seems there's a lack of documentation... no-one knows the passwords.

(我被要求更新一些Excel 2003宏,但是VBA项目受密码保护,而且似乎缺少文档...没人知道密码。)

Is there a way of removing or cracking the password on a VBA project?

(有没有办法删除或破解VBA项目上的密码?)

  ask by Jonathan Sayce translate from so

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can try this direct VBA approach which doesn't require HEX editing.

(您可以尝试这种不需要HEX编辑的直接VBA方法。)

It will work for any files (*.xls, *.xlsm, *.xlam ...).

(它适用于任何文件(* .xls,*。xlsm,*。xlam ...)。)

Tested and works on:

(经过测试并适用于:)

Excel 2007

(Excel 2007)
Excel 2010

(Excel 2010)
Excel 2013 - 32 bit version

(Excel 2013-32位版本)
Excel 2016 - 32 bit version

(Excel 2016-32 位版本)

Looking for 64 bit version?

(寻找64位版本?)

See this answer

(看到这个答案)

How it works (怎么运行的)

I will try my best to explain how it works - please excuse my English.

(我会尽力解释它的工作原理-请原谅我的英语。)

  1. The VBE will call a system function to create the password dialog box.

    (VBE将调用系统功能来创建密码对话框。)

  2. If user enters the right password and click OK, this function returns 1. If user enters the wrong password or click Cancel, this function returns 0.

    (如果用户输入正确的密码并单击“确定”,则此函数返回1。如果用户输入错误的密码或单击“取消”,则此函数返回0。)

  3. After the dialog box is closed, the VBE checks the returned value of the system function

    (关闭对话框后,VBE将检查系统功能的返回值)

  4. if this value is 1, the VBE will "think" that the password is right, hence the locked VBA project will be opened.

    (如果此值为1,则VBE将“认为”密码正确,因此将打开锁定的VBA项目。)

  5. The code below swaps the memory of the original function used to display the password dialog with a user defined function that will always return 1 when being called.

    (下面的代码用一个用户定义的函数交换用于显示密码对话框的原始函数的内存,该函数在被调用时始终返回1。)

Using the code (使用代码)

Please backup your files first!

(请先备份您的文件!)

  1. Open the file(s) that contain your locked VBA Projects

    (打开包含锁定的VBA项目的文件)

  2. Create a new xlsm file and store this code in Module1

    (创建一个新的xlsm文件并将此代码存储在Module1中)

    code credited to Siwtom (nick name), a Vietnamese developer

     Option Explicit Private Const PAGE_EXECUTE_READWRITE = &H40 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() 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 pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6 If TmpBytes(0) <> &H68 Then MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6 p = GetPtr(AddressOf MyDialogBoxParam) HookBytes(0) = &H68 MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4 HookBytes(5) = &HC3 MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6 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 MyDialogBoxParam = 1 Else RecoverBytes MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ hWndParent, lpDialogFunc, dwInitParam) Hook End If End Function 
  3. Paste this code under the above code in Module1 and run it

    (将此代码粘贴到Module1中的上述代码下并运行)

     Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub 
  4. Come back to your VBA Projects and enjoy.

    (回到您的VBA项目并享受。)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...