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

486

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

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

Джонатан Сэйс
источник
Вы можете сохранить .xls вместо .xla, как показывают примеры в вашей ссылке? Не уверен, что это будет иметь значение.
B Hart
4
хорошо известно: xlsb устойчив к взлому паролей
Qbik
20
@ Fandango68 Этот вопрос обсуждался несколько лет назад на мета . TLDR: Многие (большинство?) Вопросы о SO могут быть использованы плохими участниками, но если нет явных доказательств неправомерных действий, мы предполагаем добросовестность. Существует множество законных и этических причин взломать пароль VBA. Кроме того, обсуждение слабых мест существующих систем в конечном итоге способствует повышению безопасности в будущем и не позволяет людям слепо полагаться на небезопасные системы сейчас.
jmbpiano

Ответы:

701

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

Протестировано и работает на:

Excel 2007
Excel 2010
Excel 2013 - 32-разрядная версия
Excel 2016 - 32-разрядная версия

Ищете 64-битную версию? Смотрите этот ответ

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

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

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

Используя код

Пожалуйста, сделайте резервную копию ваших файлов в первую очередь!

  1. Откройте файл (ы), которые содержат ваши заблокированные проекты VBA
  2. Создайте новый файл 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. Вставьте этот код под вышеуказанным кодом в Module1 и запустите его

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

Thc Тхань Нгуен
источник
4
@ Крис, ты абсолютно прав. Потому что функции Windows API определены для win 32 в этом коде.
Đức Тхань Нгуен
8
Было бы неплохо объяснить, как это работает.
Деннис G
20
Теперь остается только один вопрос (увидев, что этот впечатляющий метод работает отлично), как, черт возьми, я могу сделать свой проект VBA более защищенным, чтобы другие не могли использовать этот хак для него :)
EranG
6
Этот код прекрасно работает для разблокировки кода VBA, хотя каждый раз, когда я его использую, он не позволяет мне повторно защищать проект с помощью другого пароля, была ли у кого-нибудь еще эта проблема?
Мэтью Бонд
2
Я обнаружил, что это повреждает проект VBA в файле Excel, поэтому мне пришлось экспортировать все модули / классы, затем сохранить файл как xlsx (не-макрос), затем ЗАКРЫТЬ файл (глупый Excel), затем снова открыть, затем импортировать модули и копировать код из файлов классов. На этом этапе я мог сохранить файл как xlsm со своим собственным паролем в проекте VBA.
BH
217

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

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

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

    CMG=....
    DPB=...
    GC=...
  6. Первое резервное копирование копию файла Excel, для которого вы не знаете пароль VBA, затем откройте его в своем шестнадцатеричном редакторе и вставьте скопированные выше строки из фиктивного файла.

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

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

РЕДАКТИРОВАТЬ Февраль 2015: для другого метода, который выглядит очень многообещающим, посмотрите на этот новый ответ Đức Thanh Nguyễn.

Колин Пикард
источник
Что если нет строк, начинающихся с CMG = ...?
Systemovich
1
В пустом файле excel или заблокированном? Проверьте размер файла пустого файла. Если это заблокированный файл, убедитесь, что ваша резервная копия в безопасности, а затем попробуйте изменить только две другие строки. Вы уверены, что это зашифрованный файл?
Колин Пикард
6
Защита паролем в Excel 2007 (и формат файла) радикально отличается от Excel 2003. Я включил некоторые подробности об этом в свой ответ ниже. На мой взгляд, опция защищенная паролем для файла Excel 2007 - это первый случай в истории Microsoft Office, когда они создали достаточно безопасный файл.
Stewbob
1
Я не смог установить пароль VBA для нового файла Excel 2016 года. Может ли кто-нибудь просто поделиться HEX с заменой на 1234? Или это может измениться от машины к машине?
Мескалито
1
Этот подход работал для меня на файл .xlsm. Я сохранил его как .xls, сделал это, а затем преобразовал обратно в .xlsm. Следует отметить, что вы можете безопасно увеличить длину файла, если новая CMG...строка длиннее оригинальной.
Дрю Чапин
173

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

  1. Откройте файл (ы), которые содержат ваши заблокированные проекты VBA.
  2. Создайте новый файл xlsm и сохраните этот код в 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. Вставьте этот код в Module2 и запустите его

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

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Это сработало для меня, и я задокументировал это здесь в надежде, что это кому-нибудь поможет. Я не полностью проверил это . Пожалуйста, сохраните все открытые файлы, прежде чем продолжить с этой опцией.

kaybee99
источник
1
Я не уверен, почему, но когда я запускаю это в Excel для 365 MSP 64-битных сбоев Excel, он закрывает файлы, и когда я перезапускаю его, пароль все еще там.
Eborbath
Это не может быть сделано в Excel больше, поскольку параметры в контекстном меню отображаются серым цветом, поэтому вы не можете создать модуль.
thanos.a
170

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

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

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

Pieter
источник
3
К сожалению, это не сработало для меня с Excel для Mac 2011 v14.2.5. Я получил возможность восстановить файл, а не сбросить пароль, и в результате были потеряны все сценарии VBA.
Джо Кэрролл
Идеальное решение - я сделал это с файлом 2003, используя HxD Hex Editor
Chris W
4
Я только что попробовал (.xls, Excel 2007), и это не сработало. Результат: модули видны, код действительно работает, но при открытии модуля появляется неожиданная ошибка (40230) .
KekuSemau
2
Та же ошибка здесь (Excel 2010) - но потом я понял, что пропустил «установить новый пароль и сохранить / открыть» (шаги 7-9) из Pieter.
Оуэн Б
+1 Этот метод также работал с нашим плохо разработанным файлом доступа (.mdb)! Теперь мы можем сделать это лучше, спасибо за это!
Эр Габриэль Доронила
65

У Колина Пикарда отличный ответ, но есть один «настороже» с этим. Есть случаи (я еще не выяснил причину), где общая длина записи "CMG = ........ GC = ...." в файле отличается от одного файла Excel до следующий. В некоторых случаях эта запись будет 137 байтов, а в других - 143 байта. Длина 137 байт является нечетной, и если это происходит при создании файла с паролем «1234», просто создайте другой файл, и он должен перейти к длине 143 байта.

Если вы попытаетесь вставить в файл неправильное количество байтов, вы потеряете ваш проект VBA, когда попытаетесь открыть файл в Excel.

РЕДАКТИРОВАТЬ

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

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

Stewbob
источник
Тогда вам нужно использовать стандартные инструменты для взлома почтовых индексов. Это больше не проблема «как мне вернуть файл Excel».
Анонимный тип
3
@ Аноним Тип: Я думаю, что инструмент взлома почтовых индексов не поможет. Как я понимаю, Stewbob зашифровывают не записи в zip-файле, а весь сам zip-файл, который должен включать заголовок и центральный каталог.
Треб
2
Просто любопытно: как может быть RSA, когда я просто ввожу один пароль (симметричный)?
kizzx2
Как насчет того, когда файл, в который вы хотите попасть, имеет более короткие ключи? Просто продолжайте создавать документы VBA, пока не получите тот, который имеет 137?
только
1
Вы уверены, что весь zip-файл шифруется при блокировке проекта VBA? Я все еще могу открыть zipfile и увидеть структуру файла .... И подпапка xl \ содержит файл vbaProject.bin, который имеет знакомый блок хеширования "CMG = ... GC =".
Найджел Хеффернан
63

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

  1. Измените расширение .xlsmфайла на .zip.
  2. Откройте файл .zip (с помощью WinZip или WinRar и т. Д.) И перейдите в папку xl.
  3. Извлеките vbaProject.binфайл и откройте его в Hex Editor (я использую HxD , он совершенно бесплатный и легкий).
  4. Найдите DPBи замените DPxи сохраните файл.
  5. Замените старый vbaProject.binфайл на новый в архивном файле.
  6. Измените расширение файла обратно на .xlsm.
  7. Открытая рабочая книга пропускает предупреждающие сообщения.
  8. Откройте Visual Basic внутри Excel.
  9. Перейдите в Инструменты> Свойства VBAProject> Вкладка Защита.
  10. Введите новый пароль и сохраните .xlsmфайл.
  11. Закройте и снова откройте, и ваш новый пароль будет работать.
Matt
источник
8
Работал в Excel 2016, Windows 10 64bit. (xlsm файлы)
LimaNightHawk
3
Работал в Word 2016, Windows 10 64bit (точечные файлы)
NBajanca
7
Отличное решение, работало для меня в Excel 2013 64 бит. Вы можете пропустить изменение расширений файлов, .zipесли у вас установлен 7-Zip . В этом случае вы можете просто щелкнуть правой кнопкой мыши по .xlsmфайлу и выбрать «7-Zip -> Открыть архив»
nkatsar
работает с Word 2013, win7x64. (Это очень грустно, так легко обмануть себя, чтобы поверить, что код несколько безопасен).
Ягода Цакала
1
@ThierryMichel Сочетание предыдущих решений и проб и ошибок!
Мэтт
35

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

Энди
источник
4
это неправда, я работал с файлами, для которых преобразование в xls / xla из xlsm было невозможно, Excel 2007 и 2010 аварийно завершали работу каждый раз, я пробовал разные экземпляры, из одного сообщения об ошибке - Kod wyjątku: c0000005 Przesunięcie wyjątku: 005d211d
Qbik
4
Да, ты можешь сделать это. Я делал это много раз. Если на листах есть что-то необходимое, а что не перенесено в более старую версию, я делаю это: 1.конвертирую .xlsm в .xls, взломаю 2.код .xls, 3.конвертирую .xlsm в .xlsx. 4.Поместите код из модулей в .xls в. xlsx и сохраните его как .xlsm
ZygD
Это работает после преобразования xlsm в xls как в ответе.
Purus
32

С моей стороны, это основано на превосходном ответе kaybee99, который основан на фантастическом ответе Тхана Нгуйена, чтобы этот метод мог работать как с версиями Office для x86, так и для amd64.

Обзор того, что изменилось, мы избегаем push / ret, который ограничен 32-битными адресами, и заменяем его на mov / jmp reg.

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

Word / Excel 2016 - 32-битная версия .
Word / Excel 2016 - 64-битная версия .

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

  1. Откройте файл (ы), которые содержат ваши заблокированные проекты VBA.
  2. Создайте новый файл того же типа, что и выше, и сохраните этот код в 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. Вставьте этот код в Module2 и запустите его

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
VePe
источник
3
Отлично! Работа с Windows Server 2016, Excel 2016 32 бита
Зин Мин
Это работало над файлом .xlsm в Excel Office 365. Спасибо!
Райан Джеймс
Все еще работает в 2019 году, Office 365 64bit последние сборки, классные ребята!
XavierAM
Спасибо за обновленный код, я столкнулся со сбоями при запуске предыдущей версии (64-битной), но все хорошо с вашей версией
emjaySX
Потрясающе ... Отлично
сработало
17

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

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

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

Greg
источник
15

В случае, если ваш блок 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.

Spangen
источник
1
Это работает, но, как я недавно обнаружил (прокомментировал выше), вы также можете просто добавить нулевые символы после последней закрывающей кавычки в блоке GC = "...", пока не достигнете той же длины.
тобриан
13

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

user3761175
источник
1
Я могу подтвердить, что это работает и для файлов .xlam в Excel 2010. +1!
Gimelist
12

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

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

Краткое изложение шагов:

  • переименуйте файл, чтобы он имел .ZIP расширение.
  • открыть ZIP и перейдите в XLпапку.
  • экстракт vbaProject.bin и открыть его с помощью Hex Editor
  • «Поиск и замена», чтобы «заменить все», изменяя DPBнаDPX .
  • Сохраните изменения, поместите .bin файл обратно в zip, верните его в нормальное расширение и откройте файл как обычно.
  • ALT + F11, чтобы войти в VB Editor и щелкнуть правой кнопкой мыши в Project Explorer, чтобы выбрать VBA Project Properties .
  • На Protection вкладке Установить новый пароль.
  • щелчок OK , закройте файл, снова откройте его, нажмите ALT + F11.
  • Введите новый пароль, который вы установили.

На этом этапе вы можете полностью удалить пароль, если захотите.

Полные инструкции с пошаговым видео, которое я сделал «когда-то», находятся на YouTube здесь .

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


Мораль этой истории?

Пароли проекта Microsoft Office VBA не должны использоваться для обеспечения безопасности любой конфиденциальной информации . Если важна безопасность, используйте стороннее программное обеспечение для шифрования.

ashleedawg
источник
9

Колин Пикард в основном прав, но не путайте защиту «пароль для открытия» для всего файла с защитой паролем VBA, которая полностью отличается от предыдущей и одинакова для Office 2003 и 2007 (для Office 2007 переименуйте файл в .zip и найдите vbaProject.bin внутри zip). И что технически правильный способ редактировать файл - это использовать средство просмотра составных документов OLE, такое как CFX, чтобы открыть правильный поток. Конечно, если вы просто заменяете байты, может работать обычный старый бинарный редактор.

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

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

Юйхонг Бао
источник
2
Следующая ссылка содержит подробную информацию о файлах формата XSLM. gbanik.blogspot.co.uk/2010/08/… Решение такое же, как и описанное Yuhong Bao выше, но делает его интересным для чтения и включает скриншоты.
JohnLBevan
7

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

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

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

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

SheetJS
источник
7

Я попробовал некоторые из решений выше, и ни одно из них не работает для меня (файл 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
Любош Сук
источник
1
Ницца! Я думаю, что вы получили одно отрицание, потому что ваше решение разблокирует рабочий лист, а не модуль VBA. Тем не менее я нашел это полезным - так что спасибо!
PBD10017
1
У меня есть это моя личная рабочая тетрадь. Авторы цитировали Боба Маккормика как оригинального автора, позже измененного Норманом Харкером и Дж. МакГимпси 2002.
Чарльз Бирн
5

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

Чарльз Даффи
источник
4

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

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

Я не знаю, насколько это важно, но я убедился, что закрыл и шестнадцатеричный редактор, и выключил Excel, прежде чем снова открыть файл в Excel. Затем мне пришлось пройти через меню, чтобы открыть VB Editor, в VBProject Properties и ввести «новый» пароль, чтобы разблокировать код.

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

Scoob
источник
4

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

Крис Спайсер
источник
У меня есть тесты на этот инструмент, и он работает очень хорошо, однако бесплатная версия возвращает первые 53 строки. Чтобы восстановить мой файл, я должен был следовать инструкциям Энди, чтобы разблокировать пароль. Затем я открыл свой xlsm с VbaDiff на обеих панелях, а затем щелкнул лист с моим кодом. Я получил его с помощью copy-paste и поместил в восстановленный, но vba-пустой файл Excel.
thanos.a
2

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

треб
источник
1

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

Шаги, которые я предпринял:

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

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

Эдвин ван дер V
источник
Я успешно открыл старый .xls, используя это в Windows 10 в последней версии Excel 365, хотя, к сожалению, верхний ответ больше не работает. Я скачал HxD и изменил последнюю букву, как рекомендовано, и пропустил ошибки. Все хорошо, спасибо!
Старнс Студент
0

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

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

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

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

Developer33
источник
Можете ли вы объяснить, насколько ваш ответ лучше, чем те, которые уже были предоставлены?
Ноэль Видмер
мое решение не имеет кода. очень компактное решение, кроме.
Developer33
1
Это решение, которое вы предоставили, не работает в 2019 году.
Daniel L. VanDenBosch
Это не работает для меня ни в офисе 365
thanos.a
0

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

Грез
источник