Linuxをいじってみる続き。1.0.4からいくつかのパッケージが加わったので、そこにスポットを当ててみる。今回はJD-GUIという、Javaの逆コンパイラを取り上げよう。JD-GUIとは何かJavaの逆コンパイラは、.classファイルから.javaファイル(ソースコード)を生成するツールである。Decompilerか、と言われていた。Decompilerプロジェクトのツールのひとつで、スタンドアロンで動作するGUIアプリである。Decompilerプロジェクトにはこのほかに、Eclipseプラグインとして動作するJD-Eclipseなどがある。公式Webサイトは以下。Linuxでは1.0.4からデフォルトパッケージに加わったが、1.0.3からアップデートしたところ自動的には入っていなかった。そのため、以下のようにapt-getで手動でインストールすればよい。jd-guiJD-GUIを使ってみる起動方法コマンドラインからjd-guiと叩くだけでよい。上のように起動直後は空っぽのウィンドウが開くので、メニューからjarファイルをopenすればよい。サンプルなんでもよいのだが、ここでは私が分かりやすいということでTomcatを対象にしてみよう。tar.gz]をダウンロードして適当なところに展開しておく。ちなみに本稿で最初にclassファイルを逆コンパイルする......というように書いたが、jarファイルは単なるzipファイルで、中身にはclassファイルなどが詰まっている形式である。JD-GUIはjarに対応しているので、jarファイルをそのまま開けば良い。開いたものだが、ちょっとびっくりするくらい元のソースと同じものが再現されている。classファイルには元の変数名なども格納されているので、こうも忠実に逆コンパイルできるようだ。これはReceiverBaseクラスのbind()関数で、利用したいポートが他アプリなどで使われているときは1ずつポート番号を増やしてリトライしていくautoBind機構で使われる部分である。Tomcatでクラスタリングする際、セッションレプリケーションで利用するポートなどはこれを利用する。見て分かる通り、変数名まで含めて再現されているので内部的な動きもよく分かるし、元のソースともほとんど同じである。Distributions]から落とせるので比べてみよう)Androidアプリの逆コンパイルさて、Javaアプリと言えば一昔前はサーバサイドで動くつまらない(失礼)業務アプリが主流だったので、逆コンパイラはあまり注目されてこなかった。職場で使われるような在庫管理ツールとか勤怠管理システムとかを、自分で逆コンパイルしてもつまらないよね(?)。若い人は知らないだろうけどかつてはJavaアプレットというものが一瞬だけ流行ったので、その逆コンパイルも一瞬トレンドになったことがあった。アプレットの場合はユーザ側にclassファイルが渡るので、それをなんとかしちゃおうという人たちと、ソースコードの漏洩を気にしていた企業側の人たちとの水面下の戦い(のようなもの)があったようだ。その後はJavaアプレット自体が下火になったので、このトレンドも自然消滅。昨今のスマホブームで状況は一変した。AndroidアプリはJavaで書かれているので、それを逆コンパイルしたい......という需要が一気に高まったのだ。Androidアプリは、周知の通り.apkというファイル形式になっている。VMという特殊な仮想マシン上で動作することだ。VM上で実行することで動作させる。具体的な手順よって、AndroidアプリをJD-GUIで逆コンパイルするには、以下の手順を踏めば良い。apkファイルをzipファイルとして展開する。中に含まれるclasses.dexファイルを、dex2jarを使ってjarファイルに変換する。classes-dex2jar.jar作成されたjarファイル(classes-dex2jar.jar)を、JD-GUIで開く。上記の手順で、apkファイルを逆コンパイルしてJavaソースコードまで持って行けることを確認した(もちろんライセンス的に問題ないものをやりましたよ)。難読化とリバースエンジニアリングさて逆コンパイルやリバースエンジニアリングの話が出てくると、一緒に出てくるのが難読化ツール。ソースコードを人にとって読みにくくするためのツールだ。この類のものは世に色々とあって、特にJavaScriptのようにそのまま見えてしまうものは、ソースが見えることを嫌って難読化ツールを使う人が結構いるようだ。私は、この手の製品を感覚として「気持ち悪い」と思ってしまう。美しいソースコード(リーダブルコード)を書いたとして、それを出荷前に「汚す」のはエンジニアとして大変によろしくないと感じてしまうのだ。難読化はまさに誰得技術としか思えない。なんとか逆コンパイルして解析してみよう」というアプローチよりも、「よーし、これをパクって同じ感じの動きをするプログラムを書いてみよう」というアプローチの方が、楽チンな気がするんだよね(そもそもパクること自体がアレだけど)。なると、もはや難読化って自己満足以外の何物でもないんじゃないかなぁ......と思ってしまうのだ。あ、あとは、マルウェアを書いてる悪い人たちが動作を読ませにくくするために使う......という用途があるか。何か他に有効な使い道ってあるのかなぁ。Qiitaの19日目です。関する罪」の情報公開請求をしました月別アーカイブはてなブログをはじめよう!ozumaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。