Определить, подключен ли Cycript/Substrate или gdb к процессу приложения для iOS?

Я создаю приложение для iOS, которое передает конфиденциальные данные на мой сервер, и я подписываю свои запросы API в качестве дополнительной меры. Я хочу сделать реверс-инжиниринг как можно более сложным, и, используя Cycript для поиска ключей подписи некоторых реальных приложений, я знаю, что нетрудно найти эти ключи, подключившись к процессу. Я абсолютно осознаю, что если кто-то действительно опытный и старается изо всех сил, он в конечном итоге будет использовать, но я стараюсь сделать это как можно сложнее, оставаясь при этом удобным для себя и пользователей.

Я могу проверить состояние джейлбрейка и принять дополнительные меры, или я могу сделать закрепление SSL, но оба они по-прежнему легко обойти, подключившись к процессу и изменив память.

Есть ли способ обнаружить, если что-то (будь то Cycript, GDB или любой другой аналогичный инструмент, который можно использовать для взлома процесса) присоединено к процессу, но не отклонено из App Store?

РЕДАКТИРОВАТЬ: Это не дубликат обнаружения, если приложение iOS запускается в отладчике. Этот вопрос больше связан с выводом, и он проверяет выходной поток, чтобы определить, есть ли выходной поток, присоединенный к регистратору, в то время как мой вопрос не связан с этим (и эта проверка не охватывает мое состояние).

3 ответа

Обнаружение GDB выполнимо с помощью связанного вопроса переполнения стека - он использует kstat, чтобы определить, выполняется ли отладка процесса. Это обнаружит, если отладчик в настоящее время подключен к процессу.

Также есть фрагмент кода - Использование макроса SEC_IS_BEING_DEBUGGED_RETURN_NIL в приложении iOS - который позволяет добавить макрос, который выполняет проверку присоединенного отладчика в различных местах вашего кода (это C/Objective-C).

Что касается обнаружения Cycript, то когда он запускается против процесса, он внедряет dylib в процесс, чтобы иметь дело с коммуникациями между командной строкой cycript и процессом - библиотека имеет часть имени, похожую на cynject, Это имя не похоже ни на какие библиотеки, присутствующие в типичном приложении для iOS. Это должно быть обнаружено с помощью небольшого цикла вроде (C):

BOOL hasCynject() {
    int max = _dyld_image_count();
    for (int i = 0; i < max; i++) {
        const char *name = _dyld_get_image_name(i);
        if (name != NULL) {
            if (strstr(name, "cynject") == 0) return YES;
        }
    }
}

Опять же, было бы целесообразно дать ему лучшее имя, чем это, а также запутать строку, которую вы тестируете.

Это только подходы, которые могут быть приняты - к сожалению, они только защитят вас во время выполнения, если кто-то выберет для этого IDA или другой дизассемблер, тогда вы не будете защищены.

Причина того, что проверка отладчика реализована в виде макроса, заключается в том, что вы размещаете код в разных местах кода, и в результате кто-то, пытающийся его исправить, должен будет пропатчить приложение в разных местах.

Основываясь на ответе @petesh, я обнаружил, что приведенный ниже код достиг того, что я хотел, на взломанном телефоне с Cycript. Существование строк printf - золото для реверс-инженера, поэтому этот код подходит только для приложений demo / crack-me.

#include <stdio.h>
#include <string.h>
#include <mach-o/dyld.h>

int main ()
{
        int max = _dyld_image_count();
        for (int i = 0; i < max; i++) {
            const char *name = _dyld_get_image_name(i);
            const char needle[11] = "libcycript";
            char *ret;

            if ((ret = strstr(name, needle)) != NULL){
                printf("%s\nThe substring is: %s\n", name, ret);
            }
        }

    return 0;
}

Насколько я знаю, внедрение в Cycript стало возможным благодаря отладочным символам. Так что, если вы удалите символы отладки для выпуска App Store (настройки сборки по умолчанию для конфигурации выпуска), это поможет.

Еще одно действие, которое вы можете предпринять, которое не повлияет на удобство использования приложения, - это использование обфускатора. Однако это сделает любые отчеты о сбоях бесполезными, так как вы не сможете понять символы, даже если отчет о сбое был символизирован.

Другие вопросы по тегам