Есть ли способ взломать пароль в проекте Excel VBA?

меня попросили обновить некоторые макросы Excel 2003, но проекты VBA защищены паролем, и, похоже, отсутствует документация... никто не знает паролей.

есть ли способ удалить или взломать пароль в проекте VBA?

21 ответов


вы можете попробовать это direct VBA подход, который не требует редактирования hex. Он будет работать для любых файлов (*.xls,*.xlsm,*.или xlam ...).

проверено и работает на

Excel 2007
Excel 2010
Excel 2013 -32-битная версия.
Excel 2016 -32-битная версия.

ищете 64-битную версию? См.https://stackoverflow.com/a/31005696/4342479

как это работает

Я постараюсь объяснить, как это работает-пожалуйста, извините мой английский.

  1. VBE вызовет системную функцию для создания диалогового окна пароля.
  2. если пользователь вводит правильный пароль и нажимает OK, эта функция возвращает 1. Если пользователь вводит неправильный пароль или нажмите кнопку Cancel, то функция возвращает 0.
  3. после закрытия диалогового окна VBE проверяет возвращаемое значение системная функция
  4. если это значение равно 1, VBE будет "думать", что пароль правильный, поэтому будет открыт заблокированный проект VBA.
  5. приведенный ниже код меняет местами память исходной функции, используемой для отображения диалогового окна пароля с пользовательской функцией, которая всегда возвращает 1 при вызове.

С помощью кода

  1. откройте файл(ы), содержащий заблокированный VBA Проекты
  2. создайте новый файл xlsm и сохраните этот код в Модуль1

    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. вставить этот код в module2 и и запустить его

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    
  4. вернитесь к своим проектам VBA и наслаждайтесь.


Да есть, пока вы используете .xls формат электронной таблицы (по умолчанию для Excel до 2003 года). Для Excel 2007 и далее значение по умолчанию .xlsx, который является довольно безопасным форматом, и этот метод не будет работать.

как говорит Треб, это простое сравнение. Один из способов-просто поменять пароль в файле с помощью шестнадцатеричного редактора (см. шестнадцатеричные редакторы для Windows). Шаг за шагом, пример:

  1. создать новый простой excel файл.
  2. в части VBA установите простой пароль (скажем - 1234).
  3. сохраните файл и выйдите. затем проверьте размер файла - см. Стьюбоб поймал тебя
  4. открыть созданный файл с HEX-редактором.
  5. скопируйте строки, начинающиеся со следующих клавиш:

    CMG=....
    DPB=...
    GC=...
    
  6. ПЕРВАЯ РЕЗЕРВНАЯ КОПИЯ файл excel, для которого вы не знаете пароль VBA, затем откройте его с помощью hex editor, и вставьте выше скопированные строки из фиктивного файла.

  7. сохраните файл excel и закройте его.
  8. теперь откройте файл excel, в котором вам нужно увидеть код VBA. Пароль для кода VBA будет просто 1234 (как в Примере, который я показываю здесь).

Если вам нужно работать с Excel 2007 или 2010, ниже приведены некоторые другие ответы, которые могут помочь, в частности:1, 2, 3.

редактировать Feb 2015: для другого метода, который выглядит очень многообещающим, посмотрите на этот новый ответ by đ .c Thanh Nguyễn.


есть еще одно (несколько более простое) решение, без проблем с размером. Я использовал этот подход сегодня (в файле 2003 XLS, используя Excel 2007) и был успешным.

  1. резервное копирование файла xls
  2. откройте файл в шестнадцатеричном редакторе и найдите DPB=... часть
  3. изменить DPB=... строка DPx=...
  4. откройте файл xls в Excel
  5. откройте редактор VBA (ALT + F11)
  6. магия: Excel обнаруживает недопустимый ключ (DPx) и спрашивает, Хотите ли вы продолжить загрузку проекта (в основном игнорируя защиту)
  7. вы сможете перезаписать пароль, поэтому измените его на то, что вы можете запомнить
  8. сохранить файл xls*
  9. закройте и откройте документ и работайте с VBA magic!

*Примечание: убедитесь, что вы изменили пароль на новый значение, в противном случае при следующем открытии электронной таблицы Excel сообщит об ошибках (непредвиденная ошибка), то при доступе к списку модулей VBA теперь вы увидите имена исходных модулей, но получите еще одну ошибку при попытке открыть формы/код/и т.д. Чтобы исправить это, вернитесь к свойствам проекта VBA и установите пароль в новое значение. Сохранить и повторно откройте документ Excel, и вы должны быть хорошо идти!


Я построил на фантастический ответ-Дук Нгуен Тхань разрешить этот метод для работы с 64-разрядными версиями Excel. Я запускаю Excel 2010 64-разрядный на 64-разрядной Windows 7.

  1. откройте файлы, содержащие заблокированные проекты VBA.
  2. создайте новый файл xlsm и сохраните этот код в Модуль1

    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. вставить этот код в module2 и и запустить это

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

отказ от ответственности это сработало для меня, и я задокументировал это здесь в надежде, что это поможет кому-то. я не полностью протестировал его. Пожалуйста, не забудьте сохранить все открытые файлы, прежде чем приступить к этой опции.


Колин Пикард имеет отличный ответ, но есть один "осторожно" с этим. Есть случаи (я еще не выяснил причину), где общая длина "CMG=........СБОРЩИК МУСОРА.=..."запись в файле отличается от одного файла excel к другому. В некоторых случаях эта запись будет 137 байт, а в других-143 байта. Длина 137 байт является нечетной, и если это происходит при создании файла с паролем "1234", просто создайте другой файл, и он должен перейти к длине 143 байт.

Если вы попытаетесь вставить неправильное количество байтов в файл, Вы потеряете свой проект VBA при попытке открыть файл с помощью Excel.

редактировать

Это недопустимо для файлов Excel 2007/2010. Стандарт. xlsx формат файла на самом деле.zip-файл, содержащий многочисленные подпапки с форматированием, макетом, контентом и т. д., хранящиеся в виде xml-данных. Для незащищенного файла Excel 2007 вы можете просто изменить его .файлы XLSX расширение .zip, затем откройте zip-файл и просмотрите все xml-данные. Все очень просто.

однако, когда вы защищаете паролем файл Excel 2007, весь .промелькнуть.( xlsx) файл фактически зашифрован с помощью шифрования RSA. Изменить расширение на более невозможно .ZIP и просматривать содержимое файла.


на .xlsm или .dotm тип файла вам нужно сделать, это немного по-другому.

  1. изменить расширение до .zip.
  2. открыть .zip-файл (с WinZip или WinRar и т. д.) и перейдите в папку xl.
  3. извлечь vbaProject.bin файл и откройте его в шестнадцатеричном редакторе (я использую HxD, его полностью свободный и легкий.)
  4. искать DPB и заменить на DPx и сохранить файл.
  5. заменить старый vbaProject.bin файл с этим новым в файле zipped.
  6. измените расширение файла на .xlsm.
  7. открыть книгу пропустить предупреждающие сообщения.
  8. откройте Visual Basic внутри Excel.
  9. перейдите на вкладку Инструменты > свойства VBAProject > защита.
  10. введите новый пароль и сохраните .
  11. закрыть и снова открыть и ваш новый пароль будет работа.

стоит отметить, что если у вас есть файл Excel 2007 (xlsm), то вы можете просто сохранить его как файл Excel 2003 (xls) и использовать методы, описанные в других ответах.


вы пытались просто открыть их в OpenOffice.org?

некоторое время назад у меня была аналогичная проблема, и я обнаружил, что Excel и Calc не понимали шифрования друг друга и поэтому разрешали прямой доступ почти ко всему.

Это было давно, так что если это не было просто случайностью с моей стороны, это также могло быть исправлено.


для Excel 2007 и далее вам нужно изменить расширение файла .застежка-молния В архиве есть подпапка xl, в которой вы найдете vbaProject.бункер. Выполните шаг выше с vbaProject.bin затем сохраните его обратно в архив. Измените свое расширение и вуаля! (значение выполните шаги выше)


Колин Пикард в основном прав, но не путайте защиту "пароль для открытия" для всего файла с защитой паролем VBA, которая полностью отличается от предыдущей и одинакова для Office 2003 и 2007 (для Office 2007 переименуйте файл .застегните молнию и ищите vbaProject.Бен внутри zip). И что технически правильный способ редактирования файла-использовать Ole compound document viewer, такой как CFX, чтобы открыть правильный поток. Конечно, если вы просто замена байтов, простой старый двоичный редактор может работать.

кстати, если вам интересно узнать точный формат этих полей, они уже задокументировали его:

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


В случае, если ваш блок CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" в вашем файле "известный пароль" короче, чем существующий блок в файле "неизвестный пароль", поместите свои шестнадцатеричные строки с конечными нулями, чтобы достичь правильной длины.

например

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

в файле неизвестного пароля должно быть установлено значение

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" для сохранения длины файла.

у меня также была эта работа .Файлы XLA (формат 97/2003) в office 2007.


пароли проекта VBA на документах Access, Excel, Powerpoint или Word (2007, 2010, 2013 or 2016 версии с расширениями .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) может быть легко удалены.

это просто вопрос изменения расширения имени .ZIP распакуйте файл и с помощью любого шестнадцатеричного редактора (например,XVI32), чтобы" сломать "существующий пароль, который" путает " Office, поэтому он запрашивает новый пароль при следующем открытии файла.

A сводка шагов:

  • переименуйте файл, чтобы он имел

если файл является допустимым zip-файлом (первые несколько байтов 50 4B -- используется в таких форматах, как .xlsm), затем распакуйте файл и найдите вложенный файл xl/vbaProject.bin. Это файл CFB так же, как .xls файлы. Следуйте инструкциям для формата XLS (применяется к вложенному файлу), а затем просто zip содержимое.

для формата XLS вы можете следовать некоторым другим методам в этом сообщении. Я лично предпочитаю искать DPB= блок и заменить текст

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

с пробелами. Это устраняет проблемы с размером контейнера CFB.


Tom-я сделал ошибку школьника изначально, поскольку я не смотрел размер байта, а вместо этого скопировал и вставил из "CMG", настроенного на последующую запись. Это были два разных размера текста между двумя файлами, и я потерял проект VBA, как и предупреждал Стьюбоб.

используя HxD, есть счетчик, отслеживающий, сколько файлов вы выбираете. Скопируйте начиная с CMG, пока счетчик не прочитает 8F (hex для 143), а также при вставке в заблокированный файл - я закончил в два раза больше "...- в конце пасты, которая выглядела как-то странно и казалась почти неестественной, но сработала.

Я не знаю, важно ли это, но я убедился, что закрыл как hex-редактор, так и excel, прежде чем снова открыть файл в Excel. Затем мне пришлось пройти через меню, чтобы открыть редактор VB, в свойства VBProject и ввести "новый" пароль для разблокировки кода.

надеюсь, это поможет.


ElcomSoft делает Расширенный Office Password Breaker и Advanced Office Password Recovery продукты, которые могут применяться в этом случае, если документ был создан в Office 2007 или ранее.


Я пробовал некоторые из решений выше, и ни один из них не работает для меня (файл excel 2007 xlsm). Затем я нашел другое решение, которое даже получить пароль, а не просто взломать его.

вставьте этот код в модуль, запустите его и дайте ему некоторое время. Он восстановит ваш пароль грубой силой.

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

мой инструмент VbaDiff, читает VBA непосредственно из файла, поэтому вы можете использовать его для восстановления защищенного кода VBA из большинства офисных документов, не прибегая к шестнадцатеричному редактору.


защита представляет собой простое сравнение текста в Excel. Загрузка Excel в свой любимый отладчик (Ollydbg будучи моим инструментом выбора), найдите код, который выполняет сравнение, и исправьте его, чтобы всегда возвращать true, это должно позволить вам получить доступ к макросам.


расширение вашего файла excel изменится на xml. И откройте его в блокноте. текст пароля найти в xml-файле.

вы видите, как ниже линии;

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

(извините за мой плохой английский)


для Excel 2016 64-бит на машине Windows 10 я использовал шестнадцатеричный редактор, чтобы иметь возможность изменять пароль защищенного xla (не тестировали это для любых других расширений). Совет: создайте резервную копию перед этим.

шаги, которые я взял:

  1. откройте vba в шестнадцатеричном редакторе (например, XVI)
  2. поиск на этом DPB
  3. измените DPB на что-то другое, например DPX
  4. сохранить его!
  5. открыть .расширениями XLA, появится сообщение об ошибке, просто продолжайте.
  6. теперь вы можете изменить пароль .xla, открыв свойства и перейдите на вкладку пароль.

надеюсь, это помогло некоторым из вас!


Если вы работаете в Java вы можете попробовать VBAMacroExtractor. После извлечения скриптов VBA из .xlsm Я нашел там пароль в открытом виде.