gpt4 book ai didi

android - 如何从已编译的二进制文件 (.so) 中删除字符串

转载 作者:IT老高 更新时间:2023-10-28 23:40:08 29 4
gpt4 key购买 nike

如何从已编译的二进制文件中删除/混淆字符串?目的是避免让人们阅读里面的函数/方法的名称。

它是使用 NDK 工具(包括 GCC)从 C++ 代码为 Android 编译的动态库 (.so)

我用 -O3 编译并且已经使用 arm-eabi-strip -g mylib.so 来删除调试符号,但是当我这样做时 strings mylib.所以所有函数/方法的名字还是可读的。

最佳答案

这些字符串在动态符号表中,当库在运行时加载时使用。 readelf -p .dynstr mylib.so 将显示这些条目。

strip -g 将删除调试符号,但它不能从动态符号表中删除条目,因为在运行时可能需要这些条目。您的问题是您在动态符号表中有永远不会从库外部调用的函数的条目。除非您告诉它,否则编译器/链接器无法知道哪些函数构成外部 API 的一部分(因此需要动态符号表中的条目)以及哪些函数是您的库私有(private)的(因此不需要在动态符号表),所以它只是为所有非静态函数创建动态符号表条目。

您可以通过两种主要方式告知编译器哪些函数是私有(private)的。

  1. 标记私有(private)函数static。显然,这仅适用于仅在单个编译单元中需要的函数,但对于某些库而言,这种技术可能就足够了。

  2. 使用 gcc "visibility"属性将函数标记为可见或隐藏。您有两个选择:要么将所有私有(private)函数标记为隐藏,要么使用 -fvisibility=hidden 编译器选项将默认可见性更改为隐藏,并将所有公共(public)函数标记为可见。后者可能是您的最佳选择,因为这意味着您不必担心意外添加功能而忘记将其标记为隐藏。

如果你有一个函数:

int foo(int a, int b);

然后将其标记为隐藏的语法是:

int foo(int a, int b) __attribute__((visibility("hidden")));

将其标记为可见的语法是:

int foo(int a, int b) __attribute__((visibility("default")));

更多详情,见this document ,这是有关此主题的极好信息来源。

关于android - 如何从已编译的二进制文件 (.so) 中删除字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2872638/

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