【VBA】VBAProjectパスワードを解除する

本ページはプロモーションが含まれています

理由はさておきVBAのパスワードを解除したいことありませんか?

古くはバイナリエディタを使ってパスワードを強制変更している時代もありましたが今はプログラム実行するだけで解除できます

悪用厳禁ではありますが困った時はお試しください

※解除に使うプログラムは下部にあります

解除手順

細かい操作みたいなものはないのでサクッと手順をまとめました

パスワード解除手順
  • STEP1
    パスワード解除したいエクセルファイルを開く

    とりあえず対象ファイルを開いておきます

  • STEP2
    新規ファイルを作成

    プログラムを実行するためのファイルを作ります

  • STEP3
    新規ファイルでモジュールを作成

    新規ファイルに標準モジュールを挿入して所定のプログラムを貼り付ける

    (プログラムは下部にあります)

  • STEP4
    貼り付けたプログラムを実行

    無事プログラム実行できれば解除完了!

    パスワードを入力しないと展開されないはずのプロジェクトが開けるようになっています

操作動画

手順を動画化しただけですが文字だけで伝わらない時は参考にどうぞ

注意点

この手順を使っても完全にパスワード解除することはできません

上書き保存をしたとしてもファイルを閉じて開きなおすとまたパスワードが適用されているので”パスワードを解除する”と言うより”こっそり見る”方がしっくりするかもしれないです

“Screenpresso”のPR

↑のように画面操作を動画にするなら”Screenpresso”がオススメです!

https://www.screenpresso.com/ja

保護解除プログラム

実際に使うプログラムはコチラなのでコピペでどうぞ↓↓

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
   
Private 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
   
Public Sub VBAProjectパスワード解除()
  If Hook Then
    MsgBox "VBAProjectのパスワード解除成功!", vbInformation, "Congratulations"
  End If
End Sub

あとがき

VBAパスワード解除方法は調べればいくつか方法があるようですが、こんかいの方法が一番簡単な気がします

コメント

タイトルとURLをコピーしました