本文意在说明Android NDK 在实现C++ RTTI时的相关数据结构,并从汇编角度分析其内存布局,以帮助理解RTTI的实现原理,同时,分析在逆向过程中如何利用RTTI恢复C++类名信息。
用ndk-build编译C++代码时,默认的C++运行时库(libstdc++)是不支持RTTI的, 需要在Application.mk与Android.mk中进行配置。其它可以选择的C++运行时库有GAbi++、STLport、GNU STL、LLVM libc++, 各种库又分静态链接库与动态链接库。其中中STLport的RTTI是借用了GAbi++中的实现,另外GNU STL、LLVM libc++的实现也与GAbi++非常相似(相关数据结构的命名、结构都相似, 可能是因为都是基于Itanium C++ ABI(链接[3])?)。
所以本文将选择STLPort为C++运行时库, 在Application.mk中配置:
APP_STL := stlport_static
在Android.mk中配置:
LOCAL_CPP_FEATURES := rtti
另外,本文使用 Android NDK 10c编译,编译abi为armeabi,编译32位代码时其默认使用GCC 4.8。若使用其它版本NDK或者其它编译器,可能与本文分析结果有差异。
一、C++ RTTI 简介
RTTI是Runtime Type Identification的缩写,即运行时类型识别。程序能够借此使用基类的指针或引用,来检查这些指针或引用所指的对象的实际派生类型。C++通过typeid与dynamic_cast来提供RTTI。typeid返回一个typeinfo对象的引用,它记录了与类型相关的信息,后文将详细分析这个结构;dynamic_cast用于安全而有效地进行向下转型(down_cast),即安全地将一个基类指针转换为一个派生类指针。
它们的基本使用方法如下:
classes.h文件:
class Base
{
public:
Base();
virtual ~Base();
virtual void Func();
private:
int mMember;
};
class Deriver1 : public Base
{
public:
Deriver1();
virtual ~Deriver1();
virtual void Func();
private:
高手谈Android NDK C++ RTTI 分析
最新推荐文章于 2022-02-23 09:59:50 发布
本文探讨了Android NDK中C++ RTTI的实现,包括配置NDK以支持RTTI,以及分析RTTI相关数据结构。通过实例展示了如何使用RTTI进行类型识别,并通过反编译代码验证了内存布局。最后讨论了在逆向工程中如何利用RTTI恢复类名。
摘要由CSDN通过智能技术生成