我正在寻找一种简单的方法来查找在内存中结束的函数.我正在开发一个项目,可以在其他代码中找到运行时问题,例如:代码注入,病毒等等.我的程序将使用将在运行时检查的代码运行,以便我可以访问内存.我无法访问源代码本身.我想只检查它的具体功能.我需要知道函数在堆栈中的起始和结束位置.我正在使用Windows 8.1 64位.
一般来说,你无法找到函数在内存中的结束位置,因为编译器可以优化,内联,克隆或删除该函数,将其拆分为不同的部分等.该函数可能是一些系统调用,主要在内核中实现,或者外部共享库中的某些函数(程序可执行文件的 "外部" )...对于C11标准(参见n1570)的观点,你的问题毫无意义.该标准定义了语言的语义,即生成程序行为的属性.另见本答案中的解释.
在某些计算机(哈佛架构)上,代码将保留在不同的内存中,因此无需询问该函数的开始或结束位置.
如果将问题限制在特定的C 实现(具有特定优化设置的特定编译器,对于特定的操作系统和指令集架构和ABI),您可能(在某些情况下,不是在所有这些中)都能够找到"功能的结束"(但这不会很简单,也不会出现故障).例如,您可以对编译器生成的汇编代码和/或目标文件进行后处理,检查ELF可执行文件及其符号表,检查DWARF调试信息等...
你的问题很像一些XY问题,所以你应该激励它,有更多的解释和背景.
我需要知道函数在堆栈中的起始和结束位置.
函数不在堆栈中,但主要位于可执行文件(或库)的代码段中.什么是上调用栈是呼叫帧序列.呼叫帧的组织特定于您的ABI.一些编译器选项(例如-fomit-frame-pointer)将难以探索调用堆栈(无需访问源代码和编译器的帮助).
我无法访问源代码本身.我想只检查它的具体功能.
你的问题仍然是不明确的,可能是不可判定的,比你认为的要复杂得多(因为与停止问题有关),并且有相关的大量文献(阅读反编译器,静态代码分析,反病毒和恶意软件分析).我建议花几个月或几年时间学习更多关于编译器(从Dragon Book开始),链接器,指令集架构,ABI.然后看看到与ACM会议的几个程序SIGPLAN等在实践方面,研究由编译器生成汇编代码(例如使用GCC与gcc -O2 -S -fverbose-asm....); CppCon 2017演讲:Matt Godbolt "我的编译器最近为我做了什么?解开编译器的盖子"是一个很好的介绍.
我正在开发一个项目,可以在其他代码中找到运行时问题,例如:代码注入,病毒等等.
我希望你能为你雄心勃勃的项目投入数年的全职工作.它可能比您想象的要困难得多,因为优化编译器比您认为的要复杂得多(恶意软件使用各种复杂的技巧来隐藏自己的检查).恶意软件研究真的很难,但有趣.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |