IDA反汇编/反编译静态分析iOS模拟器程序(七)识别类的信息

简介: C++类的实质是个结构体。先举个例: class TestClass{ int m_val1; int m_val2;public: int getVal1(); int getVal2();};i...

C++类的实质是个结构体。先举个例:

class TestClass
{
    int m_val1;
    int m_val2;
public:
    int getVal1();
    int getVal2();
};

int TestClass::getVal1()
{
    return m_val1;
}
int TestClass::getVal2()
{
    return m_val2;
}

反编译两个函数,得到的是

int __cdecl TestClass__getVal1(int a1)
{
  return *(_DWORD *)a1;
}
int __cdecl TestClass__getVal2(int a1)
{
  return *(_DWORD *)(a1 + 4);
}
getVal1直接返回this指针的解引用,也就是m_val1的内存地址和实例对象是一致的,m_val2则是在m_val1的后一个int,所以是this指针+4字节。

如果类有虚函数,则与this指针同地址的是一个虚函数表,各个成员变量的偏移会+4。虚表的应用可看看《利用IDA和LLDB探索WebCore的C++类的继承关系

明白以上这个原理,在反编译C++类的代码时,看见a1+x的地方就能猜出是在访问成员变量。

关于C++的反编译很多资料都有提及了,这里不赘述。除了《IDA Pro权威指南》那本书,推荐两篇文章:

逆向 C++-- 识别类及其构造函数

逆向 C++-- 2 识别类

下面说说Objective-C的。

在反汇编的窗口搜索(Alt+T)关键字 _objc_ivar


随意找到哪个,双击它,便会跳转到Objective-C类保存成员变量信息的区域,以__objc_ivar:开头的偏移段。


OC(Objective-C)这样做,主要是为了Key-Value Coding,方便了开发者,却也方便了逆向工程者,多了一些C++类没有的信息。

图中绿色的字符是代表相对偏移,即对于self指针的地址加上多少就是访问此成员变量,与上面C++类的概念相同。

对一些复杂类型的变量,还可以查找到它的类型信息。

例如在_OBJC_IVAR_$_UIView._gestureRecognizers上查看引用


选择以__objc_const开头的引用来跳转


这几行是ivar结构体的保存区域。

00000000 __objc2_ivar    struc ; (sizeof=0x14)   ; XREF: __objc_const:000054E8
目录
相关文章
|
1月前
|
存储 运维 安全
iOS加固原理与常见措施:保护移动应用程序安全的利器
iOS加固原理与常见措施:保护移动应用程序安全的利器
28 0
|
3月前
|
定位技术 iOS开发
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
iOS设备功能和框架: 如何使用 Core Location 获取设备的位置信息?
19 0
|
3月前
|
监控 测试技术 iOS开发
查看ios 应用程序性能
查看ios 应用程序性能
37 0
|
30天前
|
iOS开发 开发者
iOS移动应用程序的备案与SHA-1值查看
iOS移动应用程序的备案与SHA-1值查看
36 2
|
2月前
|
iOS开发 开发者 索引
批量上传 iOS 应用程序截图的实用技巧
批量上传 iOS 应用程序截图的实用技巧
|
3月前
|
JSON JavaScript 安全
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
iOS 应用程序数据保护:如何保护 iOS 应用程序中的图片、资源和敏感数据
|
3月前
|
存储 Linux iOS开发
iOS 技术博主指南:填写苹果应用上架中的隐私政策信息
iOS 技术博主指南:填写苹果应用上架中的隐私政策信息
|
3月前
|
安全 Java 数据安全/隐私保护
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现
70 0
|
11月前
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
84 0
|
11月前
|
C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)