[ТОС]
Эта статья вызвана моим сильным интересом к реверс-инжинирингу. Я прочитал «Реверс-инжиниринг приложений iOS» и реализовал интересную функцию, которой хочу поделиться с вами, и это также простое резюме моего собственного обучения. Кстати, iOS Reverse Forum iOSRe — хорошее сообщество по обратной коммуникации iOS.
Весь код и инструменты для этого примера размещены на GitHub. Проверьте https://github.com/jackrex/FakeWeChatLoc.
Вся эта статья предназначена исключительно для личного развлечения и обучения. Соответствующая технология предназначена только для обучения и общения. Пожалуйста, не используйте ее в незаконных целях или в каких-либо других коммерческих целях! ! !
Джейлбрейк системы iOS, если говорить прямо, аналогичен Android Root. Он эквивалентен увеличению разрешений мобильного телефона, позволяя вам контролировать то, чем вы раньше не могли управлять.
Поскольку Objective-C является объектно-ориентированным языком высокого уровня, формат файла Mach-O, используемый iOS, содержит много метаданных, что позволяет нам использовать дамп классов для восстановления файлов заголовков. Это хорошее начало для iOS. обратный инжиниринг.
MobileSubstrate — это платформа, которая позволяет разработке iOS упростить перехват. MobileSubstrate состоит из следующих трех частей:
Мобильная подложка
Этот тип операционной системы, созданной на основе Unix, обычно имеет одинаковую иерархию каталогов. Вы также можете сравнить Android и MacOS и обнаружите, что многие имена каталогов одинаковы. Давайте выберем некоторые из них и кратко объясним их:
`/bin binnary` ,系统常用的基本二进制文件 例如 cd, ls, ps 等
`/usr` 包含大多用户工具库
`/var variable` 存放经常更改的东西,例如 logs,用户数据,/var/mobile/Applications 是纺织AppStore 下载的 App
`/Applications` 存放所有系统App,以及从Cydia下载的App路径
`/Library` 存放了系统App的数据,其中有一个/Library/MobileSubstrate 目录,MobileSubstrate 是一个hook 功能开发平台,其中内容如下图所示,我们所开发的插件都被放置到这个里面
`/Library/MobileSubstrate` 里面文件类型主要有 dylib,plist
dylib 是动态加载库,就是tweak
plist 配合dylib 使用的filter 文件,指定注入目标,及hook的目标
`/System` 存放iOS 各种系统framework
`/User` 指向 /var/mobile 即是我们一般用户的主目录
Структура Deb на самом деле представляет собой сжатый файл управления библиотечными приложениями в data.tar.gz, помещенный в control.tar.gz.
Часто используемые инструменты для динамической отладки и статического анализа при реверс-инжиниринге:
class-dump — это инструмент, используемый для дампа всех заголовочных файлов взломанного приложения.
IDA — лучший инструмент декомпиляции. Фактически, простой обратный инжиниринг можно выполнить только с помощью IDA.
Hopper Disassembler можно использовать под OS X с низкой лицензионной платой.
Мощный инструмент динамической отладки работает с IDA, заставляя все двигаться и оставаться на месте.
Инструмент отладки, который облегчает отладку и позиционирование пользовательского интерфейса. Мы можем быстро определить, какой интерфейс приложения соответствует определенному классу.
Удобная программа-помощник по управлению файлами
OpenSSH позволяет вашему компьютеру удаленно входить в систему вашего телефона.
Очень мощный инструмент, который позволяет разработчикам взаимодействовать с приложениями из командной строки, а также просматривать и изменять приложения во время выполнения.
Программное обеспечение, которое удобно управляет файловой системой на мобильных телефонах, например iFunbox и Re-менеджер Android, который позволяет легко изменять файлы и устанавливать двоичные файлы Deb.
APPsync — наиболее часто устанавливаемый патч после джейлбрейка iPhone, iPad и iPod touch. После установки вы можете обойти проверку подписи системы, а также установить и запустить взломанное программное обеспечение ipa по своему желанию.
Исходя из вышеизложенного, поскольку мы хотим имитировать позиционирование в WeChat, мы используем WeChat в качестве объекта анализа. Используйте class-dump для экспорта заголовочного файла WeChat. Хотя мы видим метод прямого экспорта class-dump -H xxx -o output/ на официальном сайте class-dump, невозможно напрямую распаковать wechat в ipa и. Дамп его Мы будем Обнаружено, что в выходной папке был только файл CDStructures.h, и он был пуст.
Причина этого в том, что после загрузки в AppStore AppStore автоматически шифрует все ipa, поэтому перед сбросом нам необходимо очистить двоичный файл WeChat.
Надо сначала попробовать более удобный Clutch
Если Clutch не работает, попробуйте выполнить следующие действия. Нам нужен такой инструмент, как dumpdecrypted.dylib, чтобы сбросить оболочку нашего приложения. Сначала мы подключаемся к нашему телефону iOS, завершаем все программы, открываем WeChat и выполняем.
ps - e //列出当前运行的进程
TODO Вы можете видеть, что процесс, начинающийся с /var/mobile/Containers/, является процессом WeChat. Мы знаем, что путь к песочнице для всех приложений — /var/mobile/Containers/Bundle/Application/03B61840-2349-4559-B28E. - 0E2C6541F879/ , но мы не знаем, что это за приложение 03B61840-2349-4559-B28E-0E2C6541F879 . Было бы очень сложно, если бы мы зашли в каталог и нашли их по одному.
В этот раз вам пригодится cycript, выполните
cycript -p WeChat
cy# [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
#"file:///var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents/"
Таким образом, мы получаем каталог документов WeChat. Далее с помощью scp или ifunbox скопируйте dumpdecrypted.dylib в каталог документов WeChat.
Начни ломать оболочку
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /path/to/executable
WeChat.decrypted будет создан в текущем каталоге. Это очищенный WeChat. Перед сбросом мы можем использовать инструмент otool для просмотра информации о файле Match-o.
otool -H WeChat.расшифрованный
Используйте otool -l WeChat.decrypted, чтобы найти криптид, и используйте Lipo, чтобы разделить расшифрованную структуру.
осуществлять
./class-dump -H WeChat.decrypted --arch armv7 -o output/
Создайте папку вывода в текущем каталоге, содержащую все файлы заголовков, экспортированные WeChat, включая сторонние SDK и т. д. Мы поместили все эти файлы заголовков в пустой проект Xcode для удобства просмотра.
Основываясь на интуиции, мы обнаружили, что Appdelegate — это MircoMessengerAppDelegate WeChat. Мы можем примерно увидеть структуру проекта WeChat и т. д. Фактически, реверс-инжиниринг — это тоже способ обучения.
Затем давайте подумаем о функции, которую мы хотим реализовать. Мы хотим изменить наше местоположение, чтобы изменить людей поблизости. Мы можем примерно предположить, что этот класс должен быть отправлен в Nearby Location или что-то подобное, и мы можем найти соответствующий файл заголовка.
После поиска «Рядом» мы обнаружили, что их очень много. Какой из них?
Фактически, в дополнение к методу исключения и размышлениям по одному, мы можем использовать мощный инструмент Reveal, который поможет нам найти
Можно сказать, что class-dump помогает нам перечислить весь заголовочный файл, давая общее представление об общей структуре проекта, но соответствующий план реализации в .m для нас по-прежнему остается черным ящиком. В настоящее время нам необходимо использовать мощные инструменты IDA для анализа.
Откройте IDA и выберите новый
Вынимаем бинарный файл WeChat из Wechat.app и перетаскиваем его в IDA выше. Поскольку я использую процессор itouch 5 и архитектура Armv7, я использую первый, если он используется неправильно, смещение, полученное по точке останова. будет неправильным, поэтому не сможет нормально выполнить отладку.
После завершения обработки все будет так, как показано на рисунке ниже.
Среди них мы легко можем увидеть реализацию конкретных методов в MicroMessengerAppDelegate. Нажмите клавишу пробела, чтобы перейти в режим просмотра.
Здесь мы можем увидеть реализацию в .m
Динамическая отладка — это когда у нас нет исходного кода, мы используем lldb для установки точек останова в месте кода для отладки. Основная цель — вычислить адрес выполнения соответствующего кода и способы отладки, чтобы получить нужное значение. . Как уже говорилось выше, мы используем результаты декомпиляции IDA
iOS открывает сервер отладки и слушает порт 1234 debugserver *:1234 -a "WeChat"
Запустите lldb на Mac и поддерживайте подключение к серверу iOS. Запустите процесс lldb Connect Connect://iOSIP:1234.
смещение равно 0xd000
Получить адрес точки останова br s -a 0xd000+0x649D8 // Нижняя точка останова
Начните отладку ni po и других команд отладки.
Запустите приложение напрямую: debugserver -x backboard *:1234 /path/to/app/executable
libsubstrate.dylib
На самом деле Tweak означает «тонкая настройка». На самом деле это сторонняя библиотека динамической компоновки dylib. Tweak написан на основе MobileSubstrate и может изменять приложение перехватчика во время выполнения.
Theos — это набор инструментов для разработки джейлбрейка. Этот метод также представлен в «Книге по обратному инжинирингу приложений iOS», но лично я предпочитаю использовать iOSOpenDev для создания проектов (ps: после ознакомления с командной строкой git я решил использовать sourceTree Подробнее интуитивно понятный), поэтому кратко упомяну об этом здесь. Такое ощущение, что iOSOpenDev превращает шаблон сетевого адаптера командной строки в визуальный. На самом деле это почти не так уж и сложно.
Установка очень проста. Скачайте установщик и установите его.
После завершения установки создайте новый проект и iOSOpenDev появится в шаблоне iOS.
Здесь мы выбираем Logos Tweak и создание завершается следующим образом.
Есть файл fakeloc.xm, в который мы хотим написать код. Откройте файл fakeloc.xm, и мы увидим, что код внутри него дополнен логотипами. Это новый язык, поэтому вам не о чем беспокоиться. Его основной синтаксис аналогичен Objc. Существует несколько конкретных синтаксисов, которые требуют специального. внимание:
Основной синтаксис логотипов: %hook указывает класс, который необходимо перехватить. Он должен заканчиваться на %end. %log записывает информацию о функции в системный журнал для печати информации. %orig выполняет перехваченную функцию и может быть выполнен только внутри специального метода %hook. .
fakeloc.xm соответствует fakeloc.mm
Мы выше
Как вы можете видеть в настройках сборки, внизу есть столбец под названием User-Define. Вот наша настроенная часть. В поле iOSOpenDevDevice напишите IP-адрес нашего устройства iOS (например, 192.168.1.103). Предполагается, что на устройстве iOS установлен OpenSSH.
ошибка аутентификации ssh iosod sshkey -h 192.168.1.109
Сначала я думал, что создание взломанного приложения должно быть написано с использованием синтаксиса Logos, и это меня до смерти напугало. На самом деле разработка приложения для джейлбрейка iOS практически ничем не отличается от разработки обычного приложения.
Во-первых, мы по-прежнему создаем проект. Как и при создании обычного проекта, вы также можете использовать CocoaPods для управления сторонними библиотеками.
Сначала создайте новый проект как обычно, настройте его следующим образом, а затем измените настройки сборки.
Добавьте сценарий запуска и удалите контроль над ресурсами пакета копирования.
Общая структура проекта
Сборка для исполнителя профилирования
Как после создания приложения и настройки мы можем вызвать Tweak в нашем приложении? Ответ: использовать dlopen
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY); //TWEAK_PATH 是dylib 的地址
if (handle) {
NSLog(@"handle");
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
Затем динамически получите соответствующий пользовательский класс
Класс TweakBridge = NSClassFromString(@"TweakBridge");
Сначала я был озадачен этой проблемой, и в конце концов принял наиболее стабильный и простой метод ее решения, который заключается в чтении и записи данных в один и тот же файл. Этот файл можно использовать в качестве носителя для передачи данных. Но вначале я поместил файл в /var/mobile/xxx.plist, но твик не смог прочитать значение. Причина в том, что твик и наше приложение имеют разные разрешения, поэтому нам нужно найти место, где он может находиться. написано публично. Это место **/var/mobile/Library/Preferences/ ** Таким образом, наше информационное взаимодействие с приложением и настройками использует один метод записи, а другой метод чтения для достижения цели передачи. прямой метод, вы можете его предложить. Давайте обсудим вместе.
Итак, окончательный код:
- (void)setLocWithLat:(double)lat andLng:(double)lng {
NSLog(@"set lat & lng is %f &&&& %f", lat, lng);
Class TweakBridge = NSClassFromString(@"TweakBridge");
void *handle = dlopen(TWEAK_PATH, RTLD_LAZY);
if (handle) {
NSLog(@"handle");
TweakBridge = NSClassFromString(@"TweakBridge");
NSDictionary *dict = @{@"lat":[NSNumber numberWithDouble:lat], @"long":[NSNumber numberWithDouble:lng]};
BOOL isSuccess = [dict writeToFile:LOCATION_PATH atomically:YES];
NSLog(@"isSuccess, %d", isSuccess);
CLLocation *location = [[TweakBridge shareInstance] getCoreLocation];
if (0 != dlclose(handle)) {
printf("dlclose failed! %sn", dlerror());
}else {
}
} else {
NSLog(@"nohandle");
printf("dlopen failed! %sn", dlerror());
}
}
Итак, как нам объединить наш твик с нашим приложением, чтобы пользователи могли использовать его сразу после установки? Учитывая упомянутый выше формат deb, метод упаковки, структура и zip-архив фактически одинаковы и могут быть установлены системой iOS. Выше мы уже объяснили формат и структуру пакета, а теперь поговорим о том, как сгенерировать пакет Deb.
Вынимаем сгенерированные каталоги dylib и app соответственно.
Поместите их все в отдельный каталог пакета. Окончательная структура каталогов показана ниже.
Мы упорядочиваем все файлы в соответствии со структурой каталогов, организованной Deb, в соответствии с иерархией, показанной ниже, а затем используем метод dpkg-deb для упаковки. Обратите внимание, что при упаковке лучше не использовать файлы .DS_Store. следующий скрипт, чтобы удалить его одновременно.
#!/bin/bash
find ./Package -name ".DS_Store" -depth -exec rm {} ;
dpkg-deb -Zgzip -b Package fakeLoc.deb
Сгенерированный установочный пакет выглядит следующим образом, а затем мы копируем его на устройство
Мы используем iFunbox, чтобы перетащить сгенерированный файл fakeLoc.deb в корневой каталог, затем открываем iFile на телефоне и нажимаем fakeLoc.deb, чтобы установить программу. После установки мы переустанавливаем AppSync и перезагружаем телефон, а затем можем открыть наше приложение. , а также обнаружил, что наше приложение нельзя удалить длительным нажатием, как и системные приложения, Cydia и т. д. Это должно быть потому, что мы установили его в /Applications. Чтобы удалить его, мы можем использовать командную строку для его удаления или. используйте Сидию.
После завершения установки просто перезагрузите устройство.
Откройте приложение, введите точность и широту, а затем выполните его. Наконец, откройте WeChat «Люди поблизости», чтобы увидеть, изменились ли люди поблизости. Если мы сделаем это лучше, на карте будет выбрана точная широта. Функция: На этом объяснение заканчивается. Результаты наших простых тестов таковы:
Мы можем выбрать разные места в селекторе адресов карты для тестирования.
Вы можете видеть, что большинство людей из Пекина.
Успешно смоделировать людей поблизости в WeChat.
Это не похоже на публикацию в AppStore. Сначала вам нужен источник хостинга. Если вы не хотите создавать его самостоятельно, вы можете использовать thebigboss.org/hosting-repository-cydia/submit-your-app.
Заполните соответствующую информацию, она не будет описываться снова.
Эта статья представляет собой введение в тему. Я надеюсь, что вы получите предварительное представление о джейлбрейке iOS, сможете создавать любые свои собственные приложения и разрабатывать более интересные настройки, например, плагин для захвата красных конвертов в WeChat. Кажется, реализовать его несложно. Этот пример проекта полностью размещен на Github, где fakeloc — это dylib, то есть твик TestFakeTweak — это проект приложения, HackAppTool. В нашей статье выше описаны сторонние инструменты, которые необходимо использовать.
Адрес проекта: https://github.com/jackrex/FakeWeChatLoc.
重新安装下AppSync 并重启SpringBoard
由于iOS7之后引入一些新的类库等,在iOS6设备上的兼容性一般,所以在工程的framework 中把 require 改为 option
root密码文件存放地方: / etc / master . passwd
用iFile的文本编辑功能打开master . passwd ,更改之前记得权限
你会找到类似这样的一行字符—— root : UlD3amElwHEpc : 0 : 0 :: 0 : 0 : System
UlD3amElwHEpc就是加密过的密码
把它更替为ab3z4hnHA5WdU ,这是对应的密码就是abc123 。
保存,重启。
有了密码abc123你就可以进一步修改成其它的密码了