「もにゃ」から秘密鍵を取り出す(2)

さあ、ローカル版に改造した「もにゃ」のローカルにあるJavaScriptファイルを書き換えて、秘密鍵を取り出すぞ。
で、どこを改造すればいいのか….この膨大なソースの中から……(悩)

【STEP3】オープンソースの改造部分に当たりをつける

「もにゃ」はオープンソースなので、それを見たほうが足掛かりを掴むのは早そうじゃ!

もにゃの公式TOPページで、[ソースコード]を選択すれば、「もにゃ」の全ソースが表示される。

JavaScriptのソースなので、おそらくこのjsの中にあるはずじゃ!

この中のJSファイルに、秘密鍵を使って署名をする部分があるはずなので、それぞれのソースコードの中を[ctrl]+[F]検索してみる。キーワードは”sign”や”privatekey”ってなところやってみる、すると…….

二番目のファイル、”currency.js”の中に、それらしい部分を発見したのじゃ!

keyPairを使って、signしているっぽいのがわかる。

keyPairということは、おそらく公開鍵と秘密鍵のセットじゃな、これを取り出せばバッチリじゃ!

とりあえずこの中身を確認するために、デバッグ用のコンソールに出力するコード

console.log(keyPair);

って感じで書き加えてしまえば、Chrome上で[F12]を押した時に表示されるコンソール画面に出力されるはずじゃ!

 

【STEP4】dist.jsファイルを書き換える

そんじゃ、ローカルに保存したdist.jsをメモ帳で開いて、該当部分を書き換えてみよう…..

ありゃりゃ???
なんだ、このJSファイル!
改行がないし、変数名も一文字、さらに構文も普通のJavaScriptと違うじゃんか!

そう、「もにゃ」のdist.jsは、圧縮や難読化の為に、JavaScriptの簡易表記に書き換えられておるのじゃ!
変数名も分かりやすい元の文字列表記から a,b,c,d などの一文字アルファベットの簡易変数名に変換されているので、そのまま検索をかけてもgithubにあるソースコードとは一致しそうもない。だから、定数名やメンバー名などの簡易表記できない要素を頼りに探す必要がありそうじゃ。

“).keyPair” や “.sign(“

こんなキーワードで、前後のソースを見ながら探していくと
……見つけたのじゃ!

githubのコード

該当するもにゃのdist.js

keyPairをdという名前の変数に入れているので、その直後にdをコンソールに出力するようにコードを挿入してみる。

d=s.derive(0|i[u][0]).derive(0|i[u][1]).keyPair,console.log(d),this.enableSegwit

【STEP5】もにゃを実行して送金してみる

dist.jsの書き換えが終わったら、そのままローカルの「もにゃ」を起動して、自分宛に送金をしてみる(署名のみのオプションをチェックして実際には送らなくてもいい)

とりあえずBitzenyで、自分のアドレスに送金する設定で、署名のみを行ってみた。
[F12]を押して、Chromeのデバッグ画面を表示させ、Consoleのタブを選択すると、

“ECPair”というオブジェクトがコンソールに出力されているが、秘密鍵は含まれてない。だが、コンソール画面で、ECPairのメンバーを掘り下げて見ていくと、toWIF() ってメンバー関数がある。
これが秘密鍵を出力するメンバー関数っぽいのじゃ!

WIF(Wallet Import Format):
ウォレットで扱う秘密鍵の表示形式

ということで、先に改造したコードをちょいと再改造して

d=s.derive(0|i[u][0]).derive(0|i[u][1]).keyPair,console.log(d.toWIF()),this.enableSegwit

と変更して再度送金テストしてみると

コンソールに秘密鍵っぽい文字列が表示されているぞ!大成功じゃ!
これで、改造したローカル版「もにゃ」を使えば、いつでも秘密鍵を取り出せるようになった!

もしコンソール画面が嫌いで、メイン画面に秘密鍵を表示したければ、

console.log(d.toWIF()) → alert(d.toWIF())

と書き換えれば、メイン画面に秘密鍵が表示されるようになる。



で、これは誰が何に使うのだろうかw

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です