みんなのためのリバースエンジニアリング
(0xinfection.github.io)- Reverse Engineering For Everyone は、リバースエンジニアリングを初めて学ぶ人が概念と実習の流れを追えるように作られたチュートリアル集
- リバースエンジニアリングは、人工物を分解して 設計、アーキテクチャ、コード または知識を明らかにするプロセス
- カリキュラムでは x86, x64, ARM-32, ARM-64 を扱い、入門者と概念をあらためて確認したい読者の両方を対象としている
- 何も知らない状態からでも始められる構成で、リバースエンジニアリングの 中級の基礎 まで段階的に学習できる
- チュートリアル全体は PDF と MOBI で入手でき、新しいチュートリアルが追加されると電子書籍版も自動更新される
リバースエンジニアリングの目的
- リバースエンジニアリングは backwards engineering または back engineering とも呼ばれる
- 対象となる人工物を分解し、その内部の 設計、アーキテクチャ、コード を明らかにしたり、知識を抽出したりするプロセス
- 科学研究と似ているが、科学研究は自然現象を対象とする点が異なる
- このチュートリアル集は、リバースエンジニアリングを できるだけシンプルに 学べるようにすることに重点を置いている
カリキュラムと学習対象
- 扱う主なコースは次のとおり
- リバースエンジニアリングを学ぼうとする 初心者 と、すでに学んだ概念を復習したい読者の両方を対象としている
- 初心者は基礎知識がない状態から、リバースエンジニアリングの 中級の基礎 まで学習できる
- サイドバーからこれまでに扱ったセクションを確認し、必要な概念を復習できる
1件のコメント
Hacker Newsのコメント
リバースエンジニアリングは、必ずしも対象そのものをのぞき込まなくても可能。
Andrew Tridgellが「French cafe technique」でMicrosoftのSMBプロトコルをリバースエンジニアリングした過程を説明した文章: https://www.samba.org/ftp/tridge/misc/french_cafe.txt
Tridgeは、Linusが一時期Linuxカーネル開発のホスティングに使っていたプロプライエタリソフトウェアBitKeeperもリバースエンジニアリングしていた。専用クライアントの代わりにBitKeeperのアドレス:ポートへtelnet接続すると
helpを入力でき、そうすると試せるコマンド一覧が出力されることを突き止めた。そのコマンドでリポジトリを問い合わせると、プロプライエタリソフトウェアを使ったり逆アセンブルしたりする必要なく内部データ構造をすべて理解できた。そしてこのリバースエンジニアリングが原因で、BitKeeperの所有者Larry McVoyがLinuxコミュニティの利用権限を取り消したため、Linusがgitを作ることになった。
helpがコマンド一覧を出力したのはBitKeeper開発者たちの優れたエンジニアリング/UI上の判断だったが、ここから得られる教訓が「ソフトウェアを親切にしすぎるな」になってしまわないか心配だ。それに、ネットワーク越しに何らかのソフトウェアと対話することも、明らかにそのソフトウェアを「使う」ことなのではないかと思う。
リバースエンジニアリングは本で学ぶ分野だと思ったことがない。子どものころから全部、自分で手を動かして学んだ。
Cheat Engineでビデオゲームのプロセスメモリをスキャンして変更する方法、MMOのパケットを読んで再送してチートを試す方法、DLLとフックを作ってプロセスに注入する方法、crackme課題を解くために実行ファイルのパッチを作る方法を身につけた。
ライセンスキーが必要な実際のソフトウェアをいじってキー不要にしたり、どんなキーでも受け付けるようにしたり、ゲームのセーブファイルのようなバイナリ形式を解析してチートに活用したりして、最終的にはその技術と知識で実際の仕事を得てお金を稼ぐようになった。
実際には、ただ自分で試して時間をかける類のものに近い。元記事のチュートリアルはあまりに飛び飛びで、多くを扱おうとしすぎている一方、数時間触ればたいてい身につくレベル以上のリバースエンジニアリング技術は教えられていないように感じる。
一方でbeginners.reは膨大だが、はるかに深く段階的に進むし、実習課題としてはcrackmesのほうがよいかもしれない。
進行中のビデオゲームのリバースエンジニアリングプロジェクトで、プログラミングを知らない独学のモッダーと連絡を取ることになった。Discord通話を何度か行い、Ghidraプロジェクトを一緒に見ながらコンピュータプログラム工学の基礎を説明したところ、Cheat Engineでビットを反転させていたころよりもはるかに多くを学んでいた。
その後彼は、15年前のYouTube動画でしか公開されず配布されていなかった、かなり野心的なModを再現した。私が方向性は示したが、部品がどう噛み合うかを見た後は、続編でも同じModを一人で実装していた。
工学経験はリバースエンジニアリングをするときの視点を与えてくれる。
本は多いが、「良い」本は数えるほどしかないという点も重要だ。
5分読んだだけでも、誤り、誤解された概念、完全に間違った説明があまりに多く見えて、薦めにくい。明らかにこの分野の経験が少ないアマチュアが書いた文章に見える。
より良い資料としては、Eldad EilamのSecrets of Reverse Engineering、Windows方面ならPractical Reverse Engineering、本当に基礎ならPattersonのComputer Organization and Designがある。
このテーマに初めて触れる人には、良い高レベルの概要のように見える。
もっと深い資料として、このリンクもあった: https://github.com/mytechnotalent/Reverse-Engineering
追記: ああ、ほとんど元記事へ戻るリンクのようだ。
searchlores.orgとfravia.comでリバースエンジニアリングのチュートリアルを読んでいた記憶がよみがえる。
今はWebアーカイブにある: https://web.archive.org/web/20191201105759/http://search.lor...
Javaのリバースエンジニアリングも面白い。特に、妙なBluetoothプロトコルで家電を制御する怪しいAndroidアプリなどはそうだ。
このガイドを書いた人を知っている。HNに載っているのを見てうれしいし、具体的なフィードバックがあれば伝えられる。
参加を促す要素と視覚資料が少なすぎる。説明ばかりでテキストの壁が多すぎるので、それだけでも「みんなのための」資料ではない。
たとえば第2部の静的解析/動的解析の説明、IDAと逆アセンブラの紹介、ABC Biochemicalsのシナリオ説明は、もっとずっと簡潔に書ける。
「マルウェア解析には静的解析と動的解析という2つの基本的な手法がある。静的解析は実行ファイルを実行せずに調べるもので、ここでは扱わず後の過程で扱う。動的解析は、実行中のマルウェアバイナリを逆アセンブラとデバッガで解析する。逆アセンブラは実行バイナリを、デバッグや操作が可能なアセンブリ言語命令に変換する。Hopper、OllyDbg、IDAのようなツールがあり、IDAは複数のプラットフォームとプロセッサをサポートする人気の逆アセンブラ兼デバッガだ。リバースエンジニアリングはマルウェア解析よりはるかに広い分野だ。最後には、ABC Biochemicalsという架空の機密性の高い生化学研究所で、防弾ドア制御システムを倫理的にハッキングするシナリオでIDAを使う。基本的なプロジェクトだが、ブラックボックスのバイナリをリバースエンジニアリングし、より安全なコード設計の解決策を見つける過程を示す。次の授業では複数のマルウェア種別を扱う」くらいに短くできる。
本のリンクが私には開けないのだが、HNのトラフィック爆弾を食らったのだろうか?