【问题标题】:How can I know where function ends in memory(get the address)- c/c++我如何知道函数在内存中的结束位置(获取地址)- c/c++
【发布时间】:2018-01-03 17:12:42
【问题描述】:

我正在寻找一种简单的方法来查找以内存结尾的函数。我正在做一个项目,该项目将在其他代码中发现运行时问题,例如:代码注入、病毒等。我的程序将使用将在运行时检查的代码运行,以便我可以访问内存。我无权访问源代码本身。我想只检查它的特定功能。我需要知道函数在堆栈中的开始和结束位置。我正在使用 Windows 8.1 64 位。

【问题讨论】:

  • 为什么你想这样做?您想解决的真正问题是什么?请read about the XY problem 想一想这个问题可能是一个怎样的问题。
  • 你不能,而且你不应该有这样做的正当需要。
  • 混合符号反汇编怎么样?
  • 编辑您的问题以改进它,提供更多详细信息(在什么程序、什么编译器、什么操作系统、什么优化选项、什么类型的代码)和给出动机背景。没有它,你的问题毫无意义。
  • C 通常是编译的,但也有interpreters。因此,定位“函数结尾”的假设例程将返回包含其结束 } 的文本行。

标签: c memory


【解决方案1】:

通常,您无法找到函数在内存中的结束位置,因为编译器可能有 optimizedinlined、克隆或删除该函数、将其拆分为不同部分等。该函数可能是一些 @ 987654323@主要是在内核中实现的,或者是外部shared library中的一些函数(“在你程序的executable之外”)...对于C11标准(见n1570)的观点,你的问题没有意义.该标准定义了语言的semantics,即生成程序行为的属性。另请参阅this 答案中的说明。

在某些计算机 (Harvard architecture) 上,代码将保留在不同的内存中,因此询问该函数的开始或结束位置毫无意义。

如果您将问题限制在特定的 C 实现(即具有特定优化设置的特定 compiler,对于特定 operating systeminstruction set architectureABI),您可能(在 一些 情况下,不是在所有情况下)能够找到“函数的结尾”(但这并不简单,也不会是防故障的)。例如,您可以对编译器生成的汇编代码和/或object file 进行后处理,检查ELF 可执行文件及其符号表,检查DWARF 调试信息等...

你的问题闻起来很像XY problem,所以你应该用更多解释和背景来激发它。

我需要知道函数在堆栈中的开始和结束位置。

函数不位于堆栈上,但主要位于可执行文件(或库)的code segment 中。 call stack 上的内容是一系列调用帧。调用框架的组织特定于您的 ABI。某些编译器options(例如-fomit-frame-pointer)会使探索调用堆栈变得困难(无法访问源代码和编译器的帮助)。

我无权访问源代码本身。我想只检查它的特定功能。

您的问题仍然不明确,可能是undecidable,比您认为的要复杂得多(因为与halting problem 相关),并且有大量相关文献(阅读decompiler、@987654344 @、anti-virus & malware analysis)。我建议花几个月或几年的时间学习更多关于编译器的知识(从 Dragon Book 开始)、linkers、指令集架构、ABI。然后查看一些与 ACM SIGPLAN 等相关的会议论文集。在实际方面,研究编译器生成的汇编代码(例如使用 GCCgcc -O2 -S -fverbose-asm....); CppCon 2017 演讲:Matt Godbolt “What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid” 是一个很好的介绍。

我正在从事一个项目,该项目将在其他代码中发现运行时问题,例如:代码注入、病毒等。

我希望您能将几年的全职工作投入到您雄心勃勃的项目中。这可能比您想象的要困难得多,因为优化编译器much more complex 比您认为的要困难得多(并且malware 软件使用各种复杂的技巧来隐藏自己不被检查)。 Malware research 真的很难,但很有趣。

【讨论】:

  • 同意所有这些非常好的答案,除了哈佛架构部分。即使其功能地址与对象地址不可比,该架构也不会或多或少地适用于 OP 的问题。它确实可能带来额外的挑战。
猜你喜欢
  • 1970-01-01
  • 2020-12-03
  • 2011-02-09
  • 2011-10-20
  • 1970-01-01
  • 2021-01-05
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多