Stories

Detail Return Return

iOS加固可以,但是別用虛擬機...... - Stories Detail

一個關於iOS加固的小故事

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

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

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

iOS加固的意義

最近有很多人諮詢iOS加固到底有什麼用?app是否需要加固?

其實,真的因人而異,iOS主要作用是提高應用程序的安全性,防止黑客攻擊和逆向工程。而“黑客攻擊和逆向工程”會:

1.獲取未經授權的訪問:黑客攻擊的一個常見目的是獲取未經授權的訪問,例如入侵系統、竊取密碼或身份驗證憑據等。

2.竊取機密信息:黑客攻擊也可能是為了竊取敏感信息,例如信用卡號碼、醫療記錄或政府機密等。

3.破壞或破解系統:黑客攻擊可能是為了破壞或破解系統,例如通過惡意軟件破壞計算機系統、妨礙網絡連接或篡改數據等。

4.獲得商業優勢:逆向工程的一個常見目的是為了獲得商業優勢。例如,逆向工程可以幫助競爭對手分析您的產品設計和工藝,從而提高他們的產品質量和性能。

5.理解和修改軟件:逆向工程可能是為了理解和修改軟件,例如幫助診斷和解決軟件缺陷,或者為了增強軟件的性能和功能等。

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

常見的iOS加固技術

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

1. 防調試

防調試是一種常見的iOS加固技術,它可以檢測應用程序是否正在被調試,如果是,則會採取相應的措施,例如崩潰或退出應用程序。
下面是一個使用ptrace()函數實現防調試的代碼示例:

#include <unistd.h>
#include <sys/syscall.h>
#include <dlfcn.h>
#include <string.h>

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混淆器進行代碼混淆的代碼示例:

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

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

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 <string.h>
#include <openssl/aes.h>

#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_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:如果有哪位大佬知道怎麼用虛擬機加固,一定要分享一下呀!(不是)

user avatar wosign Avatar jinshideshizi Avatar api7 Avatar cloudace Avatar
Favorites 4 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.