Finedays Mailにログインしようとする圭司が,ブルートフォースで試すときに作ってた.パスワードのリストを作るやつです.
著作権的なもろもろがあるのでスクショとかは載せられないのでAmazon Prime会員の方はdele 1話の28:07を見てください.
今回は思考プロセスや仕組みについて書いていきます
あまりプログラミングに明るくない方でも楽しめる感じで書いていくことを目標にします.
もくじ
仕組みについて考える
作中では圭司が以下のようなコマンドで動かしています
$ ./createWordList.py yasuoka haruo haru 1974 0215 6084 44 -o p.lst
Macの方はTerminal(端末)開けばコマンドを入れる場所はすぐに分かると思います.Windowsでやりたい場合はコマンドプロンプトになるかと思います. $ じゃなくて > になるけど…
圭司がMacっぽいOSで動かしている以上今回はMacに合わせて説明していきます.Windowsでやりたい人はコマンドを読み替える部分があります.(後述)
話を戻しまして,一個ずつ左からコマンドを見ていきましょう.
./createWordList.py
これは実行するプログラムを指定している部分です。 “現在いるディレクトリのcreateWordList.pyっていうのを実行してください” という意味です。詳しい話は省略
で
yasuoka haruo haru 1974 0215 6084 44 -o p.lst
がcreateWordList.pyに渡されるデータ達となります。
ハイフンから始まるものは基本的にその後ろの語句とセットになっていて、オプションと呼ばれる、あっても無くてもいい追加設定です。
ハイフンが一つなら その後は一文字、ハイフンが二つならその後は単語が一般的になっていて、基本ハイフン二つの省略としてハイフン一つでの設定が使われます。
実際に使われているオプションは
-o p.lst
でした。
p.lstはピリオドが入っていることからなんとなくファイルだと考えられます。
そしてlstはlistの略称、pはpasswordでしょう流れ的に、すなわち-oの後にパスワードが入るファイル名が入っていると考えられます
でなぜファイル名を指定しているのかという考察に入りますが、これは割と簡単で、プログラムで作ったパスワードの組み合わせを出力する場所の指定であると考えられます。
そうなると非常に辻褄が合うようになり -oは–outputの略称であると考えられます。
ここまでの考察をまとめると、
-o p.lst
は出力先のファイル名を指定するオプションであるということが分かりました。
最後は
yasuoka haruo haru 1974 0215 6084 44
です。
実際にプログラムを書く際はこれらの組み合わせを出力されるように書きます。
プログラムの作成
実際に組み合わせられるようにまずは実行コマンドについて細かくプログラムに落とし込んでいきます。この辺からPythonの話がめっちゃ出てきます。雰囲気で楽しんでください
./createWordList.py yasuoka haruo haru 1974 0215 6084 44 -o p.lst
という形で実行する際、実際は
./createWordList.py {組み合わせるwords} {オプション}
となるのでyasuoka haruo haru 1974 0215 6084 44
は何個ワードを書いてもいい、すなわち可変長引数にする必要があります。
sysモジュールでも出来ますがあんまり賢い選択ではないので今回はargparseモジュールを使って書いていきます。
なにがともあれ、まずは与えられたデータを受け取る必要があるのでその部分について書いていきましょう
import argparse parser = argparse.ArgumentParser(description=' dele 1話に出てくるプログラムの再現スクリプト') parser.add_argument('words', help='組み合わせる単語', nargs='*') parser.add_argument('--output', '-o', help='ファイルの出力先 設定ないなら output.txt') args = parser.parse_args()
この5行で実装できます。 add_argumentで引数の設定をしている感じです。
第一引数は受け取り先(ハイフンが入っていた場合は取り除いたもの)になります。helpはコマンドライン引数が適切でない場合に出てくる使い方を教えてくれる君のようなものです。
nargs=’*’ で可変長引数にできます。
で実際に引数を受け取る場合は
args=parser.parse_args()
で受け取ります。
その後は指定した受け取り先に応じて、args.words やargs.outputで受け取ることができます。
args.output
は中身がない場合はoutput.txt,中身入っていたらそのファイル名で出力するだけなので、特に面白くもないので説明はパスで、
args.words
についてですがこれは順列の話で実装できます。
例えばn個の単語をを1~n個ずつ順番を作っていきたい場合は、
こうなりますね
itertoolsを作れば簡単に実装ができます。
そんで並び変えたりした組み合わせは配列なので文字列にして標準出力しましょう
後はstr_listを出力しておしまい!
str_list=[]
for el in ouput_lists:
word='\n'.join(el).replace('\n', '')
str_list.append(word)
print(word)
余談
なんかソースコードを書き表すのがうまくいかなしビジュアルエディタなのに改行入れるのにbrタグ付けなきゃいけなくなってるしで本当に使いにくくなった。