Удаление или восстановление пароля проекта VBA [дубликат]

Дважды нажмите кнопку «Вход» в NETBEANS или добавьте прослушиватель событий при событии Click (ActionListener)

btnLogin.addActionListener(new ActionListener() 
{
    public void actionPerformed(ActionEvent e) {
        this.setVisible(false);
        new FrmMain().setVisible(true); // Main Form to show after the Login Form..
    }
});
386
задан ashleedawg 27 June 2018 в 13:16
поделиться

21 ответ

Вы можете попробовать этот прямой подход 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. Если пользователь вводит неверный пароль или нажимает Отмена, эта функция возвращает 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 и наслаждайтесь .
554
ответ дан Mathieu Guindon 16 August 2018 в 10:23
поделиться
  • 1
    Кажется, не работает в 64-битных версиях офиса. – Chris 25 February 2015 в 22:17
  • 2
    @ Крис, ты абсолютно прав. Потому что функции Windows API определены для выигрыша 32 в этом коде. – Đức Thanh Nguyễn 25 February 2015 в 22:21
  • 3
    Некоторое объяснение было бы хорошим, как это работает. – Dennis G 21 March 2015 в 13:53
  • 4
    Теперь остался единственный вопрос (после того, как этот впечатляющий метод работает отлично), насколько я могу сделать проект VBA более защищенным, чтобы другие не могли использовать этот хак на нем :) – EranG 25 January 2016 в 13:01
  • 5
    Этот код отлично работает при разблокировке кода VBA, хотя каждый раз, когда я использовал это, он не позволяет мне повторно защищать проект с помощью другого пароля, есть ли у кого-нибудь еще эта проблема? – Matthew Bond 21 November 2016 в 13:49

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

31
ответ дан Andy 16 August 2018 в 10:23
поделиться
  • 1
    это не так, я работал с файлами, для которых преобразование в xls / xla из xlsm было невозможно, Excel 2007 и 2010 разбились каждый раз, я пробовал разные экземпляры, из одного сообщения erros - Kod wyjątku: c0000005 Przesunięcie wyjątku: 005d211d – Qbik 17 June 2014 в 08:02
  • 2
    Да, ты можешь сделать это. Я делал это много раз. Если на листе есть что-то, что необходимо и что не передано в более старую версию, я делаю это: 1. конвертировать .xlsm в .xls 2. расколоть код .xls 3. конвертировать .xlsm в .xlsx 4. Поместить код из модулей в .xls в .xlsx и сохранить его как .xlsm – ZygD 1 October 2015 в 18:45
  • 3
    Он работает после преобразования xlsm в xls, как в ответе. – Purus 3 February 2017 в 08:08

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

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

Сводка шагов:

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

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

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

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


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

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

5
ответ дан ashleedawg 16 August 2018 в 10:23
поделиться

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

3
ответ дан Charles Duffy 16 August 2018 в 10:23
поделиться

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

2
ответ дан Chris Spicer 16 August 2018 в 10:23
поделиться

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

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

  1. Создайте новый простой файл excel.
  2. В части VBA установите простой пароль (скажем - 1234).
  3. Сохранить файл и выйти. Затем проверьте размер файла - см. . Stewbob's gotcha
  4. Откройте файл, который вы только что создали, с помощью шестнадцатеричного редактора.
  5. Скопируйте строки, начинающиеся со следующих клавиш:
    CMG=....
    DPB=...
    GC=...
    
  6. FIRST BACKUP файл excel, для которого вы не знаете пароль VBA, затем откройте его с помощью шестнадцатеричного редактора и вставьте указанные выше скопированные строки из фиктивного файла.
  7. Сохранить файл excel и выйти.
  8. Теперь откройте файл excel, который вам нужен, чтобы увидеть код VBA. Пароль для кода VBA будет просто 1234 (как в примере, который я показываю здесь ).

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

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

200
ответ дан Community 16 August 2018 в 10:23
поделиться
  • 1
    Что делать, если нет строк, начинающихся с CMG = ...? – systemovich 2 September 2009 в 14:03
  • 2
    В пустом файле excel или в заблокированном? Проверьте размер файла пустого файла. Если его заблокированный файл, убедитесь, что ваша резервная копия в безопасности, а затем попробуйте изменить только две другие строки. Вы уверены, что это зашифрованный файл? – Colin Pickard 2 September 2009 в 14:43
  • 3
    В пустом файле. Остальные две строки тоже не отображаются. Это также работает в Excel 2007? Я использовал HEdit. – systemovich 2 September 2009 в 14:51
  • 4
    Это xlsm, с макросъемкой. – systemovich 2 September 2009 в 15:25
  • 5
    Защита паролем Excel 2007 (и формат файла) радикально отличается от Excel 2003. Я включил некоторые особенности в мой ответ ниже. На мой взгляд, опция защиты паролем в файле Excel 2007 впервые в истории Microsoft Office позволяет создать безопасный файл. – Stewbob 10 September 2010 в 18:42

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

вы видите, как показано ниже,

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

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

0
ответ дан Developer33 16 August 2018 в 10:23
поделиться
  • 1
    Можете ли вы объяснить, как ваш ответ лучше, чем те, которые уже были предоставлены? – Noel Widmer 5 June 2017 в 11:09
  • 2
    у моего решения нет кода. поэтому очень компактное решение, кроме. – Developer33 6 June 2017 в 11:32

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

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

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

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

0
ответ дан Edwin van der V 16 August 2018 в 10:23
поделиться

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

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

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

11
ответ дан greg 16 August 2018 в 10:23
поделиться

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

0
ответ дан Grez 16 August 2018 в 10:23
поделиться

Я построил фантастический ответ Đức Thanh Nguyễn, чтобы этот метод работал с 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
    

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

122
ответ дан kaybee99 16 August 2018 в 10:23
поделиться
  • 1
    Отлично работает, спасибо! ;) Для других, убедитесь, что вы не читаете слишком быстро и пропустите шаг «и запустите его», lol. : P (у меня еще не было моего кофе, так что дайте мне перерыв lol) – James Wilkins 26 April 2016 в 17:16
  • 2
    Позор - но это приводит к сбою в работе 64-битного файла Excel 2016, когда я его пытаюсь. – GodEater 20 August 2016 в 14:34
  • 3
    Это приводит к сбою моего 64-разрядного 64-разрядного Excel. :-( – Maxime 10 January 2017 в 21:26
  • 4
    Не работает, я получаю сообщение out of memory. – Mundi 27 October 2017 в 19:48
  • 5
    @ Marcucciboy2 2010 64-бит. – Zev Spitz 18 July 2018 в 13:50

Я попробовал некоторые из вышеперечисленных решений, и ни один из них не работает для меня (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
2
ответ дан Luboš Suk 16 August 2018 в 10:23
поделиться
  • 1
    Ницца! Я думаю, у вас есть один downvote, потому что ваше решение разблокирует рабочий лист, а не модуль VBA. Тем не менее я счел это полезным - так спасибо! – PBD10017 16 April 2016 в 18:05
  • 2
    Это правильный ответ на неправильный вопрос. – brettdj 8 May 2016 в 00:12
  • 3
    У меня есть это моя личная книга. Авторы цитировали Боба Маккормика в качестве оригинального автора, позже модифицированного Норманном Харкером и Дж. МакГимпси 2002 года. – Charles Byrne 18 April 2018 в 19:53

Для типа файла .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. Закрыть и снова откроется, и ваш новый пароль будет работать.
38
ответ дан Matt 16 August 2018 в 10:23
поделиться
  • 1
    Работает в Excel 2016, Windows 10 64bit. (файлы xlsm) – LimaNightHawk 11 October 2016 в 13:16
  • 2
    Работала в Word 2016, Windows 10 64bit (dotm-файлы) – NBajanca 8 September 2017 в 13:11
  • 3
    Отличное решение, работало для меня в Excel 2013 64 бит. Вы можете пропустить изменение расширений файлов до .zip, если у вас установлен 7-Zip . В этом случае вы можете просто щелкнуть правой кнопкой мыши по файлу .xlsm и выбрать "7-Zip - & gt; Открыть архив & quot; – nkatsar 20 June 2018 в 09:31

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

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

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

157
ответ дан MD XF 16 August 2018 в 10:23
поделиться
  • 1
    Этот метод отлично справился с файлом Excel 2000 .xls. – jtolle 30 November 2010 в 02:29
  • 2
    К сожалению, это не сработало для меня с Excel для Mac 2011 v14.2.5. Я получил возможность отредактировать файл, а не сбросить пароль, и эффект потерял все сценарии VBA. – Joe Carroll 15 December 2012 в 12:49
  • 3
    Идеальное решение. Я сделал это с файлом 2003, используя HxD Hex Editor – Chris W 4 February 2013 в 16:26
  • 4
    Я просто попробовал (.xls, Excel 2007), и это не сработало. Результат: Модули видны, код действительно работает, но при открытии модуля он сообщает непредвиденную ошибку (40230) . – KekuSemau 22 June 2013 в 18:07
  • 5
    Такая же ошибка здесь (Excel 2010) - но потом я понял, что пропустил «установить новый пароль и сохранить / снова открыть» (шаги 7-9) от Pieter. – Owen B 15 August 2013 в 12:08

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

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

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

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

3
ответ дан Scoob 16 August 2018 в 10:23
поделиться

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

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

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

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

5
ответ дан SheetJS 16 August 2018 в 10:23
поделиться

Если ваш блок 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.

7
ответ дан Spangen 16 August 2018 в 10:23
поделиться
  • 1
    Это работает, но, как я недавно обнаружил (прокомментировал выше), вы также можете просто добавить нулевые символы после окончательной закрывающей цитаты в GC = & quot; ... & quot; до тех пор, пока вы не достигнете той же длины. – tobriand 20 July 2013 в 12:21

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

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

EDIT

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

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

59
ответ дан Stewbob 16 August 2018 в 10:23
поделиться
  • 1
    Затем вам нужно использовать стандартные инструменты для взлома zip. Его больше не «как вернуть файл excel», проблема. – Anonymous Type 27 September 2010 в 23:37
  • 2
    @Anonymous Тип: Я думаю, что инструмент для взлома zip не поможет. Поскольку я понимаю Stewbob, это не записи файлов в zip-файле, которые зашифрованы, а весь файл zip, который должен включать заголовок и центральный каталог. – Treb 28 September 2010 в 07:58
  • 3
    Просто любопытно: как это могло быть RSA, когда я просто вводил один пароль (симметричный)? – kizzx2 2 February 2011 в 19:58
  • 4
    Как насчет того, когда у файла, в который вы хотите попасть, есть более короткие клавиши? Просто продолжайте создавать документы vba, пока не получите тот, у которого есть 137? – onlynone 5 October 2015 в 19:43
  • 5
    Вы уверены, что весь zipfile зашифрован при блокировке проекта VBA? Я все еще могу открыть zip-файл и посмотреть структуру файла .... И вложенная папка xl \ содержит файл vbaProject.bin , который имеет знакомый «CMG = ... GC =». хеширующий блок. – Nigel Heffernan 19 October 2017 в 15:10

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

1
ответ дан Treb 16 August 2018 в 10:23
поделиться

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

10
ответ дан user3761175 16 August 2018 в 10:23
поделиться
  • 1
    Я могу подтвердить, что это работает для .xlam-файлов с Excel 2010. +1! – Gimelist 27 October 2014 в 15:17

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

7
ответ дан Yuhong Bao 16 August 2018 в 10:23
поделиться
  • 1
    Следующая ссылка содержит подробную информацию о файлах формата XSLM. gbanik.blogspot.co.uk/2010/08/… Решение такое же, как и описанное Yuhong Bao выше, но делает интересное чтение и включает скриншоты. – JohnLBevan 19 July 2012 в 11:51