[perlメモ]ActivePerlでUNZIP32.DLLを使ってzipのパスワードを解析してみる実験。
10年以上昔ににパスワードを掛けて保存したzipファイルが手元にあるのですが、パスワードを忘れてしまって解凍できないままずっと放置ですw。まあ、いいんですけど、たぶんパスワードに日本語を使って長いパスを設定したという記憶だけはあるので、どうにもパスワード解析ソフトを使っても何十年とか何百年とか掛かりそうで、量子コンピュータでも使えるようにならないとたぶん墓場に行くまでに解凍出来そうもないです。
パスワード解析ソフトといえば下の二つが有名です。普通にアルファベットと数字でそんなに長くない5桁くらいのパスワードなら総当たりでも今のパソコンなら割とすぐに解析出来ると思います。
Lhaplusの詳細情報 : Vector ソフトを探す!
http://www.vector.co.jp/soft/win95/util/se169348.html
Pika Zipの詳細情報 : Vector ソフトを探す!
http://www.vector.co.jp/soft/win95/util/se078535.html
完全な(文字コードが0-255)ブルートフォース(総当たり)で解析できるのはLhaplusです。これだと設定によっては日本語も一応解析できるはずですが、現実的な速度ではないです。
Pika Zipは辞書による日本語のパスワードの解析は可能です。総当たりは、数字、アルファベット、記号での総当たりになるので日本語の総当たりはできなかったと思います。(例えばあ、い、う、え、お、の組み合わせでの総当たり)
例えば、平仮名50音だけでパスワードを掛けていたとしたら、高速な言語ならそれなりに現実的な速度で解析出来そうなのですが、そういうパスワード解析ソフトってないんですよねー。(あったらおしえて)そういうわけでperlでちょっとやってみた。
作成にあたって、参考にさせて頂いたサイトは下記です。
perlメモ
http://homepage2.nifty.com/kapapa/perl/
Common Archivers Library
http://www.csdinc.co.jp/archiver/
できたんですが、やっぱりperlだと遅いですねー。あまり現実的な速度ではないです。やっぱりこういうのはC言語で書かないとダメですね。一応、速度向上を見込んで変数の宣言を頭にまとめたりしたんですが、perlだとあんまり意味ないかもですね。
とりあえず、a-z,0-9の範囲で4、5桁くらいなら現実的にパスワード解析出来そうではあります。
use Win32::API;
my $unzip = new Win32::API(‘UNZIP32’, ‘UnZip’, [N, P, P, N], I);
my $buff = "\x00" x 256;
my $fname ="test2.zip";
my $time = time;
#my @chr = (‘あ’,’い’,’う’,’え’,’お’,’か’,’き’,’く’,’け’,’こ’,’さ’,’し’,’す’,’せ’,’そ’,’た’,’ち’,’つ’,’て’,’と’,’な’,’に’,’ぬ’,’ね’,’の’,’は’,’ひ’,’ふ’,’へ’,’ほ’,’ま’,’み’,’む’,’め’,’も’,’や’,’ゆ’,’よ’,’ら’,’り’,’る’,’れ’,’ろ’,’わ’,’を’,’ん’,’ご’);
my @chr = (‘a’..’z’,’0′..’9′);
my $k=0;
my @keta = ();
my $ttl=0;
my $ret=0;
my $x;
my $a;
while(1){
#繰り上がり計算
#桁数分ループ
for($x=0;$x<=$k;$x++){
if($keta[$x] > $#chr){
$keta[$x] = 0;
if($k == $x){
$k++;
}else{
$keta[$x+1]++;
}
}
}
#各桁結合
$a = ”;
for($x=$k;$x>=0;$x–){
$a .= $chr[$keta[$x]];
}
unless($ttl % 10000){
print "$a [$k][$ttl]\n";
}
# sleep(1);
$ret = $unzip->Call(\x00, "-x –i -P$a $fname", $buff, length($buff));
if($ret==0){
print "$a $ttl complete $buff\n";
print time – $time." sec\n";
exit(0);
}
$keta[0]++;
$ttl++;
}
試しに、xyzというパスワードをかけたtest2.zipというファイルを解析してみたところ。
F:\kumacchi\MyProgram\perl\unzip>perl unzip.pl
a [0][0]
gy2 [2][10000]
oou [2][20000]
wem [2][30000]
xyz 32029 complete Extracting from test2.zip
UNZIP32E.TXT inflating to UNZIP32E.TXT
ct password
lid compressed data to inflate
y instead be incorrect password)
18 sec
F:\kumacchi\MyProgram\perl\unzip>
約18秒で解析できました。パスワードの桁数がこれ以上になるとちょっと辛いですw。
@chr配列に設定する文字種を変更するだけでいろんな文字種でブルートフォースでzipファイルのパスワード解析ができます。
まあ、それだけなんですけどw。
日本語でも使ってる範囲の文字を覚えていれば、その文字だけ設定することで割と現実的な速度で日本語のパスワード解析できるかもしれないw。
頭悪いので、総当たりのアルゴリズムはちょっと苦労しましたwww。もっとスマートな方法がありそうな気がします。
だれかC言語でGUI付きのやつ作ってください。お願いします。m(_ _)m
タグ : perlメモ