2012-05-05 9 views
2

/proc/kcoreファイルをLinuxで逆アセンブルする必要があり、後でkprobesを入れるためにいくつかの特別な指示の仮想アドレスを取得する必要があります。 this document/proc/kcoreによると、物理メモリの画像ですが、this questionに誰かがそれはカーネルの仮想メモリ(正確に私が探しているもの)と答えました。objdumpとudis86は、/ proc/kcoreを逆アセンブルするときに異なる出力を生成します

objdumpツールを使用して逆アセンブルすると、f7c0b000のようなアドレスから開始されますが、0x32で始まるudis86(まったく別の命令)です。私はいくつかの特定の命令grepにしようとすると、のmov 0xf7c1d60c,%edxを言わせて、私が得た:

objdumpの

f7c0b022 mov 0xf7c1d60c,%edx 

udis86

290ec02a mov 0xf7c1d60c,%edx 

udis86objdumpある間のオフセットのように見えます常に0xbffff000です。なぜそんなに奇妙なオフセット?特定の命令の仮想アドレスはどのように取得できますか?私が読んだところでは、そのカーネルは仮想アドレス0xc0000000 + 0x100000に静的にマップされています。 /proc/kcoreが実際の物理イメージの場合は、objdumpによって返されたアドレスに0x100000を追加するだけで正しいですか?仮想アドレスを取得しますか?

答えて

3

objdumpELFフォーマットファイル(/proc/kcoreなど)を理解してください。実行可能でないコンテンツ(例えば、.noteセクション)を無視して、ファイルの実行可能セクションを抽出することができます。

次の例のように、-hフラグを使用してELF exectuableの構造を見ることができます:

# objdump -h /proc/kcore 
/proc/kcore:  file format elf64-x86-64 

Sections: 
Idx Name   Size  VMA    LMA    File off Algn 
    0 note0   00001944 0000000000000000 0000000000000000 000002a8 2**0 
        CONTENTS, READONLY 
    1 .reg/0  000000d8 0000000000000000 0000000000000000 0000032c 2**2 
        CONTENTS 
    2 .reg   000000d8 0000000000000000 0000000000000000 0000032c 2**2 
        CONTENTS 
    3 load1   00800000 ffffffffff600000 0000000000000000 7fffff602000 2**12 
        CONTENTS, ALLOC, LOAD, CODE 
(...) 

udis86からudcliツールは、おそらくことを示唆しているファイルの先頭から物事を分解始まりのように見えますあなたの出力は無関係な出力から始まります。実行がどこから始まっているのかはあなた次第です。

UPDATE

は、ここでの検証です。私たちはこのように、/ procの/ KCOREから最初load部分を抽出するためにthis answerを使用します。

# dd if=/proc/kcore of=mysection bs=1 skip=$[0x7fffff602000] count=$[0x00800000] 

そして今、我々はudcliていることを表示する場合:

# udcli mysection 
0000000000000000 48    dec eax     
0000000000000001 c7c060000000  mov eax, 0x60   
0000000000000007 0f05    syscall     
0000000000000009 c3    ret      
000000000000000a cc    int3      
000000000000000b cc    int3      

我々はそれがほとんど同じに見えることを確認objdump -d /proc/kcore

# objdump -d /proc/kcore 
/proc/kcore:  file format elf64-x86-64 


Disassembly of section load1: 

ffffffffff600000 <load1>: 
ffffffffff600000:  48 c7 c0 60 00 00 00 mov $0x60,%rax 
ffffffffff600007:  0f 05     syscall 
ffffffffff600009:  c3      retq 
ffffffffff60000a:  cc      int3 
ffffffffff60000b:  cc      int3 
+0

これは素晴らしいことですが、それは魅力のように動作します。ありがとうございます。アドレスはどうですか?たとえば、使用できる仮想アドレスを取得するにはどうすればいいですか? kprobesのために? –

+0

私は独自のモジュールを作成し、いくつかの機能のアドレスをダンプしようとしました。そして、私が 'objdump -d/proc/kcore'でこれらのアドレスを' grep 'しようとしたとき、私は本当にそれらを見つけました。あなたがそれについて考えるなら、kcoreはELF形式ですので、もちろん仮想アドレスがあるべきです、そうですか? –

関連する問題