Is there a way to crack the password on an Excel VBA Project?
Asked Answered
G

25

581

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.

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

Gastrocnemius answered 22/6, 2009 at 10:37 Comment(4)
Are you able to Save-As an .xls instead of an .xla as the examples in your link suggest? Not sure if this would make a difference.Degroot
good to known : xlsb is robust against password cracking tricksPropend
@Fandango68 This question was discussed years ago on meta. TLDR: Lots (most?) of the questions on SO could be abused by bad actors, but unless there is clear evidence of wrongdoing, we assume good faith. There are plenty of legitimately legal and ethical reasons to crack a VBA password. Additionally, discussing weaknesses of the current systems ultimately contributes to better security in the future and discourages people from blindly relying on insecure systems now.Viglione
To anyone who stumbles across this, please note that you can simply open up the excel file in OpenOffice, and it opens everything up without asking for a password.Vat
M
815

You can try this direct VBA approach which doesn't require HEX editing. It will work for any files (*.xls, *.xlsm, *.xlam ...).

Tested and works on:

Excel 2007
Excel 2010
Excel 2013 - 32 bit version
Excel 2016 - 32 bit version

Looking for 64 bit version? 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.
  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.
  3. After the dialog box is closed, the VBE checks the returned value of the system function
  4. if this value is 1, the VBE will "think" that the password is right, hence the locked VBA project will be opened.
  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.

Using the code

Please backup your files first!

  1. Open the file(s) that contain your locked VBA Projects
  2. Create a new xlsm file and store this code in 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

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

Moyra answered 16/12, 2014 at 15:32 Comment(12)
This is also working perfectly well for PowerPoint and .pptm .ppam filesExasperate
Tested with a docm in Word 2016, works like a charm!Mal
This code works perfectly in unlocking the VBA code although each time I have used this it prevents me from re-protecting the project with a different password, has anyone else had this problem?Predestination
Also works for CATIA projects (CATvba macros) with abolutely no adapatations, which surprised me a lot! simply do the same, paste in different modules and that will workPolysepalous
I found it corrupts the VBA project in the Excel file so I had to export all of the modules/classes, then save the file as xlsx (non-macro), then CLOSE the file (stupid Excel), then re-open, then import modules and copy code from class files. At this point, I could save file as xlsm with my own password on the VBA project.Ferne
This cannot be done in excel anymore as the options in the context menu is grayed out so you cannot create the module.Trim
@Trim Just create a new Workbook (so that you have 2 open), and create the module in that instead?Sponsor
@OmerGreenwald ,Protect your VBA project by making hem unviewable you can replace the CMG, DPB and GC strings between parenthesis with any even number of “F”s equal to the number of characters in the original strings. You project is now uncrackable. No one (even you) can see or edit the VBA code.Teryl
@bonCodigo You just do it in Excel. Keep Excel open and open your word VBA Project, it will also be unlocked.Glassworks
Great, but this code should be cloned to support x64 office, by declaring functions and Subs as SafePtrParton
Perfect code for me (it's a great code). I've unlocked .xlsm file with a UserForm and a module, inside the VbaPoject protected by a password. This code worked in a 64 bit laptop with Office 365.Syncopate
How did you select 4070 as the pTemplateName? Is this based on trial and error, watching calls to the DialogBoxParamA function and observing its parameters? How did you discover this trick?Kronstadt
Y
229

Yes there is, as long as you are using a .xls format spreadsheet (the default for Excel up to 2003). For Excel 2007 onwards, the default is .xlsx, which is a fairly secure format, and this method will not work.

As Treb says, it's a simple comparison. One method is to simply swap out the password entry in the file using a hex editor (see Hex editors for Windows). Step by step example:

  1. Create a new simple excel file.
  2. In the VBA part, set a simple password (say - 1234).
  3. Save the file and exit. Then check the file size - see Stewbob's gotcha
  4. Open the file you just created with a hex editor.
  5. Copy the lines starting with the following keys:

    CMG=....
    DPB=...
    GC=...
    
  6. FIRST BACKUP the excel file you don't know the VBA password for, then open it with your hex editor, and paste the above copied lines from the dummy file.

  7. Save the excel file and exit.
  8. Now, open the excel file you need to see the VBA code in. The password for the VBA code will simply be 1234 (as in the example I'm showing here).

If you need to work with Excel 2007 or 2010, there are some other answers below which might help, particularly these: 1, 2, 3.

EDIT Feb 2015: for another method that looks very promising, look at this new answer by Đức Thanh Nguyễn.

Yogi answered 22/6, 2009 at 10:58 Comment(13)
What if there are no lines that start with CMG=...?Probate
In the blank excel file, or the locked one? Check the file size of the blank file. If its the locked file, make sure your backup is safe, then try changing just the other two lines. You sure it's encrypted file?Yogi
In the blank file. The other two lines do not appear either. Does this also work in Excel 2007? I used HEdit.Probate
I think there might be changes for Excel 2007, so this might not work. I don't have a copy of 2007 to try on this machine I'm afraid.Yogi
Is the protected file a .xlsx?Yogi
I can't confirm this, but I suspect that this trick will not work on the newer format. You may be reduced to brute-forcing the password. There are various sketchy-looking tools on the web for this. Good luck!Yogi
Excel 2007 password protection (and file format) is radically different than Excel 2003. I included some specifics about it in my answer below. In my opinion, the password protected option on an Excel 2007 file is the first time in Microsoft Office history that they have produced a reasonably secure file.Millard
I've recently had to do this in a project at work to pull out and archive source code for a variety of Excel applications (for which this post was invaluable). Two clarifications: (1) The minimum size appears to be 133 bytes for a 1-character password. It's pretty useful to have a pre-calculated 133-byte set of values too, since (2) Whilst padding the individual hashes works, there's no need. You can simply pad the end of the whole block after the GC="..." entry with null characters until you reach the length of the original file.Misspeak
@Misspeak or just replace the existing characters with spacesPudgy
Spaces might work too - at the time I was having to use an ADO stream in order to replicate a hex editor in VBA, since at least if you try and do this with notepad as your editor, the file becomes corrupt (probably due to line break conversions, I'd guess, but not sure). Given that, I used Nulls, since in my experience they're more reliable (and either way, need to use a character), but if you have access to a proper editing tool, spaces might work just as well...Misspeak
Is there anyway to retrieve the VBA project password while break it ?Tjon
I wasn't able to set vba password on an excel 2016 new file. Could someone simply share the HEX to replace with 1234? Or can it change from machine to machine?Inviolate
This approach worked for me on a .xlsm file. I saved it as a .xls, did this, and then converted it back to .xlsm. It should be noted you can safely increase the length of the file if the new CMG... string is longer than the original.Morita
E
222

I've built upon Đức Thanh Nguyễn's fantastic answer to allow this method to work with 64-bit versions of Excel. I'm running Excel 2010 64-Bit on 64-Bit Windows 7.

  1. Open the file(s) that contain your locked VBA Projects.
  2. Create a new xlsm file and store this code in Module1

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
    ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
    
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
    ByVal lpProcName As String) As LongPtr
    
    Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
    Dim HookBytes(0 To 5) As Byte
    Dim OriginBytes(0 To 5) As Byte
    Dim pFunc As LongPtr
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
        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 LongPtr
        Dim OriginProtect As LongPtr
    
        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 LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) 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 in Module2 and run it

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    

DISCLAIMER This worked for me and I have documented it here in the hope it will help someone out. I have not fully tested it. Please be sure to save all open files before proceeding with this option.

Esmond answered 23/6, 2015 at 14:32 Comment(11)
I am not sure why but when I run this on Excel for 365 MSP 64-bit excel crashes, it closes the files and when I restart it, the password is still there.Starofbethlehem
This cannot be done in excel anymore as the options in the context menu is grayed out so you cannot create the module.Trim
@kaybee I know I am nervy, but could you explain what the code does and how you developed it and got a starting point? It seems super-smart.Reset
It looks that it does not work. Tested on Excel 2016 Professional Plus. The code runs, it does 'something' but Excel crushes when try seeing VBAProject code.Hominy
@Trim As mentioned already on another answer you posted the same comment on, you can just create the VBA module in another Excel workbook open at the same time.Brune
This code seems to execute without issue, but when you go to view the VBA code, Excel 365 MSO (16.0.14326.20384) 64-bit crashes and restarts automatically attempting to open the same workbooks. The solution is below @VePe modified solution.Gullett
hands down the best soln - only (minor) issue is that whenever I copy and paste - VB decides to reformat this bit:Spread
Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr) so not sure if the original formatting could be revised to breakline somewhere else (or perhaps include comment to this effect - I cannot be the only one that has experienced this - albeit apparently I'm the only one commenting unless no one else noticed and submitted commentry that it doesn't work/buggy?) ta - well done- I really like this extended coeSpread
strange - not it doesn't work just like for the others who hav commented above and @user3761175 - not sure who you repeat step "above" (kaybee99)? with a .bin filetype - not even sure how to open this.Spread
I just performed this procedure on excel 365 and it DID work, it removed the password.Shea
This worked for me on excel 365. Just pay attention to where it says to "create a new xlxm file" then just open both the protected file and the new file, just hit Alt+F11 to go to the VBA window, there just create Module1 and Module 2 as instructed ON THE NEW FILE. If you try to do that on the protected file the option to create Modules will be greayed out, but not on the NEW FILE. Then just run the "unprotected" routine and excel crashes. Just go back and open the protected file, hit Alt+F11, open the code and VOILA! you can see the code now as it is now unprotected. Thank you keybee99.Shea
F
184

There is another (somewhat easier) solution, without the size problems. I used this approach today (on a 2003 XLS file, using Excel 2007) and was successful.

  1. Backup the xls file
  2. Open the file in a HEX editor and locate the DPB=... part
  3. Change the DPB=... string to DPx=...
  4. Open the xls file in Excel
  5. Open the VBA editor (ALT + F11)
  6. the magic: Excel discovers an invalid key (DPx) and asks whether you want to continue loading the project (basically ignoring the protection)
  7. You will be able to overwrite the password, so change it to something you can remember
  8. Save the xls file*
  9. Close and reopen the document and work your VBA magic!

*NOTE: Be sure that you have changed the password to a new value, otherwise the next time you open the spreadsheet Excel will report errors (Unexpected Error), then when you access the list of VBA modules you will now see the names of the source modules but receive another error when trying to open forms/code/etc. To remedy this, go back to the VBA Project Properties and set the password to a new value. Save and re-open the Excel document and you should be good to go!

Fons answered 5/11, 2010 at 15:25 Comment(13)
Unfortunately, this didn't work for me with Excel for Mac 2011 v14.2.5. I got the option to repair the file, not to reset the password, and the effect was losing all the VBA scripts.Column
Perfect solution - I did this with a 2003 file using HxD Hex EditorKerbstone
I just tried it (.xls, Excel 2007) and it did not work. Result is: The Modules are visible, code does indeed seem to work, but when opening a module, it says unexpected error (40230).Lepidosiren
Same error here (Excel 2010) - but then I realised I'd skipped the 'set a new password and save/reopen' (steps 7-9) from Pieter.Sculpt
+1 This method also worked on our poorly developed access (.mdb) file! Now we can make that thing better, thanks for this!Briquet
This method WFM on Excel 2013, on an .xls file. I don't remember what version of Office I used it last on, many years ago. When I first opened the file (step 4), the macro content was disabled. When I enabled it, I got several unexpected error messages. I clicked through all of them, then followed the rest of the recipe. After saving the file seems to work.Supreme
Yes, also for for me it said unexpected error, however you can change the password (or set it to empty string) and save the excel sheet. Then it worked for me.Indemnification
This worked for me on a ppt Add-in file, too. (*.ppa)Colonnade
This works for XLAs also. The NOTE is very important. Do not skip this important step.Tutti
As another user pointed out, on Mac 2011, the option to repair the file comes up. Once you do that, it deletes all the scripts. Has anyone found a work around for Mac? @JoeCarrollDysart
@Fons This worked with Excel 2007. I was wondering how you figured this out, is their some logic behind this?Canal
Works perfectly in Excel 2010, too.Subcommittee
Tried it, got the "unexpected error (40230)", read the comments, saw @OwenB comment, facepalmed, saved and... it worked :) Excel 2021, and this workaround still works. ThanksAlbertalberta
E
129

Edit: this is an updated version of the accepted answer and should work on more office versions. It's tough but let's get this answer to the top!

With my turn, this is built upon kaybee99's excellent answer which is built upon Đức Thanh Nguyễn's fantastic answer to allow this method to work with both 32/64 bit versions of Office.

An overview of what is changed, we avoid push/ret which is limited to 32bit addresses and replace it with mov/jmp reg.

how it works

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

  2. Create a new file with the same type as the above and store this code in Module1

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
    ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
    
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
    ByVal lpProcName As String) As LongPtr
    
    Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
    Dim HookBytes(0 To 11) As Byte
    Dim OriginBytes(0 To 11) As Byte
    Dim pFunc As LongPtr
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
        GetPtr = Value
    End Function
    
    Public Sub RecoverBytes()
        If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 12
    End Sub
    
    Public Function Hook() As Boolean
        Dim TmpBytes(0 To 11) As Byte
        Dim p As LongPtr, osi As Byte
        Dim OriginProtect As LongPtr
    
        Hook = False
    
        #If Win64 Then
            osi = 1
        #Else
            osi = 0
        #End If
    
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    
        If VirtualProtect(ByVal pFunc, 12, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
    
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, osi+1
            If TmpBytes(osi) <> &HB8 Then
    
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 12
    
                p = GetPtr(AddressOf MyDialogBoxParam)
    
                If osi Then HookBytes(0) = &H48
                HookBytes(osi) = &HB8
                osi = osi + 1
                MoveMemory ByVal VarPtr(HookBytes(osi)), ByVal VarPtr(p), 4 * osi
                HookBytes(osi + 4 * osi) = &HFF
                HookBytes(osi + 4 * osi + 1) = &HE0
    
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 12
                Flag = True
                Hook = True
            End If
        End If
    End Function
    
    Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) 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 in Module2 and run it

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    
Exieexigency answered 18/11, 2018 at 8:3 Comment(15)
Perfect! Work with Windows Server 2016, Excel 2016 32 bitSparrowgrass
This worked on a .xlsm file on Excel Office 365. Thank you!Qianaqibla
Still works in 2019, Office 365 64bits latests builds, awesome guys!Bastogne
Thanks for the updated code, I was facing crashes running the previous version (64-bit), but all good with your versionInsouciant
It doesn't work in office 365 as they have deactivated the context menu so you cannot insert a new module.Trim
This doesn't seem to work for me - it never enters the TmpBytes(osi) <> &HB8 part for me. Office Pro Plus 2016Rudiment
This worked for me under Windows 10 with a VBA Project that had also a Digital Signature. After unlock I opened the VBAproject Settings & enabled „View without password“ & then saved the .xlsm-file (prevents the need to use the unlock from a second sheet every time)Allocation
VePe is the real MVP - this worked for Excel 365 MSO (16.0.14326.20384) 64-bit on Windows 10 Pro. THANK YOU!Gullett
VePe - many thanks. Still works in Excel for Microsoft 365 MSO (16.0.13127.21668) 64-bit on Win10. I use this for upgrading code modules in all workbooks and was worried because an older version no longer worked.Learn
Works perfectly. More efficient and much better than mucking around with hex editors and zip filesMcclelland
Worked like a champ. O365. Added modules under Normal and it fixed the dotm. The zip fix on the bin did not work but this did.Gershom
Worked like a charm on Excel 365, thanks :)Planck
This worked for me Excel 2010. I tried above solutions but didn't work. Thanks.Vieira
It works! I use Office 365 64 bit (on October 2023).Girandole
Great solution. Was given a task much like the op, and this worked perfectly for me in a few clicks. Good stuffCindy
D
105

For a .xlsm or .dotm file type you need to do it a slightly different way.

  1. Change the extension of the .xlsm file to .zip.
  2. Open the .zip file (with WinZip or WinRar etc) and go to the xl folder.
  3. Extract the vbaProject.bin file and open it in a Hex Editor (I use HxD, its completely free and lightweight.)
  4. Search for DPB and replace with DPx and save the file.
  5. Replace the old vbaProject.bin file with this new on in the zipped file.
  6. Change the file extension back to .xlsm.
  7. Open workbook skip through the warning messages.
  8. Open up Visual Basic inside Excel.
  9. Go to Tools > VBAProject Properties > Protection Tab.
  10. Put in a new password and save the .xlsm file.
  11. Close and re open and your new password will work.
Darius answered 26/6, 2015 at 12:21 Comment(16)
Worked in Excel 2016, Windows 10 64bit. (xlsm files)Copyreader
Worked in Word 2016, Windows 10 64bit (dotm files)Immanuel
Great solution, worked for me in Excel 2013 64 bit. You may skip changing of file extensions to .zip if you have 7-Zip installed. In this case, you can just right-click on the .xlsm file and choose "7-Zip -> Open Archive"Gabbey
works with Word 2013, win7x64. (It's very sad, being so easily tricked to believe the code is somewhat secure).Utilize
@ThierryMichel Combination of previous solutions and trial and error!Darius
XL2016 xlam too! 90 degree bow to Matt!Pegpega
Worked in Excel 2013, Windows 10 64bits ( a xls file which is saved as a xlsm file)Chisholm
@matt Excel repaired the sheet and removed vbaProject.bin partShirleyshirlie
In my case it removed the password and was able to see the object however I got prompted that the vba has been removed. I checked for my code and it was not there.Trim
it doesnt work. it throws unexpected error (402320)Mealtime
Works With Office 2016.Krafftebing
@Trim did you set a new password? It does until you do step 9 and set a new password.Emmalynn
On step 7, when I try to open the file I get the error message "we found a problem with some content in test.xlsm. Do you want us to recover as much as we can? If you trust the source of this workbook, click Yes. The "yes" option returns the message "The workbook cannot be opened or repaired by Microsoft Excel because it is corrupt. The "no" option just exits.Trim
Doesn't appear to work with the Microsoft 365 Apps for enterprise version of Excel.Disarmament
If you get an error saying the file is corrupt after using the hex editor, be sure you move the vbaProject.bin.bak file outside of the xl folder before re-zipping the file.Salomon
@Trim I was able to do this using DPX (note the capital X). With a lower-case x, I had the same problem you hadAndante
M
70

Colin Pickard has an excellent answer, but there is one 'watch out' with this. There are instances (I haven't figured out the cause yet) where the total length of the "CMG=........GC=...." entry in the file is different from one excel file to the next. In some cases, this entry will be 137 bytes, and in others it will be 143 bytes. The 137 byte length is the odd one, and if this happens when you create your file with the '1234' password, just create another file, and it should jump to the 143 byte length.

If you try to paste the wrong number of bytes into the file, you will lose your VBA project when you try to open the file with Excel.

EDIT

This is not valid for Excel 2007/2010 files. The standard .xlsx file format is actually a .zip file containing numerous sub-folders with the formatting, layout, content, etc, stored as xml data. For an unprotected Excel 2007 file, you can just change the .xlsx extension to .zip, then open the zip file and look through all the xml data. It's very straightforward.

However, when you password protect an Excel 2007 file, the entire .zip (.xlsx) file is actually encrypted using RSA encryption. It is no longer possible to change the extension to .zip and browse the file contents.

Millard answered 24/6, 2009 at 14:36 Comment(5)
Then you need to use standard zip hacking tools. Its no longer a "how do i back an excel file" problem.Blasto
@Anonymous Type: I think a zip cracking tool won't help. As I understand Stewbob, it's not the file entries in the zip file that are encrypted, but the whole zip file itself, which should include the header and the central directory.Marcenemarcescent
Just curious: how could it be RSA when I just enter one password (symmetric)?Disqualification
How about when the file you want to get into has the shorter keys? Just keep creating vba docs until you get one that has 137?Dyne
Are you sure that the entire zipfile is encrypted when you lock the VBA project? I can still open the zipfile and see the file structure.... And subfolder xl\ contains the file vbaProject.bin which has the familiar "CMG=... GC=" hashing block.Margalo
V
34

It's worth pointing out that if you have an Excel 2007 (xlsm) file, then you can simply save it as an Excel 2003 (xls) file and use the methods outlined in other answers.

Vide answered 25/3, 2011 at 1:29 Comment(3)
that is not true, I've worked with files for which conversion to xls/xla from xlsm was impossible, Excel 2007 and 2010 crashed each time, I've tried various instances, from one erros message - Kod wyjątku: c0000005 Przesunięcie wyjątku: 005d211dPropend
YES you can do it. I've done it many times. If there is something on sheets which is necessary and what is not transferred to the older version I do this: 1. convert .xlsm to .xls 2. crack the code of .xls 3. convert .xlsm to .xlsx 4. Put the code from modules in .xls to .xlsx and save that as .xlsmStomato
It works after converting xlsm to xls as in the answer.Destination
B
21

VBA Project Passwords on Access, Excel, Powerpoint, or Word documents (2007, 2010, 2013 or 2016 versions with extensions .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) can be easily removed.

It's simply a matter of changing the filename extension to .ZIP, unzipping the file, and using any basic Hex Editor (like XVI32) to "break" the existing password, which "confuses" Office so it prompts for a new password next time the file is opened.

A summary of the steps:

  • rename the file so it has a .ZIP extension.
  • open the ZIP and go to the XL folder.
  • extract vbaProject.bin and open it with a Hex Editor
  • "Search & Replace" to "replace all" changing DPB to DPX.
  • Save changes, place the .bin file back into the zip, return it to it's normal extension and open the file like normal.
  • ALT+F11 to enter the VB Editor and right-click in the Project Explorer to choose VBA Project Properties.
  • On the Protection tab, Set a new password.
  • Click OK, Close the file, Re-open it, hit ALT+F11.
  • Enter the new password that you set.

At this point you can remove the password completely if you choose to.

Complete instructions with a step-by-step video I made "way back when" are on YouTube here.

It's kind of shocking that this workaround has been out there for years, and Microsoft hasn't fixed the issue.


The moral of the story?

Microsoft Office VBA Project passwords are not to be relied upon for security of any sensitive information. If security is important, use third-party encryption software.

Belligerency answered 10/2, 2018 at 14:57 Comment(1)
Dont tell microsoft it is not goodZuleika
I
17

Have you tried simply opening them in OpenOffice.org?

I had a similar problem some time ago and found that Excel and Calc didn't understand each other's encryption, and so allowed direct access to just about everything.

This was a while ago, so if that wasn't just a fluke on my part it also may have been patched.

Identity answered 12/4, 2010 at 15:50 Comment(0)
I
16

In the event that your block of CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" in your 'known password' file is shorter than the existing block in the 'unknown password' file, pad your hex strings with trailing zeros to reach the correct length.

e.g.

CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"

in the unknown password file, should be set to

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" to preserve file length.

I have also had this working with .XLA (97/2003 format) files in office 2007.

Irreligious answered 6/4, 2011 at 14:21 Comment(2)
This works, but as I've recently discovered (commented above) you can also simply add null characters after the final close quote in the GC="..." block until you hit the same length.Misspeak
What do you do when the 'unknown password' it is longer than the existing block?Lyckman
B
13

For Excel 2007 onward you need to change your file extension to .zip In the archive there is a subfolder xl, in there you will find vbaProject.bin. Follow the step above with vbaProject.bin then save it back in the archive. Modify back your extension and voilà! (meaning follow steps above)

Bacteriophage answered 20/6, 2014 at 18:11 Comment(1)
I can confirm this works for .xlam files with Excel 2010 as well. +1!Fasces
A
12

I tried some of solutions above and none of them works for me (excel 2007 xlsm file). Then i found another solution that even retrieve password, not just crack it.

Insert this code into module, run it and give it some time. It will recover your password by brute force.

Sub PasswordBreaker()

'Breaks worksheet password protection.

Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox "One usable password is " & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub
Audsley answered 20/11, 2015 at 11:52 Comment(3)
Nice! I think you got one downvote because your solution unlocks the worksheet rather than the VBA module. Nevertheless I found it helpful - so thanks!Donnenfeld
I have this one it my Personal Workbook. Authors cited Bob McCormick as original author later modified by Norman Harker and JE McGimpsey 2002.Devastating
Replace ActiveWorkbook with ActiveDocument and works great on Word too!Cristie
C
10

Colin Pickard is mostly correct, but don't confuse the "password to open" protection for the entire file with the VBA password protection, which is completely different from the former and is the same for Office 2003 and 2007 (for Office 2007, rename the file to .zip and look for the vbaProject.bin inside the zip). And that technically the correct way to edit the file is to use a OLE compound document viewer like CFX to open up the correct stream. Of course, if you are just replacing bytes, the plain old binary editor may work.

BTW, if you are wondering about the exact format of these fields, they have it documented now:

http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx

Chromoplast answered 30/11, 2010 at 0:41 Comment(1)
The following link gives details for the XSLM format files. gbanik.blogspot.co.uk/2010/08/… The solution's the same as the one outlined by Yuhong Bao above, but makes for interesting reading and includes screenshots.Holcomb
P
7

If the file is a valid zip file (the first few bytes are 50 4B -- used in formats like .xlsm), then unzip the file and look for the subfile xl/vbaProject.bin. This is a CFB file just like the .xls files. Follow the instructions for the XLS format (applied to the subfile) and then just zip the contents.

For the XLS format, you can follow some of the other methods in this post. I personally prefer searching for the DPB= block and replacing the text

CMG="..."
DPB="..."
GC="..."

with blank spaces. This obviates CFB container size issues.

Pudgy answered 8/10, 2013 at 2:32 Comment(0)
C
6

Tom - I made a schoolboy error initially as I didn't watch the byte size and instead I copied and pasted from the "CMG" set up to the subsequent entry. This was two different text sizes between the two files, though, and I lost the VBA project just as Stewbob warned.

Using HxD, there is a counter tracking how much file you're selecting. Copy starting from CMG until the counter reads 8F (hex for 143) and likewise when pasting into the locked file - I ended up with twice the number of "..." at the end of the paste, which looked odd somehow and felt almost unnatural, but it worked.

I don't know if it is crucial, but I made sure I shut both the hex editor and excel down before reopening the file in Excel. I then had to go through the menus to open the VB Editor, into VBProject Properties and entered in the 'new' password to unlock the code.

I hope this helps.

Cornellcornelle answered 12/4, 2010 at 15:35 Comment(1)
Thanks, this was the only thing that worked for me!Franciscafranciscan
S
6

ElcomSoft makes Advanced Office Password Breaker and Advanced Office Password Recovery products which may apply to this case, as long as the document was created in Office 2007 or prior.

Saturn answered 12/4, 2010 at 15:44 Comment(0)
I
6

The accepted answer didn't work in Excel 2019 on Windows 10. Found out the extra steps we need to take to see the locked macro. I am summarizing the steps.

  1. Add a .zip to the end of the excel filename and hit enter

  2. Once the file has been changed to a ZIP file, open it by double clicking on it

  3. Inside you would see a folder called xl like below

  4. Inside xl, you'll find a file called vbaProject.bin, copy/paste it on the desktop

  5. Go to the online Hexadecimal Editor HexEd.it

  6. Search for the following texts DPB=... and change them to DPx=...

  7. Save the file and close HexEd.it

  8. Copy/Paste the updated file from your desktop inside the ZIP file (you would need to overwrite it)

  9. Remove the .zip extension from the end of the filename and add the excel extention again.

  10. Open the file in excel - you may receive a couple of error notifications, just click through them.

==== EXTRA STEPS OVER THE ACCEPTED ANSWER =====

  1. Open the Visual Basic window (usually ALT+F11 if I remember correctly) and open the VBAProject properties (Tools menu).
  2. Click on the Protection tab and change (do not remove at this stage) the password to something short and easy to remember (we'll be removing in next step).
  3. Save the workbook and then close and reopen.
  4. Open again the Visual Basic window and enter the password you just put in. Redo the previous step but this time you can remove (delete) the password.
  5. Save the workbook and you have now removed the password.

Extra steps are taken from following site https://confluence.jaytaala.com/display/TKB/Remove+Excel+VBA+password

Irade answered 14/1, 2021 at 6:44 Comment(0)
M
4

The protection is a simple text comparison in Excel. Load Excel in your favourite debugger (Ollydbg being my tool of choice), find the code that does the comparison and fix it to always return true, this should let you access the macros.

Marcenemarcescent answered 22/6, 2009 at 10:54 Comment(0)
E
4

My tool, VbaDiff, reads VBA directly from the file, so you can use it to recover protected VBA code from most office documents without resorting to a hex editor.

Enrico answered 3/5, 2011 at 10:2 Comment(1)
I have testes this tool and works really well however the free version retrieves the first 53 lines. To recover my file I had to follow Andy's instructions to unlock the password. Then I opened my xlsm with VbaDiff in both panes and then I clicked on the sheet with my code. I got it with copy-paste and put it in my recovered but vba-empty excel file.Trim
D
4

The truth is that the code files for most macro-enabled Office documents are not encrypted and the password only prevents opening the project with Office programs. This means that, as other answers suggested, you can usually use an Office alternative to access and edit the file.

However, if you just need access to the code, you can use a tool like oledump.py to extract the Macro code. This is useful for malware analysis, as well as getting most of the code from the file so that you don't have to start from scratch if you forget the password.

In addition, many excel files dynamically set the password when the file is opened. This means that if you can read the code, you can usually find the password in plaintext or de-obfuscate it.

oledump.py Examples:

List all "streams" (embedded binary or code files) within an office document:

python oledump.py -v yourExcelFile.xlsm

Output:

A: xl/vbaProject.bin
 A1:      2000 'PROJECT'
 A2:      1500 'PROJECTwm'
 A3: M    1224 'VBA/Module1'
 A4: M   18694 'VBA/Module2'
 A5: M   11877 'VBA/Module3'
...

Streams with an M next to them are macros, which is unencrypted VBA code

Extract a stream

python oledump.py -s A3 -v yourExcelFile.xlsm > Module1.vba

This will output the code contained in the A3 stream to Module1.vba.

I usually combine this with a loop to extract all files to a folder. This quick PowerShell script will extract all streams in most files:

New-Item -ItemType Directory "Output"

# just hardcode the highest stream outputted by oledump.py -v
$max = 5 
for ($i = 1; $i -le $max; $i++) {
    python oledump.py -s "A$i" -v yourExcelFile.xlsm > ".\Output\A$i"
}

Note that this will only extract human-readable files.

Diabolic answered 12/1, 2022 at 16:14 Comment(0)
S
2

For Excel 2016 64-bit on a Windows 10 machine, I have used a hex editor to be able to change the password of a protected xla (have not tested this for any other extensions). Tip: create a backup before you do this.

The steps I took:

  1. Open the vba in the hex editor (for example XVI)
  2. Search on this DPB
  3. Change DPB to something else, like DPX
  4. Save it!
  5. Reopen the .xla, an error message will appear, just continue.
  6. You can now change the password of the .xla by opening the properties and go to the password tab.

I hope this helped some of you!

Seitz answered 29/1, 2018 at 9:9 Comment(1)
I was successful opening an old .xls using this on Windows 10 in the latest version of Excel 365, while the top answer is unfortunately not working anymore. I downloaded HxD and changed the last letter like recommended, and skipped the errors. All good now, thanks!Jehoshaphat
D
1

If you work in Java you may try VBAMacroExtractor. After extracting VBA scripts from .xlsm I've found there password in plaintext.

Dole answered 8/4, 2018 at 13:37 Comment(0)
R
0

your excel file's extension change to xml. And open it in notepad. password text find in xml file.

you see like below line;

Sheets("Sheet1").Unprotect Password:="blabla"

(sorry for my bad english)

Roaster answered 5/6, 2017 at 10:43 Comment(3)
Can you explain how your answer is better than the very good ones already provided?Shotwell
my solution has not a code. so very compact solution other than.Roaster
This solution you have provided does not work in 2019.Dol
S
0

One simple way to remove VBA project password is to do the following:

  1. Convert xlsm file into zip
  2. open the VBAProject.bin file inside (i prefer to use Notepad++ (https://notepad-plus-plus.org/downloads/)
  3. Search for DPB field
  4. Replace it with DPx
  5. Save file
  6. conver the zip file into xlsm
  7. open the excel file
  8. Click yes if you get a message box
  9. set a new password for the VBA project properties
  10. close and open the file again
  11. type your new password to unprotect
Sedge answered 12/12, 2022 at 6:58 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.