首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当分解/proc/kcore时,objdump和udis86产生不同的输出。

问当分解/proc/kcore时,objdump和udis86产生不同的输出。
EN

Stack Overflow用户
提问于 2012-05-05 16:28:33
回答 1查看 875关注 0票数 2

我需要在Linux中反汇编/proc/kcore文件,并且需要获得一些特殊指令的虚拟地址,以便稍后将kprobes放在上面。根据本文件,/proc/kcore是物理内存的映像,但是在这个问题中有人回答说它是内核的虚拟内存(这正是我要找的)。

当我使用objdump工具拆解它时,它以类似于f7c0b000的地址开始,但是udis86以0x0开头(和完全不同的指令)。当我尝试grep一些特定的指令时,比如说mov 0xf7c1d60c,%edx,我得到了:

objdump

代码语言:javascript
复制
f7c0b022 mov    0xf7c1d60c,%edx

udis86

代码语言:javascript
复制
290ec02a mov    0xf7c1d60c,%edx

看起来,udis86和objdump之间的偏移总是0xbffff000。为什么会有这么奇怪的偏移?如何获得特定指令的虚拟地址?在我读过的某个地方,这个内核被静态地映射到虚拟地址0xc0000000 + 0x100000。如果/proc/kcore确实是物理映像,那么只向objdump返回的地址添加0x100000是否正确,而我将得到虚拟地址?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-07 17:57:29

objdump理解ELF格式文件(如/proc/kcore)。它能够提取文件的可执行部分,同时忽略不可执行的内容(例如.note部分)。

您可以看到使用ELF标志可执行的-h结构,例如:

代码语言:javascript
复制
# 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的udis86工具可能从文件一开始就开始分解东西,这意味着您的输出可能会从一堆不相关的输出开始,这取决于您从何处开始执行。

更新

这是验证文件。我们使用这个答案从/proc/kcore提取第一个load部分,如下所示:

代码语言:javascript
复制
# dd if=/proc/kcore of=mysection bs=1 skip=$[0x7fffff602000] count=$[0x00800000]

现在如果我们用udcli来查看

代码语言:javascript
复制
# 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的输出几乎相同。

代码语言:javascript
复制
# 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   
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10463764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档