1

メモリ内にある命令のサイズを確認する必要があります (実際、メモリ内に小さなコード セグメントがあり、最初の命令のサイズを取得したい)。libopcodes と libbfd を見つけるのに時間がかかりました。ヘッダーを赤くして簡単な解決策を考え出そうとしましたが、プログラムが常にクラッシュするため、何かを誤解しているようです。

int main(int argc, char **argv) {
    disassemble_info *dis = malloc(sizeof(*dis));
    assert(dis != NULL);

    dis->arch = bfd_arch_i386;
    dis->read_memory_func = buffer_read_memory;
    dis->buffer_length = 64;
    dis->buffer = malloc(dis->buffer_length);
    memset(dis->buffer, 0x90, dis->buffer_length);
    disassemble_init_for_target(dis);

    int instr_size = print_insn_i386(0, dis);

    printf("instruction size is %d\n", instr_size);

    return 0;
}

期待される結果は、命令サイズ 1 です ( nop)。

編集

すみません、私は愚かな人です。

memset(dis, 0, sizeof(*dis));
4

2 に答える 2

1

Linux カーネルには盗むことができるコードがいくつかあります。ユーザー モード プログラムにコピーすると、うまく動作するはずです。

arch/x86/lib と arch/x86/tools を見てください。そこにはオペコード マップ ファイルがあり、それを読み取って innat.c という名前のファイルにテーブルを生成する awk スクリプトがあります。テーブルを使用してデコーダーを実装する他のファイルがいくつかあります。

命令サイズを決定するだけで十分です。

もちろん、これはGPLに問題がないことを前提としています。

于 2013-03-12T04:10:19.947 に答える
0

disassemble_info データ構造には、提供したよりも多くの初期化が必要なようです。私が研究してきた例から、初期化の正しい方法は init_disassembly_info() を呼び出すことです。

それが役立つかどうかを確認してください。それができない場合は、プログラムをデバッグ情報 ('-g') でコンパイルし、gdb を実行してクラッシュが発生した場所を診断します。

于 2013-03-12T01:20:16.707 に答える