静态链接库:如何确定代码是否在可执行文件的连续区域?
我this看了这么回答静态链接库:如何确定代码是否在可执行文件的连续区域?
当静态文件链接到一个可执行文件,该文件的内容都包含在链接时。换句话说,文件的内容被物理地插入到您要运行的可执行文件中。
我想知道在一般情况下,这段代码是否在连续区域。我从another学到了回答,这可能并不总是如此:
这种假设是在简单的情况可能是真实的,但绝不是保证。
说我有一个剥离的二进制文件,没有源代码。但我知道可执行文件是使用某个静态链接的库构建的。
- 是否有可能找出静态链接库中的代码是否在可执行文件的连续区域?如果在一般情况下不可能,是否有启发式或指标?
- 为什么链接器将库的代码放在可执行文件的不同位置?我猜这些会是罕见的边缘情况,对吧?
如果要分析可执行文件,可以使用反编译和代码查看工具。这里的人可能会更好地帮助你:https://reverseengineering.stackexchange.com/
至于为什么它可能是一个优化,主要是为了可执行文件的大小,移动这个区域或将其分割成方便大小的洞。另一个主要原因是防止跳到图书馆攻击。基本上,内存执行保护可防止攻击者将任意代码写入数据缓冲区并执行。作为回应,破解者有时会将攻击从库代码中拼凑出来,因此库的位置是随机的。这不是你想要做的,对吧?
谢谢你的回答。我知道为什么图书馆代码可能不在连续的区域。至于第一个问题(如何确定它是否在连续区域中),我会尝试提出有关reverseengineering.stackexchange.com的更精确的问题 – stackoverflowwww
您的问题中的第二个链接似乎回答第二个问题(为什么链接器将重新排序代码?)。一般来说,如果你问这个问题,它会提高效率;通常,您需要提供链接器的分析信息才能执行此优化。查看'-freorder-functions'的'gcc'文档 – rici