- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在寻找一种简单的方法来查找以内存结尾的函数。我正在做一个项目,它会在其他代码中发现运行时的问题,例如:代码注入(inject)、病毒等等。我的程序将运行将在运行时检查的代码,以便我可以访问内存。我无权访问源代码本身。我只想检查它的特定功能。我需要知道函数在堆栈中的开始和结束位置。我正在使用 Windows 8.1 64 位。
最佳答案
通常,您无法找到函数在内存中结束的位置,因为编译器可能有 optimized , inlined ,克隆或删除该功能,将其拆分为不同的部分等。该功能可能是一些 system call主要在内核中实现,或在外部中实现某些功能 shared library (您程序的“外部” executable )...对于 C11 标准(参见 n1570 )的观点,您的问题没有任何意义。该标准定义了 semantics语言的属性,即生成程序的行为属性。另见 this 中的解释回答。
在某些计算机 ( Harvard architecture ) 上,代码将保留在不同的内存中,因此询问该函数从哪里开始或结束是没有意义的。
如果您将问题限制在特定的 C 实现(即具有特定优化设置的特定 compiler,针对特定的 operating system 和 instruction set architecture 和 ABI ),您可能(在一些情况下,并非在所有情况下)能够找到“函数的结尾”(但这并不简单,也不会万无一失)。例如,您可以后处理汇编代码和/或 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 相关),并且有相当多的相关文献(阅读 decompiler 、 static code analysis 、 anti-virus 和 malware analysis )。我建议花几个月或几年时间学习更多关于编译器的知识(从 Dragon Book 开始),linkers ,指令集架构,ABI。再看看几个ACM相关的 session 论文集SIGPLAN等。在实践方面,研究编译器生成的汇编代码(例如,使用 GCC 和 gcc -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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!