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

416

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

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

  • 0
    Можете ли вы сохранить .xls вместо .xla, как показывают примеры в вашей ссылке? Не уверен, что это будет иметь значение.
  • 2
    хорошо известно: xlsb надежен против взлома паролей
Показать ещё 1 комментарий
Теги:
excel-vba
excel
passwords

22 ответа

564
Лучший ответ

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

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

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

Ищете 64-битную версию? См. https://stackoverflow.com/questions/1026483/is-there-a-way-to-crack-the-password-on-an-excel-vba-project

как это устроено

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

  1. VBE вызовет системную функцию для создания диалогового окна пароля.
  2. Если пользователь вводит правильный пароль и нажимает ОК, эта функция возвращает 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 и наслаждайтесь.

  • 4
    Кажется, не работает на 64-битных версиях офиса.
  • 3
    @ Крис, ты абсолютно прав. Потому что функции Windows API определены для win 32 в этом коде.
Показать ещё 16 комментариев
196

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

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

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

    CMG=....
    DPB=...
    GC=...
    
  • FIRST BACKUP файл excel, для которого вы не знаете пароль VBA, затем откройте его с помощью шестнадцатеричного редактора и вставьте указанные выше скопированные строки из фиктивного файла.

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

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

EDIT Февраль 2015: для другого метода, который выглядит очень многообещающим, посмотрите этот новый ответ на Đức Тхань Нгуен.

  • 0
    Что если нет строк, начинающихся с CMG = ...?
  • 1
    В пустом файле excel или заблокированном? Проверьте размер файла пустого файла. Если это заблокированный файл, убедитесь, что ваша резервная копия в безопасности, а затем попробуйте изменить только две другие строки. Вы уверены, что это зашифрованный файл?
Показать ещё 13 комментариев
166

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

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

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

  • 0
    Этот метод отлично работал в файле Excel 2000 .xls.
  • 3
    К сожалению, это не сработало для меня с Excel для Mac 2011 v14.2.5. Я получил возможность восстановить файл, а не сбросить пароль, и в результате были потеряны все сценарии VBA.
Показать ещё 10 комментариев
134

Я построил на Đức Thanh Nguyễn фантастический ответ, чтобы этот метод работал с 64-разрядными версиями Excel. Я запускаю 64-разрядную версию Excel 2010 в 64-разрядной версии Windows 7.

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

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

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

  • 0
    Я использовал этот код для удаления пароля проекта VBA из одного из моих очень старых файлов надстроек Excel (.xla), и он работал очень хорошо. Большое спасибо!
  • 4
    Работает отлично, спасибо! ;) Для других, не читайте слишком быстро и пропустите шаг "и запустите его", смеется. : P (у меня еще не было кофе, так что дайте мне передохнуть)
Показать ещё 15 комментариев
63

Колин Пикард имеет отличный ответ, но с этим "один из них". Есть примеры (я еще не выяснил причину), где общая длина записи "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 и просмотреть содержимое файла.

  • 0
    Тогда вам нужно использовать стандартные инструменты для взлома почтовых индексов. Это больше не проблема «как мне вернуть файл Excel».
  • 3
    @ Аноним Тип: Я думаю, что инструмент для взлома почтовых индексов не поможет. Как я понимаю, Stewbob зашифровывают не записи в zip-файле, а весь сам zip-файл, который должен включать заголовок и центральный каталог.
Показать ещё 3 комментария
44

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

  1. Измените расширение файла .xlsm на .zip.
  2. Откройте ZIP файл (с WinZip или WinRar и т.д.) И перейдите в папку xl.
  3. Извлеките файл vbaProject.bin и откройте его в Hex-редакторе (я использую HxD, его полностью свободный и легкий).
  4. Найдите DPB и замените DPx и сохраните файл.
  5. Замените старый файл vbaProject.bin этим новым в zip файле.
  6. Измените расширение файла на .xlsm.
  7. Открытая рабочая книга пропускает предупреждения.
  8. Откройте Visual Basic внутри Excel.
  9. Откройте "Инструменты"> "Свойства VBAProject"> вкладка "Защита".
  10. Вставьте новый пароль и сохраните файл .xlsm.
  11. Закройте и снова откройте, и ваш новый пароль будет работать.
  • 7
    Работал в Excel 2016, Windows 10 64bit. (файлы xlsm)
  • 2
    Работал в Word 2016, Windows 10 64bit (точечные файлы)
Показать ещё 4 комментария
34

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

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

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

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

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

11

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

  • 1
    Я могу подтвердить, что это работает и для файлов .xlam в Excel 2010. +1!
8

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

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

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

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

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

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

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


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

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

8

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

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

Колин Пикард в основном прав, но не путайте "пароль для открытия" защиты всего файла с помощью защиты паролем 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 выше, но делает его интересным для чтения и содержит скриншоты.
6

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

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

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

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

4

С моей стороны, это основано на превосходном ответе 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
    
4

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

4

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

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

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

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

3

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

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

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. Тем не менее я нашел это полезным - так что спасибо!
  • 18
    Это правильный ответ на неправильный вопрос.
Показать ещё 1 комментарий
3

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

2

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

  • 6
    Больше не действует с новыми форматами.
0

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

0

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

Сделанные мной шаги:

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

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

0

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

вы видите строку ниже;

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

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

  • 0
    Можете ли вы объяснить, насколько ваш ответ лучше, чем те, которые уже были предоставлены?
  • 0
    мое решение не имеет кода. очень компактное решение, кроме.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню