読み取り専用パスワードがかけられた Excel ブックを総当たりで開こうとしてみる

以前の記事で紹介したとおり、シートの保護やブックの保護パスワードに関しては突破する方法があるが、「読み取り専用パスワード」に関してはバイナリの書き換えなどで突破することができない。

そうなると、パスワードを突破するには、パスワード文字列を総当たりで生成してバンバンぶつけていくしかない。上の記事で紹介した Excel UnPassword というツールも、総当たりでパスワードを突破しようとするツールだ。

今回はこの「総当たり攻撃」を利用して Excel ブックのパスワードを突破するツールを紹介する。

目次

総当たり (ブルート・フォース) とは

総当たり攻撃(そうあたりこうげき)とは、暗号解読方法のひとつで、可能な組合せを全て試すやり方。力任せ攻撃、またはカタカナでブルートフォースアタック(英:Brute-force attack)とも呼ばれる。

つーわけで、例えば1文字で「0」「1」「2」…を試したら「00」「01」「02」…、「000」「001」…と、文字長と文字の組合せをバンバン作って試していく手法。

VBScript で作りました

Excel ブックを開く処理がやりやすいのは、Excel VBA か VBScript あたり。なんとなく VBScript で作ってみたのが、「Unlock Excel Book Password」である。

読み取り専用パスワードがかけられた Excel ブックを総当たりで開こうとする VBScript である。

上の GitHub のページから、「Clone or Download」ボタンを押してもらうと、Zip ファイルでダウンロードできる。以下の使い方説明を見ながら設定して使っていただきたい。

以下、README.md の転載。

使い方

Property.txt の書き方

strings プロパティについて

探索に使用する文字列を指定できます。「hogefuga という文字列の組み合わせでパスワードを作ったと思うんだけど…」というように、ある程度使用している文字が推測できている場合は、

strings=h,o,g,e,f,u,a

というように指定すれば、これらの文字から総当たりで組み合わせの文字列を作成します。数字やその他のアルファベットなどが対象にならないので、探索時間を短縮できます。

progressStr プロパティについて

探索処理を再開するときにレジュームさせるための項目です。

例えば対象のパスワードが 00201 だったとして、数字のみの組み合わせで3桁目から探索しようとした場合は、以下のような設定項目で始めます。

min=3
max=6
strings=0,1,2,3,4,5,6,7,8,9
progressStr=

この状態でスクリプトを起動して探索を始めたものの、0900 の組み合わせ文字列を試したところでスクリプトを中断させたとします。その時は、設定ファイルを

progressStr=0900

と書き換えてスクリプトを起動することで、次回は 0901 からの組み合わせ文字列で探索を再開できます。3文字の場合の組み合わせはスキップし、4文字の場合の組み合わせも 00000900 までの組み合わせをスキップできます。

再起動するタイミングで strings プロパティは変えないようにしてください。正常にレジュームできなくなります。

サンプルファイルについて

Sample.xlsx00201 で開けるサンプルファイルです。中身は何もありませんし、スクリプト動作に必要なファイルでもありません。

同梱の Property.txt はこの Sample.xlsx を開くテイで記述しています。fileName= 部分のフルパスを各自の環境に合わせて修正して試してみてください。

README.md ココマデ。

ここからは内部の詳細について。

総当たりスクリプトの原型

上のページの VBScript をベースに作り始めた。上のコードは .vbs のみで完結しており、生成する文字列は ASCII コードで 0x20 ~ 0x7F の範囲を固定で試すというもの。

ついでに、以下にこのスクリプトの VBA 版がある。

便利機能のアレコレ

前述の Excel UnPassword が持ついくつかの機能のアイデアを拝借した。

など。

このツールのマクロコードは読んだのだけど、ブックを開く処理を Workbook.Unprotect() で実装しており、VBScript にうまく移植できなかったので、Workbooks.Open() を使用している。そのせいか速度に若干難あり。Excel UnPassword の速度に敵わない。

課題

いずれも GitHub Issues に挙げてみた。

あんまりリッチな機能を盛り込むのは大変だけど、中断時に Excel.exe プロセスが残り続けてしまうのは、VBScript を書くときの全般的な悩み。なんかよい方法はないだろうか。

そもそも…パスワードは解読できたか?

8年ほど前にいなくなった担当者が残していった、パスワード付きのブックがあったので、このようなスクリプトを作ろうと思った次第。

パスワードは恐らく7~10文字程度で、大文字・小文字・記号混じりと思われ、日夜スクリプトを動かしているのだが、12時間で未だ7文字の組合せを実行中。なかなか総当たりは時間がかかる。これは無理かな~。