Windows10標準環境(デフォルト環境)のみでマクロのロック解除

(動作せず。ダメ)

0 準備

たとえば、対象として「locked.xlsm」ファイルを解除したいなら、名前の変更で「locked.xlsm.zip」に変更し、ダブルクリックで解凍し、xlフォルダ内のvbaProject.binファイルに対して変更処理を行うためのコードをchatGpt4に教えてもらう。

 

1 Bing(ChatGpt4)への質問

Vbscriptでバイナリファイル内の文字列DPBを文字列APBに変更して上書き保存するコードは?文字列の長さは同じことが前提で良いからコードは短い記載でお願い。変数名は長くても良いから分かりやすく命名して。コード内のコメントは各行について、小学生でも分かるくらい優しくお願い。起動の前提があれば詳細に説明して。

 

2回答

こんにちは、これはBingです。Vbscriptでバイナリファイル内の文字列DPBを文字列APBに変更して上書き保存するコードについてお答えします。

まず、バイナリファイルを読み書きするには、ADODB.Stream1というオブジェクトを使います。このオブジェクトは、バイナリデータをBytesという型のオブジェクトで扱います。しかし、この型はVBScriptにとって標準的な型ではなく、生成や編集ができない、配列っぽくて配列ではない扱いにくいものです。

そこで、MSXML2.DOMDocument2というオブジェクトを使って、Bytes16進数文字列の相互変換を行います。このオブジェクトは、XMLを扱うものですが、DataTypebin.hexとすると、バイナリデータと16進数文字列の変換ができます。16進数文字列は単なる文字列なので、Replace3という関数で文字列の置換ができます。

以下のコードは、vbaProject.binというファイルを読み込んで、16進数文字列に変換し、DPBという文字列をAPBに置換して、同じファイルに上書き保存するものです。コード内のコメントは各行の処理を説明しています。

 

3コード

' バイナリファイルを読み込む関数
Function ReadBinaryFile(FileName)
    ' ADODB.Streamオブジェクトを作る
    Dim Stream
    Set Stream = CreateObject("ADODB.Stream")
    ' バイナリモードにする
    Stream.Type = 1
    ' ファイルを開く
    Stream.Open
    ' ファイルを読み込む
    Stream.LoadFromFile FileName
    ' バイト配列としてデータを取得する
    ReadBinaryFile = Stream.Read
    ' ファイルを閉じる
    Stream.Close
    ' オブジェクトを破棄する
    Set Stream = Nothing
End Function

' バイナリファイルを書き込む関数
Function WriteBinaryFile(FileName, Data)
    ' ADODB.Streamオブジェクトを作る
    Dim Stream
    Set Stream = CreateObject("ADODB.Stream")
    ' バイナリモードにする
    Stream.Type = 1
    ' ファイルを開く
    Stream.Open
    ' バイト配列としてデータを書き込む
    Stream.Write Data
    ' ファイルに保存する
    Stream.SaveToFile FileName, 2
    ' ファイルを閉じる
    Stream.Close
    ' オブジェクトを破棄する
    Set Stream = Nothing
End Function

' バイト配列を16進数文字列に変換する関数
Function ConvertBytesToHexString(Data)
    ' MSXML2.DOMDocumentオブジェクトを作る
    Dim Dom
    Set Dom = CreateObject("MSXML2.DOMDocument").createElement("temp")
    ' DataTypeをbin.hexにする
    Dom.DataType = "bin.hex"
    ' バイト配列をNodeTypedValueに代入する
    Dom.NodeTypedValue = Data
    ' Textを16進数文字列として取得する
    ConvertBytesToHexString = Dom.Text
    ' オブジェクトを破棄する
    Set Dom = Nothing
End Function

' 16進数文字列をバイト配列に変換する関数
Function ConvertHexStringToBytes(Data)
    ' MSXML2.DOMDocumentオブジェクトを作る
    Dim Dom
    Set Dom = CreateObject("MSXML2.DOMDocument").createElement("temp")
    ' DataTypeをbin.hexにする
    Dom.DataType = "bin.hex"
    ' 16進数文字列をTextに代入する
    Dom.Text = Data
    ' NodeTypedValueをバイト配列として取得する
    ConvertHexStringToBytes = Dom.NodeTypedValue
    ' オブジェクトを破棄する
    Set Dom = Nothing
End Function

' ファイル名を指定する
Dim FileName
FileName = "vbaProject.bin"

' ファイルを読み込んでバイト配列にする
Dim Bytes
Bytes = ReadBinaryFile(FileName)

' バイト配列を16進数文字列に変換する
Dim HexString
HexString = ConvertBytesToHexString(Bytes)

' 16進数文字列のDPBをAPBに置換する
HexString = Replace(HexString, "445042", "415042")

' 16進数文字列をバイト配列に変換する
Bytes = ConvertHexStringToBytes(HexString)

' ファイルに書き込む
WriteBinaryFile(FileName, Bytes)

4 注意

 このコードは、文字列の長さが同じであることが前提です。もし文字列の長さが異なる場合は、16進数文字列の長さやファイルのサイズも変わるので、それに合わせて調整する必要があります。

 また、このコードは、vbaProject.binというファイルが存在することと、そのファイルがCompound File Binary Formatというファイル形式であることが前提です。もし別のファイルやファイル形式を扱う場合は、それに合わせて調整する必要があります。

 このコードは、Vbscriptの標準機能とADODB.Stream1MSXML2.DOMDocument2というオブジェクトを使っています。これらのオブジェクトは、Windowsの標準コンポーネントとしてインストールされていると思いますが、もしインストールされていない場合は、別途インストールする必要があります。

 以上が、Vbscriptでバイナリファイル内の文字列DPBを文字列APBに変更して上書き保存するコードの説明です。ご参考になれば幸いです。😊

 

5 感想 vbaProject.binのフルパスに書き換える必要がある。