iOS彙編基礎(四)指標和macho檔案

meryin發表於2018-05-08

一 基本運算

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

相關文章