Python の oletools で日本語の VBA を出力する方法
VBA はどこにある?
以下の記事がとても参考になる。
マクロの実体は vbaProject.bin というバイナリファイルの中にあるらしく、これを解析すると VBA を取得することができる。
このファイルは Compound File Binary Format というファイル形式で仕様は効果されているらしい。
時間があるときに確認してみたい。
[MS-CFB]: Compound File Binary File Format
oletools で VBA を出力する方法
vbaProject.bin を自分で解析して VBA を出力するのは大変なので oletools というライブラリを使用する。
このライブラリは olefile というパーサを使いやすくしたもの。
ただし、このライブラリで VBA を出力すると以下の記事にもあるように日本語は文字化けをしてしまう。
ExcelマクロのVBAソースコードをAzure DevOpsでバージョン管理する方法
この記事では extract_macros を自作することで対応をしていたが、以下のように bytes2str を置き換えることでも日本語することができた。
記述量も少なく手軽に実行できるので記事にしておく。
import os
import oletools.olevba as vba
# ------------------------------------------------------------------
# 定数
OUT_DIR = "./out"
"""出力するフォルダ"""
# ------------------------------------------------------------------
# 日本語出力用の設定
def _bytes2str(bytes_string: bytes, encoding="utf-8"):
# ShiftJis でデコードする
return bytes_string.decode("shift_jis", errors="replace")
# VBA を文字列に変換する関数を置き換える
vba.bytes2str = _bytes2str
# ------------------------------------------------------------------
# 処理
vba_parser = vba.VBA_Parser("./assets/sample.xlsm")
vba_modules = vba_parser.extract_all_macros() if vba_parser.detect_vba_macros() else []
for _, _, filename, contents in vba_modules:
file = os.path.join(OUT_DIR, filename + ".vb")
os.makedirs(os.path.dirname(file), exist_ok=True)
with open(file, mode="w", encoding="utf-8") as fp:
fp.write(vba.filter_vba(contents))
サンプルコードは以下に置いておく。
GitHub - uttne/how-to-output-japanese-vba-with-oletools
その他の参考
- oletools - python tools to analyze OLE and MS Office files | Decalage
- GitHub - decalage2/oletools: oletools - python tools to analyze MS OLE2 files (Structured Storage, Compound File Binary Format) and MS Office documents, for malware analysis, forensics and debugging.
- olefile
- oletools
- olefile API Reference — olefile 0.47 documentation
コメント
コメントを投稿