私は今、逆アセンブラを開発することを考えていますが、逆アセンブラを構築するのは非常に難しいことを知っているので、私の夢を実現するための最良/最も簡単な言語を知りたいです。また、チュートリアルの提案も非常に素晴らしいです;- )。
9 に答える
New Jersey Machine-Code Toolkitは、アセンブラと逆アセンブラを作成するためのツールキットおよび言語です。C、C ++、Modula-3をサポートしていると思います。ツールキットの基本は、命令セットを記述するための言語です。次に、オプションを使用して逆アセンブラが自動的に生成され-dis
ます。このツールキットはかなり広く使用されていますが、人気のある命令セットの説明には最近のリビジョンは含まれていません。
自分で作成する方が楽しいか、より有益であると判断するかもしれませんが、複雑な命令セットを扱っている場合は、ツールキットの効率に合わせるのが難しいかもしれません。これは今日のハードウェアでは重要ではありません:-)
Pythonを使用して逆アセンブラを作成する方法を検討することをお勧めします。逆アセンブラを作成するときに非常に便利な特性と機能を備えています。
- ビット操作:論理演算子は整数値のすべてのビットに対して操作を実行します
- 関数型プログラミング:ビットマスク演算の結果に「マップ」を使用すると便利です
- 強力なファイル読み取り操作:ファイルI/OはPythonで非常に簡単に実行できます
- 構造化されたバイナリファイル(.EXEファイルなど)を読み取るための優れた機能
Pythonには、あらゆるサイズのプログラムに非常に役立つ他の性質があります。元の8086命令セットではなく、現在のマイクロプロセッサの命令セットをサポートするx86アセンブラは、大きなプログラムになります。
ビットマスキングを簡単に実行できる言語があると、アセンブラを作成するときに非常に役立ちます。
- オブジェクト指向:コードの再利用を容易にし、プログラムをより理解しやすく、冗長性を減らします
- モジュラー:モジュールおよびパッケージでさえ、プログラムチャンクを管理可能なサイズに保つために使用できます
- 簡潔で読みやすい:タイピングや頭をかきむしるようなことはあまりありません
- インタラクティブ:段階的な開発/テストが容易になります
- 組み込みのシンボリックデバッガー:自動テストでカットされない場合に便利です
- 最新のQAサポート:JUnitと同様のunittest 、 doctestは例による機能テストをサポートします
- 組み込みのヘルプ:本をめくったり、ブラウザを起動したりする必要がありません
- 素晴らしいドキュメント:PDFおよびHTMLファイル形式のリファレンスおよびチュートリアル資料
- 優れたIDEサポート:Eclipse、NetBeans、EmacsなどはすべてPythonの優れたサポートを提供します
- Webページの提供に対する優れたサポート:HTML/HTTPおよび優れたサードパーティのWebフレームワークのサポートも含まれます
- 優れたドキュメント生成:ドキュメント文字列規則を使用してモジュール、クラス、メソッドをドキュメント化します。Pythonに付属のユーティリティは、ハイパーリンクされたHTMLドキュメントを動的に生成し、TCP/IPポートから参照できるようにします。
Pythonを使用すると、プログラムを開発しながらプログラムを楽しむことができます。そこにはPythonプログラマーのかなり大きなコミュニティがあります。彼らはJavaプログラマーやC++プログラマーのように軍団ではありませんが、周りにはたくさんあります。
Pythonは、そのパワーと柔軟性により、Google、Yahoo、およびその他の最新のWeb企業で人気のあるプログラミング言語です。Jython python-in-javaインタープリターは、高度な相乗効果と適切なレベルの互換性があるため、両方の言語にさらに強力な機能を提供します。読みたくない場合に聞くことができるJythonポッドキャストがあります。
Pythonは1990年代の初めに発明され、Javaよりもさらに古くなりました。これほど長く存在し、強力で着実な支持を得て、それは非常に頑丈で有能な言語に進化し、多くの例と、仕事や娯楽のためにそれを使用するプログラマーのまともなコミュニティがあります。
行き詰まった場合、Pythonコミュニティは通常、1つまたは2つの便利なPython機能を使用して発生している問題を突き止める方法についてのアイデアを提供してくれます。
適切なバイトおよび文字列操作を備えた汎用言語であれば、これを行うことができます。すでによく知っている言語を使用してください。新しい言語を学ぶと同時に逆アセンブラを書く方法を学ぶことは、おそらくあなた自身にとってそれを難しくするでしょう。
あなたはそれをアセンブリで書くことができます。それは本当にあなたの脳を伸ばすでしょう。
実際の生のコード-代替はありません
本当に重要ではありません。IDAProにはプラグインモデルがあると思います。Pythonプラグインをサポートする逆アセンブラを持っている人もいると思うので、試してみてください。しかし、これがどれほど難しいかについては、あなたにはわからないと思います。でも頑張って
現代語ならどれでもこの目的のために同じようにうまくいくと思います。使用するライブラリを検討してください。たとえば、さまざまな種類のバイナリを処理できるライブラリがあります(これらの1つはBFDです)。これについて考えて、あなたに最も適したプログラミング言語を選択してください。
逆アセンブラ、つまり絶対バイナリをアセンブリ言語に変換するプログラムは、非常に面倒ですが、実際には非常に簡単に作成できます。
私は1983年の初めにFORTRAN77でZ8002逆アセンブラを実行しました。1991年にCで話していないことのために小さな逆アセンブラを実行しました。
バニラCでこれを行う方がおそらく良いでしょう。なぜなら、これから行うことは、メモリワード(またはバイナリファイル)を読み取り、大量の既定のテキスト文字列を印刷することだけだからです。
最近、Pythonで逆アセンブラを作成しました。これは組み込みRISCアーキテクチャ用であり、Pythonはうまく機能しました。私はPythonを学びながら学習していたので、少なくとも1回は作成したほとんどすべての関数とクラスを作り直すことになりました。long
ビット、バイト、ニブル、または半分のリストを返すなど、さまざまな形式で表現された4バイトワード(または質問者によってはダブルワード)を取得するタイプおよび書き込みメンバー関数をサブクラス化すると特に便利であることがわかりました。 -さまざまなオペランド操作の単語。
Haskellではかなりうまくいくでしょう。バイナリパッケージを使用することもでき、それも効率的です。ADTは非常に優れています。
Pythonで書くのはお勧めしません。Pythonは非常に遅く、HaskellはCよりも数倍遅いと思われますが、PythonはCよりも何倍も遅いと思います。
結局のところ、バイナリ形式は十分に低レベルであるため、それが重要であるとは思えません。比較的簡単にCで書くことができます。パーサーコンビネーターやパーサージェネレーターは必要ありません。