2015-12-07 1 views
5

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

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

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

EDIT: Это не дубликат Detecting if iOS app is run in debugger. Этот вопрос больше связан с выводом и проверяет выходной поток, чтобы определить, есть ли выходной поток, подключенный к регистратору, в то время как мой вопрос не связан с этим (и эта проверка не распространяется на мое состояние).

+0

Возможный дубликат [Обнаружение если IOS приложение запускается в отладчике] (http://stackoverflow.com/questions/4744826/detecting-if-ios-app-is-run-in-debugger) – Petesh

+1

@ Петеш нет, см. Мое редактирование. –

+0

Кажется, что * точно * то, что вы просите - он использует sysctl, чтобы проверить, отслеживается ли процесс, что происходит, когда вы запускаете процесс под отладчиком или используете его во время работы. – Petesh

ответ

5

определение gdb выполнимо via the linked stackoverflow question - он использует kstat для определения того, отлаживается ли процесс. Это определит, подключен ли отладчик к процессу.

Существует также кусок кода - Using the Macro SEC_IS_BEING_DEBUGGED_RETURN_NIL in iOS app - который позволяет вам бросить макрос, который выполняет прикрепленную отладчиком проверку в разных местах вашего кода (это 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 или какой-нибудь другой дизассемблер, тогда вы не будете защищены.

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

+0

Как я могу реализовать в быстром проекте? –

+0

Как вы можете реализовать то, что именно? Здесь есть по существу 3 ответа - две ссылки на другие ответы и этот код, которые можно быстро перевести с небольшими усилиями (вам понадобится заголовок для мостов для функций '_dyld_image_count' и' _dyld_get_image_name') – Petesh

2

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

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

+0

Удаление двоичный - то есть не отладочная версия - замедляет работу инженера-реверса, который использует такие инструменты, как Hooper, ida pro, radare2 и т. д. На мой взгляд, это не очень помогает против Cycript или Frida. Как только вы можете ввести библиотеку Cycript или Frida, вы выполняете модификации во время выполнения и можете с минимальным усилием сбросить класс или функции. – rustyMagnet

2

Основываясь на ответе @ 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; 
} 
+0

действительно умный! Вы на самом деле пытались это сделать? и считаете ли вы, что наличие 'libcycript' приводит к отклоненному приложению? –

+0

Привет @ CanPoyrazoğlu Я установил свое демо-приложение для сбоя, когда он обнаруживает эту библиотеку. Cycript вводится в процесс приложения на jailbroken устройстве iOS. Следующий шаг - убедиться, что авария на самом деле скремблирует данные, хранящиеся в куче памяти, перед выходом. – rustyMagnet

+0

любой способ реализовать его быстро? –