一 基本運算
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
可以直接安裝class-dump 或者安裝MonkeyDev
安裝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_arm64
lipo QQMusic -thin armv7 -output macho_armv7
複製程式碼
把QQMusic二進位制的arm64架構拆分並輸出為新的名字為macho_arm64的檔案
2. 檢視二進位制檔案資訊
file QQMusic
3. 合併
lipo -create macho_armv7 macho_arm64 -output newQQMUSIC