设置

案例分析

修改1:main中调用

 

int sum(int a, int b){
return a + b;
}


int main(int argc, char * argv[]) {

sum(1, 2);
}

修改2:打印sum的结果

 

int sum(int a, int b){
return a + b;
}


int main(int argc, char * argv[]) {
int a = sum(1, 2);
printf(@"%d", a);
}

指针

 

iOS逆向 04:OC反汇编(上)_iOS

指针分析

  • 问题:a++之后,a是多少?

  • 是104,因为指针的自增自减和指向的数据类型宽度有关,即因为a指向的数据是int,int的宽度是4个字节

  • 修改1、如果将int改成char,结果是多少呢?

  • 因为a指向的数据是char,char的宽度是1个字节

 

void func(){
char *a;
a = (char *)100;
a++;
printf("%d", a);
}

<!--打印结果-->
101
  • 指针和指针求差值

指针的反汇编

 

iOS逆向 04:OC反汇编(上)_iOS_02

指针的反汇编分析

运行发现是可以的,所以有以下对等关系:

  • 运行发现也是可以的

运行发现,崩溃报错:原因是以0作为地址取值,以下是对应的汇编分析


查看汇编代码:

  • 查看汇编:
    • 以下是func函数的汇编,此时d是取

[x8+0x4]

    • 地址的值,因为int是4个字节,

0x4

    • 就是

int类型的步长

iOS逆向 04:OC反汇编(上)_iOS_03

指针的基本用法-04

 

  • 查看汇编,此时d是取[x8+0x8]地址的值,因为int*是一个指针,占8个字节,0x8就是int*类型的步长

    iOS逆向 04:OC反汇编(上)_iOS_04

    指针的基本用法-05

     

  • int** 需要拉伸多少个字节?
    实际需要3x8=24字节,由于是汇编是16字节对齐,所以需要sub减0x20

  • 此时多增加一个int* p2 ,栈空间拉伸多少字节?
    发现仍然是0x20

    iOS逆向 04:OC反汇编(上)_iOS_05

    指针的基本用法-06

     

  • 再多增加一个char c1呢?
    此时超过了32,所以需要再多拉伸16字节

    iOS逆向 04:OC反汇编(上)_iOS_06

    指针的基本用法-07

     

 

有以下代码

 

void func(){
int **p1;
int c = **p1;
}

2、多级指针加法运算

 

void func(){
char **p1;
// char c = p1+2; //此时的+2是 +0x10(执行数据类型是char*)
char c = *(*(p1 + 2) + 2);//最外层的+2,是加0x2(执行数据类型是char)
}
  • p1[1] 此时的1表示0x8(类型是char*)

  • p1[1][2] 此时的2表示 0x2(类型是char)

    iOS逆向 04:OC反汇编(上)_iOS_07

    多级指针-02


    从汇编结果来看p1[1][2]与*(*(p1 + 2) + 2)是等价的

     

if-else比大小,因为类型是可以相互转换的