Чи є спосіб зламати пароль у проекті Excel VBA?


485

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

Чи є спосіб видалити або зламати пароль на проекті VBA?


Чи можете ви зберегти-як .xls замість .xla, як підказують приклади у вашому посиланні? Не впевнений, чи це призведе до зміни.
Б Харт

4
добре відомо: xlsb є надійним проти хитрощів з розірванням пароля
Qbik

20
@ Fandango68 Це питання обговорювали роки тому мета . TLDR: Багато (більшість?) Питань щодо ПС можуть зловживати поганими акторами, але, якщо немає чітких доказів правопорушень, ми вважаємо добросовісні. Для злому пароля VBA існує безліч законних та етичних причин. Крім того, обговорення слабких сторін нинішніх систем сприяє кращій безпеці в майбутньому та заважає людям сліпо покладатися на незахищені системи зараз.
jmbpiano

Відповіді:


699

Ви можете спробувати цей прямий VBAпідхід, який не потребує редагування HEX. Він буде працювати для будь-яких файлів (* .xls, * .xlsm, * .xlam ...).

Тестується та працює над:

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

Шукаєте 64-бітну версію? Дивіться цю відповідь

Як це працює

Я постараюся пояснити, як це працює - вибачте, будь ласка, мою англійську.

  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
@Chris ви абсолютно праві. Оскільки в цьому коді функції Windows API визначені для win 32.
Đức Thanh Nguyễn

8
Деякі пояснення було б добре, як це працює.
Денніс Г

20
Тепер єдине питання (після того, як цей вражаючий метод прекрасно працює) - це, як, пекло, зробити так, щоб мій проект VBA був захищений сильніше, щоб не допустити інших від цього хак-
ата

6
Цей код відмінно спрацьовує в розблокуванні коду VBA, хоча кожен раз, коли я його використовую, він перешкоджає мені повторно захистити проект іншим паролем, чи хтось ще мав цю проблему?
Меттью Бонд

2
Я виявив, що він пошкоджує проект VBA у файлі Excel, тому мені довелося експортувати всі модулі / класи, потім зберегти файл як xlsx (не макрос), потім ЗАКРИТИ файл (дурний Excel), потім знову відкрити, потім імпортувати модулі та копіювати код з файлів класу. У цей момент я міг зберегти файл у вигляді xlsm із власним паролем у проекті VBA.
BH

217

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

Як каже Треб, це просте порівняння. Один із способів - просто поміняти введення пароля у файл за допомогою шестигранного редактора (див. Hex редактори для 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: для іншого способу, який виглядає дуже перспективно, погляньте на цю нову відповідь Джуча Тхана Нгуйона.


Що робити, якщо немає рядків, які починаються з CMG = ...?
системович

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

ВІДМОВА ВІДПОВІДАЛЬНІСТЬ Це спрацювало для мене, і я задокументував це тут, сподіваючись, що це комусь допоможе. Я не повністю його перевірив . Будь ласка, не забудьте зберегти всі відкриті файли, перш ніж продовжувати цю опцію.


1
Я не впевнений, чому, але коли я запускаю цю програму в Excel для 365 MSP, збій 64-бітної версії Excel закриває файли, і коли я перезавантажую її, пароль все ще є.
eborbath

Це більше не можна робити в excel, оскільки параметри в контекстному меню виділені в сірий колір, тому ви не можете створити модуль.
thanos.a

170

Є ще одне (дещо простіше) рішення, без проблем із розмірами. Я сьогодні використовував такий підхід (у файлі XLS 2003 року, використовуючи 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, і вам слід бути готовим!


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.

EDIT

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

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


Тоді вам потрібно використовувати стандартні інструменти для злому на блискавці. Це більше не є проблемою "як мені повернути файл Excel".
Анонімний тип

3
@ Анонімний тип: Я думаю, що інструмент для розтріскування блискавок не допоможе. Як я розумію, Stewbob - це не шифровані записи в zip-файлі, а весь zip-файл, який повинен містити заголовок та центральну директорію.
Треб

2
Просто цікаво: як це могло бути RSA, коли я просто вводив один пароль (симетричний)?
kizzx2

Як щодо того, коли у файлу, в який ви хочете потрапити, є короткі клавіші? Просто продовжуйте створювати vba docs, поки не отримаєте той, у якого є 137?
onlynone

1
Ви впевнені, що весь zipfile зашифрований під час блокування проекту 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. Закрийте і знову відкрийте і ваш новий пароль запрацює.

8
Працював у Excel 2016, Windows 10 64bit. (xlsm файли)
LimaNightHawk

3
Працював у Word 2016, Windows 10 64bit (dotm файли)
NBajanca

7
Прекрасне рішення, працював для мене в 64-річному Excel 2013. Ви можете пропустити зміну розширень файлів, .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, як у відповіді.
Пурус

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

3
Ідеально! Робота з Windows Server 2016, 32-бітний Excel 2016
Zin Min

Це працювало над файлом .xlsm на Excel Office 365. Дякую!
Райан Джеймс

Все ще працює в 2019 році, Office 365 64-бітних запізнювачів будує, чудові хлопці!
XavierAM

Дякую за оновлений код, я зіткнувся з збоями під керуванням попередньої версії (64-розрядної), але все добре з вашою версією
emjaySX

Дивовижно ... Працював ідеально
Махді

17

Ви спробували просто відкрити їх на OpenOffice.org?

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

Це було деякий час тому, тож якщо це не просто мотанка з мого боку, вона також, можливо, була забита.


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) в офісі 2007 року.


1
Це працює, але, як я нещодавно виявив (коментував вище), ви також можете просто додати нульові символи після остаточної закритої цитати в блоці GC = "...", поки ви не натиснете на ту саму довжину.
tobriand

13

Для Excel 2007 потрібно змінити розширення файлу на .zip В архіві є підпапка xl, там ви знайдете vbaProject.bin. Виконайте крок вище за допомогою vbaProject.bin, а потім збережіть його назад в архіві. Змініть назад своє розширення та voilà! (тобто дотримуйтесь кроків вище)


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, розпакування файлу та використання будь-якого базового Hex Editor (наприклад, XVI32 ) для " зламання " існуючого пароля, який "плутає" Office, щоб він запросив новий пароль наступного разу, коли файл буде відкрили.

Короткий огляд етапів:

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

У цей момент ви можете повністю видалити пароль, якщо захочете.

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

Це шокує те, що цей шлях існує вже багато років, і Microsoft не вирішила проблеми.


Мораль історії?

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


9

Колін Пікард здебільшого правильний, але не плутайте захист "пароль для відкриття" для всього файлу із захистом паролем VBA, який повністю відрізняється від попереднього та є однаковим для Office 2003 та 2007 (для Office 2007, перейменуйте файл у .zip та шукайте vbaProject.bin всередині zip). І технічно правильним способом редагування файлу є використання переглядача складених документів OLE типу CFX для відкриття правильного потоку. Звичайно, якщо ви просто замінюєте байти, звичайний старий бінарний редактор може працювати.

BTW, якщо вам цікаво точний формат цих полів, вони зараз це задокументували:

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


2
Наступне посилання містить детальну інформацію про файли формату XSLM. gbanik.blogspot.co.uk/2010/08/… Рішення таке ж, як викладене Юхон Бао, але цікаве для читання та включає скріншоти.
JohnLBevan

7

Якщо файл є дійсним zip-файлом (перші кілька байтів 50 4B- використовуються у таких форматах .xlsm), то розпакуйте файл та шукайте підфайл xl/vbaProject.bin. Це файл CFB так само, як і .xlsфайли. Дотримуйтесь інструкцій щодо формату XLS (застосованих до підфайлу), а потім просто застебніть вміст.

Для формату XLS ви можете дотримуватися деяких інших методів у цій публікації. Я особисто віддаю перевагу пошуку DPB=блоку та заміні тексту

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

з порожніми пробілами. Це усуває проблеми розміру контейнерів CFB.


7

Я спробував деякі рішення вище, і жодне з них не працює на мене (відмітний файл xlsm 2007). Тоді я знайшов ще одне рішення, яке навіть отримує пароль, а не просто його зламає.

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

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
У мене це моя особиста робоча книжка. Автори цитується Боб Маккормік , як оригінальний автор пізніше модифікований Нормана Харкер і JE McGimpsey 2002
Чарльз Бірн

5

ElcomSoft створює продукти Advanced Office Breaker Password і Advanced Office Password Recovery, які можуть застосовуватися до цього випадку, якщо документ створений в Office 2007 або раніше.


4

Том - Я спочатку допустив помилку школяра, оскільки не спостерігав за розміром байтів, а замість цього скопіював та вставив з "CMG", налаштованого на наступний запис. Це було два різних розміри тексту між двома файлами, і я втратив проект VBA так само, як попередив Stewbob.

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

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

Я сподіваюся, що це допомагає.


4

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


У мене є цей тест і він працює дуже добре, проте безкоштовна версія отримує перші 53 рядки. Щоб відновити свій файл, мені довелося дотримуватися вказівок Енді, щоб розблокувати пароль. Потім я відкрив xlsm з VbaDiff на обох панелях, а потім натиснув на аркуш зі своїм кодом. Я отримав його з copy-paste і помістив її у мій відновлений, але vba-порожній файл Excel.
thanos.a

2

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


1

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

Кроки, які я вжив:

  1. Відкрийте vba в шестигранному редакторі (наприклад, XVI)
  2. Шукайте в цьому DPB
  3. Змініть DPB на щось інше, наприклад DPX
  4. Збережи це!
  5. Повторно відкрийте .xla, з’явиться повідомлення про помилку, просто продовжте.
  6. Тепер ви можете змінити пароль .xla, відкривши властивості та перейдіть на вкладку пароля.

Я сподіваюся, що це допомогло комусь із вас!


Я успішно відкрив старий .xls, використовуючи це в Windows 10 в останній версії Excel 365, тоді як головна відповідь, на жаль, більше не працює. Я завантажив HxD і змінив останній лист, як рекомендовано, і пропустив помилки. Все добре зараз, дякую!
Студент Старнес

0

змінення розширення файлу Excel на xml. І відкрийте його в блокноті. текст пароля знайти у файлі xml

ви бачите, як нижче рядка;

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

(вибачте за мою погану англійську)


Чи можете ви пояснити, наскільки ваша відповідь краща за ті, що вже були надані?
Ноель Відмер

моє рішення не має коду. настільки компактне рішення, відмінне від.
Developer33

1
Це рішення, яке ви надали, не працює в 2019 році.
Даніель Л. ВанДенБош

Це не працює для мене ні в офісі 365
thanos.a

0

Якщо ви працюєте, Javaви можете спробувати VBAMacroExtractor. Після вилучення сценаріїв VBA .xlsmя знайшов там пароль у простому тексті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.