问题标签 [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.

0 投票
1 回答
693 浏览

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/pltld.soheapgdb

程序的简化 src :

p()反汇编的函数objdump(1)

当程序在 gdb(1) 下运行时,复制的代码与上面提供的 objdump(1) 相同(十六进制值):

如果我们查看 main ,我们接下来会进入块:

但是当 p() 和 chunk 被反汇编时,我们call 0x80d2c90在内存块中有 a 而不是call 0x8048f50 <puts>p() 函数中的 like 吗?由于这个原因显示的地址不一样。

检查内存时,代码似乎相同。在这一点上我不明白发生了什么,有什么问题?gdb的解释失败,代码副本还是什么?

如果设置了断点,则在内存块中继续执行:

因此,此时程序要么像那样运行并且发生段错误,要么 $eip 被更改并且程序结束而没有错误。

我不明白发生了什么,什么失败了。代码的副本似乎还可以,也可以跳转到内存块中,那么为什么(调用的)地址不好?

感谢您的回答和您的时间

0 投票
1 回答
198 浏览

arrays - 从调试信息中检索变量类型

考虑 :

如果我们对数据部分进行 objdump,我们将得到变量 x,其起始地址和大小为 (4*3) 字节。有没有简单的方法来检索 x 是一个数组以及什么类型的信息?

我知道我们可以使用 dwarfdump -i a.out 来做到这一点,然后解析结果以达到同样的效果,但是有什么更简单的方法可以做到。我只需要检查它是否是一个数组以及什么类型?

问候,

潘卡伊

0 投票
2 回答
50681 浏览

linux - objdump 如何发出 intel 语法

我如何知道objdump以英特尔语法而不是默认的 AT&T 语法发出程序集?

0 投票
3 回答
1150 浏览

c++ - 将源代码与 C++ 程序的汇编列表相关联

在零售构建中分析核心转储通常需要将objdump任何特定模块与源相关联。如果功能非常复杂,通常将程序集转储与源相关联会变得很痛苦。今天,我尝试创建assembly listing一个特定模块(使用 compile 选项-S),期望我会看到一个带有汇编或某些相关性的交错源。不幸的是,列表不够友好,无法关联,所以我想知道

  • 给定一个核心转储,我可以从中确定崩溃位置
  • objdump通过重新编译失败的模块组装清单
  • -S选项的模块。

是否可以与来源进行一一对应?

例如,我将程序集列表视为

但不明白如何解释标签.LVL2123和指令.loc 2 4863 0

注意 正如所描述的答案,阅读汇编源代码并根据符号(如函数调用、分支、返回语句)直观地确定模式是我通常所做的。我不否认它不起作用,但是当一个函数非常复杂时,阅读汇编列表页面是一种痛苦,并且通常你最终会得到很少匹配的列表,因为函数被内联或优化器只是简单地扔了代码随心所欲。我有一种感觉,看看效率如何Valgrind处理优化的二进制文件以及在 Windows WinDBG 中如何处理优化的二进制文件,我缺少一些东西。所以我虽然我会从编译器输出开始并使用它来关联。如果我的编译器负责修改二进制文件,那将是说明如何与源代码关联的最佳人选,但不幸的是,这几乎没有帮助,而且.loc确实具有误导性。不幸的是,我经常不得不通读各种平台上无法重现的转储,而我花最少的时间是通过 WinDBG 调试 Windows Mini-dumps,而在调试 Linux Coredumps 上花费了相当多的时间。我虽然这可能是我做事不正确,所以我想出了这个问题。

0 投票
1 回答
854 浏览

linux - 反汇编 /proc/kcore 时,objdump 和 udis86 产生不同的输出

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

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

对象转储

udis86

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

0 投票
2 回答
4938 浏览

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,软软的

0 投票
1 回答
1884 浏览

global-variables - 如何提取objdump输出文件中全局变量的数据类型?

我有一个使用 objdump 反汇编工具反汇编的二进制文件。我想知道如何提取 objdump 输出文件中存在的全局变量的数据类型?

0 投票
1 回答
742 浏览

windows - Windows 中的 objdump 以查看调试信息

我需要在 .out 文件中获取变量的地址和成员名称。我基本上使用 gcc 在 linux 中编译了 ac 程序,我想看看文件的信息。linux上有很多例子,但我需要在windows上做。

编辑

我安装了 cygwin,由于某种原因 objdump 不起作用:

在此处输入图像描述

0 投票
1 回答
6090 浏览

cygwin - 在cygwin上找不到objdump

我想在 cygwin 上使用 objdump 命令。我得到了例外:

-bash:objdump:找不到命令

为什么cygwin找不到objdump?

编辑----我可以在http://cygwin.com/packages/看到 binutils 。一旦我找到 binutils 包,我点击它,它会带我到这里。我该如何安装它?我到那里后应该做什么?

0 投票
1 回答
4364 浏览

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 命令,那就太好了。