Excel VBAプロジェクトでパスワードを解読する方法はありますか?


486

一部のExcel 2003マクロを更新するように求められましたが、VBAプロジェクトはパスワードで保護されており、ドキュメントが不足しているようです...誰もパスワードを知りません。

VBAプロジェクトでパスワードを削除またはクラックする方法はありますか?


リンクの例が示すように、.xlaではなく.xlsとして保存できますか?これが違いを生むかどうかはわかりません。
B Hart

4
知っておきたいこと:xlsbはパスワードクラッキングトリックに対して堅牢
Qbik

20
@ Fandango68この質問はメタで数年前に議論されました。TLDR:SOに関する質問の多く(ほとんど?)は悪意のある人物によって悪用される可能性がありますが、不正行為の明確な証拠がない限り、私たちは誠意を持っています。VBAパスワードを解読する正当な法的および倫理的な理由はたくさんあります。さらに、現在のシステムの弱点を議論することは、最終的には将来のより良いセキュリティに貢献し、人々が安全でないシステムに今すぐ盲目的に依存することを思いとどまらせます。
jmbpiano 2018年

回答:


701

VBAHEX編集を必要としないこの直接的なアプローチを試すことができます。任意のファイル(* .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プロジェクトに戻って楽しんでください。


4
@クリスあなたは絶対的に正しいです。これは、Windows API関数がwin 32に対してこのコードで定義されているためです。
–ĐứcThanhNguyễn2015

8
これがどのように機能するかについて、いくつかの説明がいいでしょう。
Dennis G

20
(この印象的な方法が完全に機能することを確認した後)残っている唯一の質問は、他の人がこのハックを使用できないようにVBAプロジェクトをどのように強力に保護できるかです:)
EranG

6
このコードはVBAコードのロックを解除するのに完全に機能しますが、これを使用するたびに別のパスワードでプロジェクトを再保護することができなくなりますが、他の誰かがこの問題を抱えていませんか?
マシューボンド

2
ExcelファイルのVBAプロジェクトが破損していることがわかったので、すべてのモジュール/クラスをエクスポートしてから、ファイルをxlsx(非マクロ)として保存し、ファイルを閉じて(愚かなExcel)、再度開き、モジュールをインポートし、クラスファイルからコードをコピーします。この時点で、VBAプロジェクトで自分のパスワードを使用して、ファイルをxlsmとして保存できます。
BH

217

はい、.xlsフォーマットスプレッドシートを使用している限り、あります(2003年までのExcelのデフォルト)。Excel 2007以降の場合、デフォルトは.xlsxであり、これはかなり安全な形式であり、この方法は機能しません。

Trebが言うように、これは単純な比較です。1つの方法は、16進エディターを使用してファイル内のパスワードエントリを単純に交換することです(Windowsの16進エディターを参照)。ステップバイステップの例:

  1. 新しい単純なExcelファイルを作成します。
  2. VBAの部分で、単純なパスワード(たとえば-1234)を設定します。
  3. ファイルを保存して終了します。次に、ファイルサイズを確認します-Stewbobの注意点を参照してください
  4. 作成したファイルを16進エディターで開きます。
  5. 次のキーで始まる行をコピーします。

    CMG=....
    DPB=...
    GC=...
    
  6. VBAパスワードがわからないExcelファイルを最初にバックアップし、それを16進エディターで開いて、ダミーファイルからコピーした上記の行を貼り付けます。

  7. Excelファイルを保存して終了します。
  8. ここで、VBAコードを表示するために必要なExcelファイルを開きます。VBAコードのパスワードは、単純に1234になります(ここに示す例のように)。

:は、Excel 2007または2010で作業する必要がある場合は、特にこれらの、役立つかもしれないその下にいくつかの他の回答がある123

2015年2月の編集:非常に有望に見える別の方法については、ĐứcThanhNguyễnによるこの新しい答えを見てください。


CMG = ...で始まる行がない場合はどうなりますか?
systemovich 2009

1
空のExcelファイル、またはロックされたファイル?ブランクファイルのファイルサイズを確認してください。ファイルがロックされている場合は、バックアップが安全であることを確認してから、他の2行だけを変更してみてください。暗号化されたファイルですか?
Colin Pickard

6
Excel 2007のパスワード保護(およびファイル形式)は、Excel 2003とは根本的に異なります。以下の回答に、いくつかの詳細を含めました。私の意見では、Excel 2007ファイルのパスワードで保護されたオプションは、Microsoft Officeの歴史の中で、安全性の高いファイルを作成したのは初めてです。
Stewbob

1
Excel 2016の新しいファイルにvbaパスワードを設定できませんでした。誰かがHEXを共有して1234に置き換えることはできますか?または、マシンごとに変更できますか?
メスカリト2016

1
このアプローチは、.xlsmファイルで機能しました。私はそれを.xlsとして保存し、これを実行してから、.xlsmに変換し直しました。新しいCMG...文字列が元の文字列よりも長い場合は、ファイルの長さを安全に増やすことができることに注意してください。
ドリュー

173

このメソッドを64ビットバージョンのExcelで動作させるために、builtc ThanhNguyễnの素晴らしい答えを基に作成しました。Excel 2010 64ビットを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 for 365 MSP 64ビットのExcelでこれを実行するとクラッシュし、ファイルが閉じて再起動してもパスワードが残っています。
eborbath

コンテキストメニューのオプションがグレー表示され、モジュールを作成できないため、Excelでこれを行うことはできません。
thanos.a

170

サイズの問題のない別の(やや簡単な)解決策があります。私はこの方法を(2003 XLSファイルで、Excel 2007を使用して)使用し、成功しました。

  1. xlsファイルをバックアップする
  2. HEXエディターでファイルを開き、DPB=...パーツを見つけます。
  3. 変更DPB=...に文字列をDPx=...
  4. Excelでxlsファイルを開く
  5. VBAエディターを開く(ALT+ F11
  6. 魔法: Excelが無効なキー(DPx)を検出し、プロジェクトの読み込みを続行するかどうかを尋ねます(基本的に保護を無視します)
  7. パスワードを上書きできるので覚えやすいものに変更
  8. xlsファイルを保存します*
  9. ドキュメントを閉じて再度開き、VBAマジックを操作します。

*注意:パスワードを必ず新しい値に変更してください。そうしないと、次にスプレッドシートを開いたときにExcelでエラー(予期しないエラー)が報告され、VBAモジュールのリストにアクセスすると、名前が表示されます。ソースモジュールがフォーム/コード/などを開こうとすると、別のエラーを受け取ります。これを修正するには、VBAプロジェクトプロパティに戻り、パスワードを新しい値に設定します。Excelドキュメントを保存して再度開くと、問題ありません。


3
残念ながら、これはExcel for Mac 2011 v14.2.5では機能しませんでした。パスワードをリセットするのではなく、ファイルを修復するオプションがあり、その結果、すべてのVBAスクリプトが失われました。
Joe Carroll

完璧な解決策-HxD Hex Editorを使用した2003ファイルでこれを行いました
Chris W

4
試してみましたが(.xls、Excel 2007)、機能しませんでした。結果は次のとおりです。モジュールは表示されますが、コードは実際には機能しているようですが、モジュールを開くと、予期しないエラー(40230)が表示されます。
KekuSemau 2013年

2
ここでも同じエラー(Excel 2010)ですが、Pieterからの「新しいパスワードの設定と保​​存/再開」(手順7〜9)をスキップしたことに気付きました。
オーウェンB

+1この方法は、開発が不十分なアクセス(.mdb)ファイルでも機能しました!これで感謝します!
Er Gabriel Doronila、2014

65

Colin Pickardは素晴らしい答えを持っていますが、これには「注意」が1つあります。ファイルの「CMG = ........ GC = ....」エントリの全長が1つのExcelファイルと異なる場合があります(原因はまだわかりません)。次。このエントリは137バイトになる場合もあれば、143バイトになる場合もあります。137バイトの長さは奇妙な長さです。これが「1234」パスワードでファイルを作成するときに発生する場合は、別のファイルを作成するだけで、143バイトの長さにジャンプします。

間違ったバイト数をファイルに貼り付けようとすると、Excelでファイルを開こうとすると、VBAプロジェクトが失われます。

編集

これは、Excel 2007/2010ファイルでは無効です。標準の.xlsxファイル形式は、実際には、フォーマット、レイアウト、コンテンツなどを含む多数のサブフォルダーを含む.zipファイルであり、xmlデータとして保存されます。保護されていないExcel 2007ファイルの場合は、拡張子.xlsxを.zipに変更してから、zipファイルを開いてすべてのxmlデータを確認します。とても簡単です。

ただし、Excel 2007ファイルをパスワードで保護すると、.zip(.xlsx)ファイル全体がRSA暗号化を使用して実際に暗号化されます。拡張子を.zipに変更してファイルの内容を参照することはできなくなりました。


次に、標準のzipハッキングツールを使用する必要があります。「Excelファイルを元に戻す方法」の問題はなくなりました。
匿名タイプ

3
@匿名タイプ:zipクラッキングツールは役に立たないと思います。Stewbobを理解しているように、暗号化されているのはzipファイルのファイルエントリではなく、ヘッダーと中央ディレクトリを含むzipファイル全体です。
Treb

2
気になるのは、1つのパスワード(対称)だけを入力すると、RSAになるのはなぜですか
kizzx2

取得したいファイルのキーが短い場合はどうでしょうか?137のドキュメントを取得するまで、vbaドキュメントを作成し続けますか?
15年

1
VBAプロジェクトをロックすると、zipファイル全体が暗号化されますか?それでもzipfileを開いてファイル構造を見ることができます。そして、サブフォルダーxl \には、おなじみの "CMG = ... GC ="ハッシュブロックを持つファイルvbaProject.binが含まれています 。
Nigel Heffernan 2017年

63

以下のため.xlsmか、.dotmファイルの種類、あなたはそれを少し異なる方法を行う必要があります。

  1. .xlsmファイルの拡張子をに変更します.zip
  2. (WinZipまたはWinRarなどで).zipファイルを開き、xlフォルダーに移動します。
  3. vbaProject.binファイルを抽出して16進エディターで開きます(私はHxDを使用しています。完全に無料で軽量です)。
  4. ファイルDPBを検索して置換しDPx、保存します。
  5. 古いvbaProject.binファイルを、zipファイル内のこの新しいファイルに置き換えます。
  6. ファイル拡張子をに戻します.xlsm
  7. ワークブックを開いて、警告メッセージをスキップします。
  8. Excel内でVisual Basicを開きます。
  9. [ツール]> [VBAProjectプロパティ]> [保護]タブに移動します。
  10. 新しいパスワードを入力して.xlsmファイルを保存します。
  11. 閉じて再度開くと、新しいパスワードが機能します。

8
Excel 2016、Windows 10 64ビットで作業しました。(xlsmファイル)
LimaNightHawk 2016年

3
Word 2016、Windows 10 64ビット(dotmファイル)で
作業

7
Excel 2013 64ビットで私のために働いた素晴らしい解決策。7-Zipがインストールされ.zipている場合は、ファイル拡張子の変更をスキップできます。この場合、ファイルを右クリックして「7-.xlsm
Zip-

Word 2013、win7x64で動作します。(これは非常に悲しいことであり、コードがある程度安全であると信じるのは簡単に騙されます)
ベリーTsakala

1
@ThierryMichel以前のソリューションと試行錯誤の組み合わせ!
マット

35

Excel 2007(xlsm)ファイルがある場合、それをExcel 2003(xls)ファイルとして保存し、他の回答で概説されている方法を使用できることを指摘する価値があります。


4
それは真実ではありません、xlsmからxls / xlaへの変換が不可能なファイルで作業しました、Excel 2007および2010は毎回クラッシュしました、1つのエラーメッセージからさまざまなインスタンスを試しました-Kodwyjątku:c0000005Przesunięciewyjątku: 005d211d
Qbik

4
はい、できます。何度もやった。シートに必要なものがあり、古いバージョンに転送されないものがある場合、これを行います1.。.xlsmを.xlsに変換します。.xls 2.のコードをクラックします3.。.xlsmを.xlsxに変換4.します。モジュールからのコードを.xlsから。 xlsx、それを.xlsmとして保存
ZygD

それは答えのようにxlsmをxlsに変換した後に機能します。
Purus

32

私の番では、これはkaybee99の優れた答えに基づいて構築されています。これは、ĐứcThanhNguyễnの素晴らしい答えに基づいて構築されており、Officeのx86バージョンとamd64バージョンの両方でこのメソッドを使用できます。

変更点の概要。32ビットアドレスに制限されているpush / retを回避し、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
パーフェクト!32ビットのWindowsサーバー2016やExcel 2016での作業
ツィン分

これはExcel Office 365の.xlsmファイルで機能しました。ありがとうございます。
Ryan James

2019年も引き続き機能し、Office 365 64ビットの最新ビルド、素晴らしい人たち!
XavierAM

更新されたコードのおかげで、私は以前のバージョン(64ビット)を実行するとクラッシュに直面しましたが、すべてのバージョンで
問題ありません

恐ろしい...完全に働いた
Mahhdy

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" ファイルの長さを保持します。

また、Office 2007でこれを.XLA(97/2003形式)ファイルで処理しました。


1
これは機能しますが、最近発見したとおり(上記のコメント)、GC = "..."ブロックの最後の終了引用符の後に、同じ長さに達するまでnull文字を追加することもできます。
tobriand 2013

13

Excel 2007以降の場合、ファイル拡張子を.zipに変更する必要があります。アーカイブにはサブフォルダーxlがあり、そこにvbaProject.binがあります。上記の手順に従ってvbaProject.binを実行し、アーカイブに保存します。拡張機能を元に戻し、失敗します。(上記の手順に従うことを意味します)


1
Excel 2010でも.xlamファイルでこれが機能することを確認できます。+1!
ギメリスト2014年

12

Access、Excel、Powerpoint、またはWordドキュメント(2007, 2010, 2013 or 2016拡張子付きのバージョン.ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM)のVBAプロジェクトパスワードは簡単に削除できます。

これは単に、ファイル名拡張子をに変更し、ファイルを.ZIP解凍し、基本的な16進エディター(XVI32など)を使用して既存のパスワードを「解読」するだけです。これにより、Officeが「混乱」し、ファイルが次に使用されたときに新しいパスワードの入力を求められます。開いた。

手順の概要:

  • ファイルの名前を変更して、.ZIP拡張子を付けます。
  • を開き、フォルダにZIP移動しXLます。
  • vbaProject.binHex Editorで抽出して開きます
  • 「検索と置換」に変更し、「すべて置換」DPBDPX
  • 変更を保存し、.binファイルをzipに戻し、通常の拡張子に戻して、通常のようにファイルを開きます。
  • Alt + F11キーを押してVBエディターに入り、プロジェクトエクスプローラーで右クリックしてを選択しますVBA Project Properties
  • 上のProtectionタブ、新しいパスワードを設定します。
  • をクリックしてOK、ファイルを閉じ、再度開き、Alt + F11キーを押します。
  • 設定した新しいパスワードを入力します。

この時点で、必要に応じてパスワードを完全に削除できます。

詳細な手順私が作ったステップバイステップのビデオで「いつ戻って道を」上にあるYouTubeのここ

この回避策が何年にもわたって存在していて、Microsoftが問題を修正していないことは、一種のショックです。


物語の教訓?

Microsoft Office VBAプロジェクトのパスワードは機密情報のセキュリティのために信頼されるべきではありません。セキュリティが重要な場合は、サードパーティの暗号化ソフトウェアを使用してください。


9

Colin Pickardはほぼ正しいですが、ファイル全体の「開くパスワード」保護とVBAパスワード保護を混同しないでください。VBAパスワード保護は、以前のものとは完全に異なり、Office 2003および2007でも同じです(Office 2007の場合は、名前を変更します)ファイルを.zipし、zip内のvbaProject.binを探します)。そして、技術的にファイルを編集する正しい方法は、CFXのようなOLE複合ドキュメントビューアを使用して正しいストリームを開くことです。もちろん、バイトを置き換えるだけの場合は、通常のバイナリエディタが機能する場合があります。

ところで、これらのフィールドの正確な形式について疑問に思っている場合は、ここで文書化されています。

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


2
次のリンクは、XSLMフォーマットファイルの詳細を示しています。gbanik.blogspot.co.uk/2010/08/…このソリューションは、上記のYuhong Bao氏が概説したものと同じですが、興味深い読み物となり、スクリーンショットが含まれています。
JohnLBevan '19 / 07/19

7

ファイルが有効なzipファイルである場合(最初の数バイトは50 4B-などの形式で使用されます.xlsm)、ファイルを解凍してサブファイルを探しますxl/vbaProject.bin。これは、ファイルと同様にCFBファイル.xlsです。XLS形式(サブファイルに適用)の指示に従い、内容を圧縮します。

XLS形式については、この投稿の他の方法のいくつかに従うことができます。私は個人的にDPB=ブロックを検索してテキストを置き換えることを好みます

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

空白スペースあり。これにより、CFBコンテナーのサイズの問題が回避されます。


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モジュールではなくワークシートのロックを解除するので、あなたは1つの反対票を得たと思います。それにもかかわらず、私はそれが役に立ったと思った-だからありがとう!
PBD10017

1
これは私の個人用ワークブックです。著者らは、後にノーマンハーカーとJEマクギンプジーによって修正された原作者としてボブマコーミックを引用しました。2002
チャールズバーン

5

ElcomSoftは、ドキュメントがOffice 2007以前で作成されている限り、このケースに該当する可能性があるAdvanced Office Password BreakerおよびAdvanced Office Password Recovery製品を製造しています。


4

トム-バイトサイズを確認しなかったため、最初に男子生徒のエラーが発生しました。代わりに、「CMG」設定から次のエントリにコピーして貼り付けました。ただし、これは2つのファイル間で2つの異なるテキストサイズであり、Stewbobが警告したように、VBAプロジェクトを失いました。

HxDを使用すると、選択しているファイルの量を追跡するカウンターがあります。CMGからコピーして、カウンターが8F(143の場合は16進数)を読み取るまで、そして同様にロックされたファイルに貼り付けるときにコピーします-貼り付けの最後に「...」の数が2倍になりました。不自然ですが、うまくいきました。

それが重要かどうかはわかりませんが、ファイルをExcelで再び開く前に、16進エディターとExcelの両方をシャットダウンしたことを確認しました。次に、メニューを操作してVBエディターを開き、VBProjectのプロパティに移動し、「新しい」パスワードを入力してコードのロックを解除しました。

これがお役に立てば幸いです。


4

私のツールVbaDiffはファイルから直接VBAを読み取るため、このツールを使用して、16進エディターに頼ることなく、ほとんどのオフィスドキュメントから保護されたVBAコードを復元できます。


私はこのツールを試してみましたが、本当にうまくいきますが、無料版は最初の53行を取得します。ファイルを復元するには、Andyの指示に従ってパスワードをロック解除する必要がありました。次に、両方のペインでVbaDiffを使用してxlsmを開き、コードを含むシートをクリックしました。私はそれをコピーして貼り付けて、回復したがvbaが空のExcelファイルに入れました。
thanos.a

2

保護は、Excelでの単純なテキスト比較です。お気に入りのデバッガーでExcelを読み込み(Olydbgが私の選択ツールです)、比較を行うコードを見つけ、常にtrueを返すように修正します。これにより、マクロにアクセスできるようになります。


1

Windows 10マシン上の64ビットのExcel 2016の場合、保護されたxlaのパスワードを変更できるように16進エディターを使用しました(他の拡張機能でこれをテストしていません)。 ヒント:これを行う前にバックアップを作成してください。

私が取った手順:

  1. 16進エディタ(XVIなど)でvbaを開きます。
  2. このDPBで検索
  3. DPBをDPXなどの他のものに変更する
  4. それを保存!
  5. .xlaを再度開くと、エラーメッセージが表示されます。続行してください。
  6. プロパティを開いて[パスワード]タブに移動すると、.xlaのパスワードを変更できます。

これが皆さんのお役に立てば幸いです。


最新のExcel 365のWindows 10でこれを使用して古い.xlsを正常に開くことができましたが、残念ながらトップの回答はもう機能していません。HxDをダウンロードして、最後の文字を推奨のように変更し、エラーをスキップしました。よろしくお願いいたします。
Starnes Student

0

Excelファイルの拡張子がxmlに変更されます。そしてそれをメモ帳で開きます。パスワードテキストはxmlファイルで見つかります。

以下のように見えます。

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

(私の悪い英語でごめんなさい)


あなたの答えが、すでに提供されている非常に良いものよりどのように優れているか説明できますか?
Noel Widmer 2017年

私のソリューションにはコードがありません。それ以外はとてもコンパクトなソリューションです。
Developer33

1
あなたが提供したこのソリューションは、2019年では動作しません
ダニエル・L. VanDenBosch

それは私にとっても
Office

0

あなたが働いているJavaなら、あなたは試すことができますVBAMacroExtractor。VBAスクリプトを抽出した後.xlsm、プレーンテキストのパスワードが見つかりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.