问题标签 [objdump]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 自修改代码,堆中复制/跳转失败
首先我很抱歉这篇文章的长度,但我想清楚地解释这个问题。
我尝试用 C 编写一种小型的自我修改程序,但我遇到了一些麻烦,我不知道究竟是为什么。
平台是: Ubuntu/Linux 2.6.32-40 x86_64,prog 基于 x86 arch,gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3,GNU ld (GNU Binutils for Ubuntu) 2.20.1-system.20100303
该程序的目的是创建一个读/写/执行内存块(使用memalign(3)和mprotect(2)),在这块内存中复制一个名为p()
(在.text
段中定义)的小函数,然后执行通过指针复制函数。该p()
函数仅使用显示一条消息printf(puts)
。
为了获取p()
(复制它)的代码的起始地址和结束地址,我使用了函数本身的地址和在indummy()
之后创建的函数的地址。p()
.text
块内存创建和复制已成功完成,但是当块中的代码运行时会发生段错误。通过使用gdb
很明显,我们输入了块的代码(复制的函数的主体),但是对printf 的调用失败了。反汇编p()
块中的函数和代码时,我发现“调用”中使用的地址不一样。
而且我不知道为什么地址不正确,复制代码时会显示它,这与我反汇编p()
函数时objdump(或gdb)给我的一样。
创建二进制文件是-static
为了避免. 在 上运行代码似乎不是问题,因为复制函数的开头已执行(检查下)。got/plt
ld.so
heap
gdb
程序的简化 src :
p()
反汇编的函数objdump(1)
:
当程序在 gdb(1) 下运行时,复制的代码与上面提供的 objdump(1) 相同(十六进制值):
如果我们查看 main ,我们接下来会进入块:
但是当 p() 和 chunk 被反汇编时,我们call 0x80d2c90
在内存块中有 a 而不是call 0x8048f50 <puts>
p() 函数中的 like 吗?由于这个原因显示的地址不一样。
检查内存时,代码似乎相同。在这一点上我不明白发生了什么,有什么问题?gdb的解释失败,代码副本还是什么?
如果设置了断点,则在内存块中继续执行:
因此,此时程序要么像那样运行并且发生段错误,要么 $eip 被更改并且程序结束而没有错误。
我不明白发生了什么,什么失败了。代码的副本似乎还可以,也可以跳转到内存块中,那么为什么(调用的)地址不好?
感谢您的回答和您的时间
arrays - 从调试信息中检索变量类型
考虑 :
如果我们对数据部分进行 objdump,我们将得到变量 x,其起始地址和大小为 (4*3) 字节。有没有简单的方法来检索 x 是一个数组以及什么类型的信息?
我知道我们可以使用 dwarfdump -i a.out 来做到这一点,然后解析结果以达到同样的效果,但是有什么更简单的方法可以做到。我只需要检查它是否是一个数组以及什么类型?
问候,
潘卡伊
linux - objdump 如何发出 intel 语法
我如何知道objdump
以英特尔语法而不是默认的 AT&T 语法发出程序集?
c++ - 将源代码与 C++ 程序的汇编列表相关联
在零售构建中分析核心转储通常需要将objdump
任何特定模块与源相关联。如果功能非常复杂,通常将程序集转储与源相关联会变得很痛苦。今天,我尝试创建assembly listing
一个特定模块(使用 compile 选项-S
),期望我会看到一个带有汇编或某些相关性的交错源。不幸的是,列表不够友好,无法关联,所以我想知道
- 给定一个核心转储,我可以从中确定崩溃位置
objdump
通过重新编译失败的模块组装清单- 带
-S
选项的模块。
是否可以与来源进行一一对应?
例如,我将程序集列表视为
但不明白如何解释标签.LVL2123
和指令.loc 2 4863 0
注意
正如所描述的答案,阅读汇编源代码并根据符号(如函数调用、分支、返回语句)直观地确定模式是我通常所做的。我不否认它不起作用,但是当一个函数非常复杂时,阅读汇编列表页面是一种痛苦,并且通常你最终会得到很少匹配的列表,因为函数被内联或优化器只是简单地扔了代码随心所欲。我有一种感觉,看看效率如何Valgrind
处理优化的二进制文件以及在 Windows WinDBG 中如何处理优化的二进制文件,我缺少一些东西。所以我虽然我会从编译器输出开始并使用它来关联。如果我的编译器负责修改二进制文件,那将是说明如何与源代码关联的最佳人选,但不幸的是,这几乎没有帮助,而且.loc
确实具有误导性。不幸的是,我经常不得不通读各种平台上无法重现的转储,而我花最少的时间是通过 WinDBG 调试 Windows Mini-dumps,而在调试 Linux Coredumps 上花费了相当多的时间。我虽然这可能是我做事不正确,所以我想出了这个问题。
linux - 反汇编 /proc/kcore 时,objdump 和 udis86 产生不同的输出
我需要/proc/kcore
在 Linux 中反汇编文件,并且需要获取一些特殊指令的虚拟地址,以便kprobes
稍后放置。根据这个文件 /proc/kcore
是物理内存的图像,但在这个问题中有人回答说它是内核的虚拟内存(正是我正在寻找的)。
当我使用objdump
工具反汇编它时,它以类似的地址开头f7c0b000
,但udis86以 0x0 开头(和完全不同的指令)。当我尝试grep
一些特定的指令时,比如说mov 0xf7c1d60c,%edx
,我得到了:
对象转储
udis86
看起来和之间的偏移udis86
量objdump
总是0xbffff000
。为什么这么奇怪的偏移量?如何获取特定指令的虚拟地址?我读过的某个地方,该内核被静态映射到虚拟地址 0xc0000000 + 0x100000。如果/proc/kcore
真的是物理图像,只将 0x100000 添加到返回的地址是否正确objdump
,我将获得虚拟地址?
c++ - 从 Objdump 实用程序检索 vptr(指向虚拟表又名 VTABLE 的指针)?
我们如何使用 objdump 实用程序和反汇编代码知道 VTABLE 的地址(即对应的vptr)。vptr 通常存储在 object 的第一个字节中。(更正/编辑这个)。有这个使用虚函数的简单代码:
以下是代码的输出:
以下是主要功能的一部分 - 代码的反汇编:
这里显示 _ZN4baseC1Ev 是基础对象的地址,_ZN3derC1Ev 是派生对象的地址。
在 _ZN4baseC1Ev
这是objdump -S exe文件输出的链接
还有 objdump -t virtualfunctionsize | grep vtable 给出了这个:
我想知道 - VTABLE地址和它所表示的相应虚函数是什么。
Vptr 的地址是 = 0x7fff86a78fe0 ,这代表什么 - VTABLE 位置?
Vptr 的值是 = 0x400c30 - 这代表什么 - 基类的第一个虚函数?
怎样才能找到派生类的虚函数的后续地址呢?
Rgds,软软的
global-variables - 如何提取objdump输出文件中全局变量的数据类型?
我有一个使用 objdump 反汇编工具反汇编的二进制文件。我想知道如何提取 objdump 输出文件中存在的全局变量的数据类型?
windows - Windows 中的 objdump 以查看调试信息
我需要在 .out 文件中获取变量的地址和成员名称。我基本上使用 gcc 在 linux 中编译了 ac 程序,我想看看文件的信息。linux上有很多例子,但我需要在windows上做。
编辑
我安装了 cygwin,由于某种原因 objdump 不起作用:
cygwin - 在cygwin上找不到objdump
我想在 cygwin 上使用 objdump 命令。我得到了例外:
-bash:objdump:找不到命令
为什么cygwin找不到objdump?
编辑----我可以在http://cygwin.com/packages/看到 binutils 。一旦我找到 binutils 包,我点击它,它会带我到这里。我该如何安装它?我到那里后应该做什么?
gcc - objdump/readelf 获取变量信息
我需要从已编译的 c 程序中获取有关全局变量的信息。我在这里问了一个类似的问题。
我现在遇到的问题是我试图提取变量信息的程序非常大,只需要 4 秒才能获得文本中的树(readelf -w[i] file.out
)。然后我必须解析来回跳跃的树才能到达我需要的地方。例如,如果一个变量是类型的,const unsigned char * volatile MyVariable
那么我将不得不导航到树的 5 个不同节点,如果程序包含 1000 个变量,那么需要一段时间才能得到我需要的东西。
所以我的问题是如何更好地利用 readelf 命令来实现我所需要的。该readelf -w[i] file.out
命令为我提供了我需要的更多信息(每个函数、子程序、局部变量等)。例如,我没有通过该命令的输出来获取全局变量,而是使用该readelf -s --wide file.out
命令来获取变量。该命令只会给我变量的名称,所以我仍然需要在树中查看变量是否为整数。
在此链接的第 237 页上,我相信有一个示例说明如何获取有关类型的信息。这是一张照片:
我需要大约 15 秒来解析我需要的内容,但仍然有几个错误。如果我不必重新发明轮子并更好地使用 readelf 命令,那就太好了。