x86 32ビットまたは64ビットソフトウェアを購入したがソースコードを受け取らず、ソフトウェアを修正する必要がある場合は、機械語コードを上級言語または最小アセンブリコードに変換する必要があります。
機械語コードをCに変換する良いユーティリティがありますか?
プログラムがC ++、Objective C、または他のコンパイラではなくCコンパイラでコンパイルされたかどうかを識別したいとします。
ありがとうございます。
答え1
機械語からソース言語に戻ることを呼び出します。デコンパイル。逆アセンブリ(機械語からアセンブリ言語へ)はobjdump -d
;で実行できます。objdump
標準のbinutils開発ツールスイートの一部です。デコンパイラはこのプロセスで役に立つツールですが、コードを修正して再コンパイルするためにデコンパイルすることはプログラムの動作を修正する効果的な方法ではありません。ソースコードを使用可能にするには時間がかかり、ソースコードはメンテナンス可能な形式ではありません。
プログラムの仕組みを理解する最初のステップはデバッグツールです。プログラムがどのシステムコールとライブラリコールを実行しているかを確認するには、strace
同じツールを使用します。ltrace
プログラムの指示を段階的に実行するには、Gdbなどのデバッガを使用してください。
運が良ければ、設定ファイルや環境変数を使って目的の動作を得ることができます。次のステップは、プログラムに接続し、いくつかの機能を独自のバージョンに置き換えることです。LD_PRELOAD
これらの関数の独自バージョンを定義するリンクライブラリ。
デコンパイルは、互換性のあるネットワークプロトコルやファイル形式で他のプログラムを作成するなど、プログラムが使用するアルゴリズムを理解するのに役立ちます。一般に、プログラムの動作を修正することが目標である場合、それはあまり役に立たないツールではありません。
答え2
そして、いくつかのプロジェクトがあります!しかし、遊ぶことができるおもちゃがいくつかあります。
(最初の引数としてallとbinを使用します。)
少し:
xxd -b # xxd for hexdump (?): `-b` is `-bits`
8進数:
od # octal dump
16進数:
hexdump # these two share the hexdump(1) man page
hd # symbolic link to hexdump
od -t x1 # `-t` for type, `x1` for hexadecimal with 1 byte per integer
xxd
ひも:
strings
機械コード:
objdump -D # object dump: `-D` is `--disassemble-all`
最後に重要なのは、file
ぜひご確認くださいこれ質問。