博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS汇编基础(四)指针和macho文件
阅读量:6293 次
发布时间:2019-06-22

本文共 1996 字,大约阅读时间需要 6 分钟。

一 基本运算

1. 加法

int* a;a=(int*)100;a++;printf("%d",a);复制代码

运行结果为:104 a为指向int类型的指针,a++相当于指针偏移寻找下一个int,int在64位占4个字节,所以a++是104

char** a;a=(char**)100;a++;复制代码

运行结果为108 a为指向指针的指针,指针偏移,64位中指针占8个字节,所以结果为108

2. 减法

int* a;a=(int*)100;int* b;b=(int*)300;printf("%d", a-b);复制代码

运行结果为-50 因为 a和b都是指向int的指针,指针减法是要让结果除以数据类型的宽度,int类型宽度为4

int** a; a=(int**)100; int** b; b=(int**)300; printf("%d", a-b);复制代码

运行结果为-25 因为a为指针类型,指针类型占8个字节

int* a;a=(int*)100;int c = a-99;printf("%d", c);复制代码

运行结果为-296

  • 指针的加减运算本质上是指针偏移,寻找下一个地址或上一个地址
  • 指针求差,得到的结果是整形,其结果和指针指向的数据类型宽度有关
  • 指针的运算单位是数据类型的宽度

3. 取值

int arr[5] = {1,2,3,4,5};for (int i=0; i<5; i++) {    printf("%d ",*(arr+i));}//运行结果为 1 2 3 4 5复制代码

arr为数组首地址,指针偏移依次取出每一个值 以上代码可以这样写:

int arr[5] = {1,2,3,4,5};    int* a=arr;    for (int i=0; i<5; i++) {        printf("%d ",*(a));        a++;    }复制代码

还可以这样:

int arr[5] = {1,2,3,4,5};    for (int i=0; i<5; i++) {        printf("%d ",arr[i]);    }复制代码

二 指针的汇编

1. 一级指针

int* p1;           //  ldur   x8, [x29, #-0x8] int c = *p1;      // ldr    w9, [x8]复制代码

把这块内存 [x29, #-0x8]给x8;然后x8的值给w9

2. 二级指针

int** p1;    //ldur   x8, [x29, #-0x8] int c = **p1;    // ldr    x8, [x8];  ldr    w9, [x8]复制代码

把[x29, #-0x8]这块内存给x8;然后x8存的是指向指针的指针。ldr x8, [x8]取出x8的值,还是指针赋给x8;ldr w9, [x8]取出x8的值赋给w9为int类型。

3. 指针偏移

char** p1;   //  ldr    x8, [sp, #0x8]char c = *(*(p1 + 1) + 2);复制代码

*(p1 + 1)是指针的指针偏移一个单位,宽度为8个字节,所以汇编代码为:ldr x8, [x8, #0x8]; ((p1 + 1) + 2) char的宽度是1所以汇编代码为ldrb w9, [x8, #0x2]

三 利用class-dump导出所有头文件

1. 安装class-dunmp

可以直接安装 或者安装 安装MonkeyDev过后设置环境变量:因为本人用的zsh,所以vim ~/.zshrc加上export PATH=/opt/MonkeyDev/bin:$PATH

2. 导出头文件

把ipa用归档实用工具打开,显示包内容,找到同名macho文件,进入文件目录,然后class-dump -H QQMusic -o new(新的目录文件中)

四 拆分和合并macho二进制文件

1. 拆分

当用多个架构打包后,会生成一个fat macho文件,用以下命令拆分:

lipo QQMusic -thin arm64 -output macho_arm64lipo QQMusic -thin armv7 -output macho_armv7复制代码

把QQMusic二进制的arm64架构拆分并输出为新的名字为macho_arm64的文件

2. 查看二进制文件信息

file QQMusic

3. 合并

lipo -create macho_armv7 macho_arm64 -output newQQMUSIC

转载于:https://juejin.im/post/5af1120451882506a36c7436

你可能感兴趣的文章
将图片转成base64字符串并在JSP页面显示的Java代码
查看>>
js 面试题
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
腾讯云下安装 nodejs + 实现 Nginx 反向代理
查看>>
Javascript 中的 Array 操作
查看>>
java中包容易出现的错误及权限问题
查看>>
AngularJS之初级Route【一】(六)
查看>>
服务器硬件问题整理的一点总结
查看>>
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>