iOS安全–使用static inline方式編譯函式,防止靜態分析

weixin_33866037發表於2016-07-14

我們知道一般的函式呼叫都會通過call的方式來呼叫,hacker很容易對一個函式做手腳,如果是以inline的方式編譯的,會把該函式的code拷貝到每次呼叫該函式的地方;而static會讓生成的二進位制檔案中沒有清晰的符號表,讓逆向的人很難弄清楚邏輯

static int isValidate(int id) __attribute__ ((always_inline));
static inline int isValidate(int id);

定義:有函式的結構,但不具備函式的性質,類似於巨集替換。程式碼中使用inline定義,能否形成行內函數,還要看編譯器對行內函數體內部的定義的具體處理
1.使用inline
修飾的函式,在編譯的時候,會把程式碼直接嵌入呼叫程式碼中。就相當於用#define 巨集定義來定義一個add 函式那樣!與#define的區別是:
1)#define定義的格式要有要求,而使用inline則就行平常寫函式那樣,只要加上inline即可!
2)使用#define巨集定義的程式碼,編譯器不會對其進行引數有效性檢查,僅僅只是對符號表進行替換。
3#define巨集定義的程式碼,其返回值不能被強制轉換成可轉換的適合的轉換型別。
2.在inline加上static修飾符
只是為了表明該函式只在該檔案中可見!也就是說,在同一個工程中,就算在其他檔案中也出現同名、同引數的函式也不會引起函式重複定義的錯誤
注意點:
1.檢視main.m的彙編檔案:
選中main.m檔案-->Xcode 選單 --> Product --> Perform Action --> Assemble "main.m"
2.不能使用迴圈語句;不能使用開關語句;不能使用遞迴呼叫;定義在第一次呼叫之前

相關文章