私はいくつかの無実/初心者の質問があります:
リバースエンジニアリングとは何に適していますか?
リバースエンジニアリングは、主にクラッキングやハッキング(シリアル番号保護やパスワードプロンプトの削除)に適していますが、他のソフトウェアが実行できるウイルスや奇跡を理解するのにも役立ちます。場合によっては、ソースを取得していないプログラムのバグを見つけてパッチを適用するのに役立つスキルがあります。
プログラマーとして、リバースエンジニアリングの技術を学ぶ必要がありますか?
はい、アセンブラを学び、まともなデバッガを使用してみてください。金属に近い、より低いレベルのことを理解することで、より良い開発者になります。
リバースエンジニアリングの経験が豊富なプログラマにはどのようなメリットがありますか?
あなたは良いハッカー/クラッカーになります。あなたは他のアンチウイルスプロデューサーのために働くことができます。個人的な例として、私はかつてソフトウェアをリバースエンジニアリングして、Oracle接続の確立中に発生したエラーを追跡しました。他の誰も問題を解決できなかったので、私は名声を得ました。
さらに、@ johannesコメントも引用したいと思います。
「悪い」クラッキングに限定しません。逆アセンブルは、コンパイラが狂ったかどうか(通常はコードですが)を理解するのに役立ちます。よりシステム管理者の観点から見ると、アプリケーションがどこで失敗するかを確認するのは興味深いでしょう。
私は Falconの答え が好きですが、古い退屈なビジネスアプリケーションの世界では、リバースエンジニアリングによって厄介な問題を解決できることを付け加えたいと思います。
仕事では、新しいメンテナンスのないサードパーティシステムとデータ統合を行うときに多くのことを行うので、どこで中断すべきか、またはどこで中断すべきでないかを知ることができます。
また、ソースコードが含まれていない場合は、リバースエンジニアを使用して、購入したサードパーティコンポーネントのコード品質をチェックします(もちろん、一定の制約があります)。
私の本当のポイントは次のとおりです。リバースエンジニアリングは単一のテクノロジや言語に関連付けられているのではなく、 「ブラックボックス」の内部を学ぶプロセス です。依存しているコードはあるが、信頼していない、または信頼できない場合は、必ず内部を調べて、そのコードの動作を確認する必要があります。
また、リバースエンジニアリングの退屈な退屈な側面もあります。これは、あなたがいる会社がまだ使用されている少しのコードまたはプログラムを持っているが、誰もそれについて何かを知っていると主張していないときです。プロジェクトを開始する前に行う必要のある、エンジニアリング、ドキュメント、テスト、その他すべてのエンジニアリングに関することを行います。これは、すでに作成されているソフトウェア、つまり「リバースエンジニアリング」に対して行われます。
コードがあればずっと簡単ですが、技術的にはリバースエンジニアリングです。これは、ビジネス会議でレガシープロジェクトについて話しているときによく現れる用語の1つです。
リバースエンジニアリングのビジネスバリューを拡大するために、私たちが遭遇する新規顧客の半数以上が既存のシステム/アプリ(常に本番環境にあるとは限らない)を持っていますが、以前のソフトウェア開発ベンダーとの関係が横滑りしました。
約30%のケースで、顧客はシステムのソースをまったく入手できず、多くの場合、実際のビジネスプロセス、ルール、および知識の多くはコードに閉じ込められています。
また、以前のベンダーが悪意のあるプレーンを取得し、バイナリを難読化したり、コードをタイムロックしたりして、顧客を無期限に魅了した場合もいくつかあります。
したがって、質問に答えるために、リバースエンジニアリングは、多くの場合、やや絶望的な(そして燃やされた)顧客との新しいエンゲージメントの開始点であり、既存のコードから忘れられた知識を抽出することは「ビジネスクリティカル」な成功要因になる場合があります。
リバースエンジニアリングのスキルセットとデバッグのスキルセットはまったく同じであると私は主張します。素晴らしいデバッガであれば、素晴らしいリバースエンジニアでもあり、逆もまた同じです。
時々、私が理解している限り、一部の部品/ソフトウェアを相互運用するために使用されます。いくつかの奇妙なインターフェース、実装のバグなど。
しかし、私が理解していることから、それは非常に滑りやすい主題なので、ソフトウェア開発のすでに複雑な法則がリバースエンジニアリングで極端に取られています。
まあ、リバースエンジニアリングを使用すると、コードを再利用して作業を最小限に抑えることができます。たとえば、Symfony2では、通常のMySQLから作成されたデータベースを変換して、doctrine形式とこれに変換できます。 Symfonyで可能になったリバースエンジニアリングプロセスです。リバースエンジニアリングを使用すると、「2Dで」というコードを確認できます。
私の経験から、実世界の例を挙げています。
かつて当社が他の会社からプロジェクトを引き継いだ。プロジェクトの約半年後、サブプロジェクトにはコードがないことに気づきました。前の会社にコードを提供するように依頼したところ、サブプロジェクトのコードが見つからなかったと丁寧に返信されました。そのサブプロジェクトの何かを変更したかったので、コードが必要でした。
リバースエンジニアサブプロジェクトにする必要がありました。
最初にアセンブリを逆コンパイルしました(はい、それは.NETプロジェクトです)。逆コンパイルされたアセンブリの結果は、ローカル変数の名前と複雑な制御構造のない、わかりやすくて混乱するコードです。これは、コンパイルによって逆コンパイルできない重要な情報が破棄されるためです。
次に、そのコードを変更する場所を見つけようとしました。これを行うために、同じように動作するようにコードを合理化しましたが、より簡潔な方法で行いました。変数の名前もその振る舞いから推測しました。私はコードが何をしているのかを理解するまで、何度もコードをステップ実行しました。
私はすべてをリバースエンジニアリングするのではなく、変更する必要がある部分のみをリバースエンジニアリングしました。 VBコードの約200行です。5日程度の作業時間がかかりました。