Linux マシンでアセンブリ コードに変換する必要がある、バイナリ x86_64 マシン コードを含む C 配列があります。C配列をバイナリ実行可能ファイルに変換するのに問題はありませんが、それをasmコードに変換するユーティリティが見つかりません.
何か案は?
ありがとう!
おそらく逆アセンブラを探しているでしょう。逆アセンブラーは、(実行可能ファイルまたはオブジェクト ファイルから) マシン コードを取得し、それを人間が判読できるアセンブリ言語に戻します。それが必要な場合は、Linux 用の逆アセンブラーのリストをご覧ください。
そこにリストされていないいくつかの逆アセンブラー:
IDA Pro : どうやら最も強力な逆アセンブラの 1 つです。おそらくあなたの目的にはやり過ぎです。
ndisasm ( nasmアセンブラに付属)
逆アセンブラが必要です。私は個人的に NASM パッケージの NDISASM を使用しています。
GPL コードにリンクする余裕がある場合は、libbfd にリンクして、配列を逆アセンブルすることができます。それを行う新しいプロセスを作成する余裕がない場合は、これを行ってください。
私は libdisasm http://bastard.sourceforge.net/libdisasm.htmlを好みますが、いつでも objdump -D を呼び出すことができます。
私のジッターから:
#ifdef HAVE_LIBDISASM
# define LINE_SIZE 255`
char line[LINE_SIZE];
int pos = 0;
int insnsize; /* size of instruction */
x86_insn_t insn; /* one instruction */
x86_init(opt_none, NULL, NULL);
while ( pos < size ) {
insnsize = x86_disasm(code, size, 0, pos, &insn);
if ( insnsize ) {
x86_format_insn(&insn, line, LINE_SIZE, att_syntax);
printf("(code+%3x): ", pos);
for ( i = 0; i < 10; i++ ) {
if ( i < insn.size ) printf(" %02x", insn.bytes[i]);
else printf(" ");
}
printf("%s\n", line);
pos += insnsize;
} else {
printf("Invalid instruction at 0x%x. size=0x%x\n", pos, size);
pos++;
}
}
x86_cleanup();
#else
fh = fopen("run-jit.bin", "w");
fwrite(code,size,1,fh);
fclose(fh);
system("objdump -D --target=binary --architecture i386"
#ifdef JIT_CPU_AMD64
":x86-64"
#endif
" run-jit.bin");
#endif