iOS安全–使用static inline方式編譯函式,防止靜態分析
我們知道一般的函式呼叫都會通過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.不能使用迴圈語句;不能使用開關語句;不能使用遞迴呼叫;定義在第一次呼叫之前
相關文章
- 函式的靜態變數 static函式變數
- 編譯靜態庫的方式使用spdlog和fmt編譯
- static靜態方法的使用
- apache動態編譯/靜態編譯區別Apache編譯
- C++建構函式和解構函式呼叫虛擬函式時使用靜態聯編C++函式
- PHP類的靜態(static)方法和靜態(static)變數PHP變數
- 避免因在類中使用靜態函式而大量使用靜態變數 (轉)函式變數
- java static 與 static靜態程式碼塊Java
- HTML也可以靜態編譯?HTML編譯
- C++靜態函式C++函式
- java中static使用之靜態方法注意點Java
- Java靜態static工具類執行緒安全問題研究Java執行緒
- Android NDK祕籍--編譯靜態庫、呼叫靜態庫Android編譯
- static靜態變數的理解變數
- 靜態資料成員和靜態成員函式函式
- PHP 中 static 靜態屬性和靜態方法的呼叫PHP
- iOS 常用除錯方法:靜態分析iOS除錯
- go編譯靜態檔案到exeGo編譯
- Linux下快速靜態編譯Qt以及Qt動態/靜態版本共存Linux編譯QT
- Jni函式的靜態繫結函式
- 模板函式編譯原理函式編譯原理
- c#靜態類static class示例C#
- (譯)函式式 JS #3: 狀態函式JS
- Sanic static() 方法/函式函式
- 建構函式、this、static函式
- 靜態編譯Qt5.4.1和Qt WebKit編譯QTWebKit
- VS2010靜態編譯編譯
- 編譯libpcap模擬器靜態庫編譯PCA
- iOS效能調優之Analyze靜態分析iOS
- 關於inline函式inline函式
- C#靜態建構函式及靜態變數學習C#函式變數
- JIT-動態編譯與AOT-靜態編譯:java/ java/ JavaScript/Dart亂談編譯JavaScriptDart
- 有關Linux的可執行程式——動態編譯、靜態編譯、readelfLinux行程編譯
- inline、const、mutable、this、staticinline
- 類內的靜態成員函式函式
- 【知識點】inline函式、回撥函式、普通函式inline函式
- Java | 靜態巢狀類(Static Nested Class)Java巢狀
- 使用DbgHelp獲取函式呼叫堆疊之inline assembly(內聯彙編)法函式inline