关于安全:iOS加固可以但是别用虚拟机

38次阅读

共计 2462 个字符,预计需要花费 7 分钟才能阅读完成。

一个对于 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:如果有哪位大佬晓得怎么用虚拟机加固,肯定要分享一下呀!(不是)

正文完
 0