gpt4 book ai didi

c - 我怎么知道函数在内存中结束的位置(获取地址)- c/c++

转载 作者:太空宇宙 更新时间:2023-11-04 05:16:27 26 4
gpt4 key购买 nike

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

最佳答案

通常,您无法找到函数在内存中结束的位置,因为编译器可能有 optimized , inlined ,克隆或删除该功能,将其拆分为不同的部分等。该功能可能是一些 system call主要在内核中实现,或在外部中实现某些功能 shared library (您程序的“外部” executable )...对于 C11 标准(参见 n1570 )的观点,您的问题没有任何意义。该标准定义了 semantics语言的属性,即生成程序的行为属性。另见 this 中的解释回答。

在某些计算机 ( Harvard architecture ) 上,代码将保留在不同的内存中,因此询问该函数从哪里开始或结束是没有意义的。

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

你的问题闻起来很像一些 XY problem ,因此您应该通过更多解释和上下文来激发它。

I need to know where functions start and end in stack.

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

I don't have access to the source code itself. I would like to examine only specific functions from it.

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

I'm working on a project that will find problems on run time in other code, such as: code injection, viruses and so fourth.

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

关于c - 我怎么知道函数在内存中结束的位置(获取地址)- c/c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48082040/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com