iOS加固可以,但是別用虛擬機器......

語言: CN / TW / HK

一個關於iOS加固的小故事

傳說,有這麼一家公司,他們使用了一種獨特的iOS加固方法:在應用程式中新增一個虛擬機器,以便在應用程式執行時保護其程式碼。咱也不知道這具體的實現方式,但是,不得不誇一句:人才!

當然,人家蘋果公司是不認的,蘋果公司認為他們違反了應用程式開發規則,所以這家公司的應用程式最終被禁止在App Store上釋出。

多年前的故事了,我們今天只講常規的幾種加固方法。

iOS加固的意義

最近有很多人諮詢iOS加固到底有什麼用?app是否需要加固? 其實,真的因人而異,iOS主要作用是提高應用程式的安全性,防止黑客攻擊和逆向工程。而“黑客攻擊和逆向工程”會: 1. 獲取未經授權的訪問:黑客攻擊的一個常見目的是獲取未經授權的訪問,例如入侵系統、竊取密碼或身份驗證憑據等。 2. 竊取機密資訊:黑客攻擊也可能是為了竊取敏感資訊,例如信用卡號碼、醫療記錄或政府機密等。 3. 破壞或破解系統:黑客攻擊可能是為了破壞或破解系統,例如通過惡意軟體破壞計算機系統、妨礙網路連線或篡改資料等。 4. 獲得商業優勢:逆向工程的一個常見目的是為了獲得商業優勢。例如,逆向工程可以幫助競爭對手分析您的產品設計和工藝,從而提高他們的產品質量和效能。 5. 理解和修改軟體:逆向工程可能是為了理解和修改軟體,例如幫助診斷和解決軟體缺陷,或者為了增強軟體的效能和功能等。

因此,對於個人來說,如果app沒有太大的風險,基本可以不考慮加固問題。但是對於企業而言,尤其是銀行、金融、車企以及電商、遊戲等行業,應用程式的安全性需要更加重視。

常見的iOS加固技術

下面,我們將介紹幾種常見的iOS加固技術,然後提供相應的程式碼演示。

1. 防除錯

防除錯是一種常見的iOS加固技術,它可以檢測應用程式是否正在被除錯,如果是,則會採取相應的措施,例如崩潰或退出應用程式。

下面是一個使用ptrace()函式實現防除錯的程式碼示例:

```include

include

include

include

include

int anti_debug(void) { void handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW); if (handle) { int (ptrace_ptr)(int, pid_t, caddr_t, int) = dlsym(handle, "ptrace"); if (ptrace_ptr) { if (ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0) == -1) { dlclose(handle); return 1; } } dlclose(handle); } return 0; } ```

解釋一下:這段程式碼首先使用dlopen()函式開啟一個指向應用程式的控制代碼,然後使用dlsym()函式獲取ptrace()函式的地址,最後呼叫ptrace()函式將PT_DENY_ATTACH標誌設定為防止除錯。如果ptrace()函式返回-1,則說明應用程式正在被除錯,這時可以採取相應的措施,例如退出應用程式。

2. 混淆

混淆是指對應用程式的程式碼和資料進行混淆,以使其難以被理解和破解。 下面是一個使用LLVM混淆器進行程式碼混淆的程式碼示例: ```#include

int main(int argc, char *argv[]) { printf("Hello, world!\n"); return 0; } ```

使用LLVM混淆器可以將上面的程式碼混淆成以下程式碼:

```#include

int main(int argc, char *argv[]) { int x = 3, y = 5; if (x < y) { printf("Hello, "); } else { printf("world!\n"); } return 0; } ``` 可以看到,混淆後的程式碼與原始程式碼完全不同,這使得逆向工程變得困難,能達到我們防止逆向的目的。

3. 加密

加密是指對應用程式的程式碼和資料進行加密,以防止其被竊取和破解。下面是一個使用AES加密演算法對字串進行加密的程式碼示例: ```#include

include

include

define KEY "0123456789012345"

define IV "0123456789012345"

int main(int argc, char argv[]) { char plaintext = "Hello, world!"; unsigned char ciphertext[strlen(plaintext)]; memset(ciphertext, 0, sizeof(c 加密過程的程式碼如下所示: AES_KEY aes_key; AES_set_encrypt_key(KEY, 128, &aes_key); AES_cbc_encrypt(plaintext, ciphertext, strlen(plaintext), &aes_key, IV, AES_ENCRYPT);

printf("Plaintext: %s\n", plaintext);
printf("Ciphertext: ");
for (int i = 0; i < strlen(plaintext); i++) {
    printf("%02x", ciphertext[i]);
}
printf("\n");

return 0;

} ``` 解釋一下:這段程式碼首先定義一個金鑰和初始向量,然後使用AES_set_encrypt_key()函式將金鑰設定為128位的AES金鑰。接下來,使用AES_cbc_encrypt()函式將明文加密成密文,並將結果儲存在ciphertext陣列中。最後,輸出明文和密文。

不過,加密後的資料需要在應用程式中進行解密,否則無法正確地使用。所以,在應用程式中需要包含相應的解密程式碼。

總結

上面就是幾種常見的iOS加固技術及相應的程式碼演示。雖然這些技術可以提高應用程式的安全性,但是並不能完全避免應用程式被破解和逆向工程。所以,為了保護應用程式的安全性,開發者最好還是需要採取其他措施,例如加強程式碼審查和安全測試,以及定期更新和修復漏洞。

PS:如果有哪位大佬知道怎麼用虛擬機器加固,一定要分享一下呀!(不是)

加固產品:免費試用