我们在 IOS 项目上使用 C++,并在 ARM 架构上使用 Apple llvm 3 编译器。我注意到 IDA 可以打开 ARM exe 文件,并且在导出选项卡中我找到了许多 C++ 代码的虚拟表构造函数(类似于“Construction vtable for'BaseClass-in-OtherClass 00AB6AC5',其中 BaseClass 和 OtherClass 是实际的 C++ 类)”从那里您可以找到其他子例程的地址。
我不熟悉 IDA,但我认为从那里你可以找到敏感的子例程并将它们更改为其他目的。我想知道所有符号名称是如何进入发布版本的(我们缺少编译器开关?),以及这些东西是否确实可以用来轻松追踪处理敏感信息的例程。
有没有办法从构建中删除所有名称?
谢谢, 拉克斯万。
最佳答案
strip -x Myapp.app/Contents/MacOS/Myapp
应删除运行程序不需要的所有符号。 (可能也有一些 XCode 设置。)您可能需要使用 visibility options 。以确保所有私有(private)符号都被正确标记。
请注意,您将无法删除 Objective-C 名称(类、字段和方法),因为它们被编码在程序数据段中的 Objective-C 元数据结构中,并且是程序所需的。 Objective-C 运行时。
符号信息的另一个来源是 C++ RTTI(运行时类型信息)。 IDA 目前不使用它,但可以使用一些额外的脚本来恢复类名。您可以使用 -fno-rtti
关闭 RTTI 生成。但是如果您使用 dynamic_cast<>
这会破坏您的代码或typeid
运算符。
关于c++ - IOS 版本包含 IDA 中可见的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18722257/