Сейчас на форуме: -Sanchez- (+8 невидимых) |
![]() |
eXeL@B —› Основной форум —› Взлом Android приложений |
<< 1 ... 27 . 28 . 29 . 30 . 31 . 32 . 33 . 34 . 35 . 36 . 37 ... 38 . 39 . >> |
Посл.ответ | Сообщение |
|
Создано: 12 сентября 2011 12:37 · Поправил: SaNX · Личное сообщение · #1 В теме обсуждаются вопросы взлома под андроид и соответствующие тулзы. ТУТОРИАЛЫ: ТУЛЗЫ: JEB ApkAnalyser GikDbg В аттаче fernflower, очень годный жава декомпилер. ![]() ----- SaNX ![]() |
|
Создано: 21 июня 2016 16:25 · Поправил: Apokrif · Личное сообщение · #2 |
|
Создано: 21 июня 2016 17:12 · Поправил: mixer632 · Личное сообщение · #3 |
|
Создано: 21 июня 2016 18:02 · Личное сообщение · #4 |
|
Создано: 21 июня 2016 19:56 · Личное сообщение · #5 Apokrif, на sub_AB30 я тоже обратил внимание, в ней очень много кода, понятно что главный функционал в ней. Обработал в hex-rays в плюсовый код, можете посмотреть куда в ней копать дальше. Я поизучал функцию registernatives(), по сути нужно найти ее вызов, а из ее параметров взять указатель на структуру динамических фунок, но вот проблема, ида не умеет распознавать эти функции в коде, как бы ее найти. Code:
Как я понимаю надо искать что-то вида: Code:
![]() ![]() |
|
Создано: 22 июня 2016 23:06 · Личное сообщение · #6 А получится ли после registernatives() если в смали коде вызвать функцию Code:
Для динамически экспортируемого метода и для jnionload(), потом определить разность между их адресами, ведь в памяти они будут по другим адресам, но расстояние между ними тоже самое, правильно я понимаю ? Чтобы потом вычислив разность в памяти их адресов найти в самом *.so файле откуда этот метод начинается. ![]() |
|
Создано: 23 июня 2016 11:35 · Личное сообщение · #7 |
|
Создано: 23 июня 2016 15:54 · Личное сообщение · #8 |
|
Создано: 24 июня 2016 15:19 · Личное сообщение · #9 r_e, я разобрался с отладкой нативной библиотеки через android_server от иды, можешь подсказать как мне поймать прогу на вызове в jni_onload(), эта функция получает управление один раз во время загрузки либы и конечно я подключаюсь после уже с отладчиком. Какие тут варианты можно попробовать: 1. messagebox перед system.load() в смали коде прописать, чтобы идой подключиться до загрузки библиотеки в память 2. Бесконечный цикл в jni_onload() вписать в начале. Мне интересно сработает ли 1 метод, то есть ида сможет бряк поставить на эту функцию или нет, ведь в этот момент либа еще не загружена в память. Ну и есть ли еще какие способы ее там поймать, которые лучше предложенных ? ![]() |
|
Создано: 24 июня 2016 17:07 · Личное сообщение · #10 |
|
Создано: 24 июня 2016 18:33 · Поправил: VodoleY · Личное сообщение · #11 наткнулся на прикольную статью на хабре.. много полезных мелочей и ньюансов.. не смотря на то что статье 2 года, думаю начинающим будет полезно. там про далвик и про нейтив код.. вобщем вот https://habrahabr.ru/post/232531/ и еще тутор на инглише http://shubhamaher.com/native-android-reverse-engineering/ http://forum.xda-developers.com/showthread.php?t=2050393 ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 24 июня 2016 21:32 · Личное сообщение · #12 |
|
Создано: 24 июня 2016 21:38 · Личное сообщение · #13 |
|
Создано: 24 июня 2016 22:37 · Личное сообщение · #14 SaNX--> дебаг .so<-- кстати.. в шапке твой пост) не хош подправить содержимое? а запускать андроид сервер разве не надо? раз ты мануал писал) Добавлено спустя 5 минут и может в шапочку еще на gikdbg.art ссылочку добавить.. для колекци.. типа.. ОлькаМод для дебаг андроида.. говорять глючная.. но комуто помогает ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... ![]() |
|
Создано: 25 июня 2016 00:03 · Поправил: mixer632 · Личное сообщение · #15 VodoleY пишет: говорять глючная Пробовал, логает жутко. С идой нормально дебажится. Гдбсервер тоже пробовал, на любителя какой-то. На реал устройстве на команду continue падал с ошибкой доступа, на виртуал устройстве continue работала, а команда info function упорно вместо адресов в памяти выдавала их смещения в файле на диске, то есть бряк не поставить было. Добавлено спустя 1 минуту VodoleY, не знаешь плагинов или утилит по распознаванию JNI фунок, чтобы ида их опознавала охота. Хочу облегчить поиск в арм коде либы этой функи: Code:
![]() |
|
Создано: 25 июня 2016 09:31 · Личное сообщение · #16 |
|
Создано: 25 июня 2016 20:13 · Поправил: Apokrif · Личное сообщение · #17 SaNX пишет: Дабы брякнуться на любой функе, достаточно в этой функе джамп на себя прописать Соратники, А в IDA + andoid_server работают эти - Suspend on library load/unload If selected, the debugger will suspend if a new library is loaded or if a previously loaded library is unloaded. И еще Event condition When one or more debug events (see above) are checked then this option is used to specify a condition. In the following example, the debugger will suspend the prcoess whenever a module with the name test.dll is loaded: GetEventId() == LIBRARY_LOAD && strstr(GetEventModuleName(), "test.dll") != -1 Если да, то на Jni_onload() брякнуться д.б. без проблем? ![]() ![]() |
|
Создано: 25 июня 2016 22:00 · Личное сообщение · #18 VodoleY По ведропротекторам это SaNXа кастовать надо в топик. Я плотно с ними не работал. RegisterNatives экспортируется явно из ядра? Или он метод класса? Если экспортируется явно, то метод поиска стандартный: база + смещение. Если метод класса, то пишешь свою .so + apk, которая явно вызывает его и определяешь для твоего ядра смешение метода. Можешь в apk показывает его на экране. Ну а дальше дело техники. ----- старый пень ![]() |
|
Создано: 25 июня 2016 23:24 · Поправил: mixer632 · Личное сообщение · #19 r_e, нашел все смещения jni через этот проект с гитхаба https://gist.github.com/libmaru/5814814 Та функа похоже не явно вызывается в либе, там нашел всякие jni вызовы типа GetStaticMethodID, CallStaticObjectMethod. Разрабы в смали коде помешаны на рефлексии, видать либу также писали. По экспорту там только jni_onload(), она все остальное при старте формирует. ![]() |
|
Создано: 26 июня 2016 01:18 · Поправил: Apokrif · Личное сообщение · #20 Apokrif пишет: Соратники, А в IDA + andoid_server работают эти фишки? - Suspend on library load/unload Однако проверил - всё работает! ![]() Вот всё по шагам: Взял простейший код отсюда http://www.hexblog.com/?p=809 Ставим и проверяем: adb shell android_server & am start -D -e debug true -n ida.debug.hellojni/.MainActivity Появилось окно "Waiting for debugger" ida -> attach to ida.debug.hellojni Debugger options X Suspend on library load/unload Event condition GetEventId() == LIBRARY_LOAD && strstr(GetEventModuleName(), "libhello-jni.so") != -1 * Если не ставить, ida будет брякаться на загрузке/выгрузке всех либ! ![]() ida -> run/continue Теперь надо "подтолкнуть" наш "Waiting for debugger" процесс: # Находим наш процесс adb jdwp 755 APK д.б с application android:debuggable="true" Без него будет пустой лист. Возможно, что если сам девайс разрешает debug-жить любые APK, то в AndroidManifest.xml это не нужно. Как разрешить для девайса уже обсуждали. # Пробрасаваем порт adb forward tcp:8000 jdwp:755 # Прицепляемся jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000 И брякнулись в ida на loaded /data/app/ida.debug.hellojni-1/lib/arm/libhello-jni.so Т.е. можно ставить бряку jni_onload() - она еще не выполнялась! * Когда apk грузит либы, ida предлагает указать, где она лежит (уже разобранная?) на писюке. Вот это еще не проверил, пора спать уже... ![]() |
|
Создано: 26 июня 2016 12:23 · Личное сообщение · #21 Apokrif пишет: Когда apk грузит либы, ida предлагает указать, где она лежит (уже разобранная?) на писюке. А если ей подсунуть псевдокод hex-rays самой иды ? Во время отладки ида не особо выдает псевдокод чтобы отлаживать. Apokrif пишет: Как разрешить для девайса уже обсуждали. Перепрошивать в рекавери ? ![]() |
|
Создано: 26 июня 2016 13:28 · Личное сообщение · #22 |
|
Создано: 26 июня 2016 19:10 · Личное сообщение · #23 reversecode пишет: умеетют хексрейсы бегать под дебагером выдавая псевдокод Проблема в том, что локальный файл *.so весь чистый от красных кусков кода, а когда я аттачусь к этой либе, то в ида получаю много красных кусков кода, из-за чего хексрейс не может нормально делать псевдокод из него. Почему так происходит, как это пофиксить ? Специально либу, которая на компе лежит прочистил, чтобы вся полоска синяя была, а во время аттача он свое грузит с красными кусками. ![]() |
|
Создано: 26 июня 2016 19:49 · Поправил: Apokrif · Личное сообщение · #24 mixer632 пишет: Как разрешить для девайса уже обсуждали. Перепрошивать в рекавери? Можно и так. Или попробовать выставить ro.debuggable=1 в build.prop через setpropex Ссылка на setpropex есть Apokrif пишет: Когда apk грузит либы, ida предлагает указать, где она лежит (уже разобранная?) на писюке. Вот это еще не проверил, пора спать уже... Если открыть ida с уже разобранной либой (просто переименовал пару функций!) Потом присоединиться к андроиду (android_server/attach process) Ida спросит, уже открытая либа и либа в attached process: same или нет? Говорю same, но разобранная либа не подхватывается... Даже rebase сделать не предлагает... Наверное, какую-то мелочь упускаю? ![]() |
|
Создано: 26 июня 2016 21:19 · Личное сообщение · #25 |
|
Создано: 26 июня 2016 21:43 · Личное сообщение · #26 |
|
Создано: 26 июня 2016 22:39 · Личное сообщение · #27 reversecode пишет: рейс декомпилит только полноценные функции а не огрызки кода Я это понимаю, у меня либа на компе которая лежит хорошая и не умеет огрызков, огрызки в ней появляются когда аттачусь к ней на устройстве. Как этого избежать почему-то после аттача получаем много кусков не проанализированного кода. ![]() |
|
Создано: 27 июня 2016 01:16 · Личное сообщение · #28 |
|
Создано: 27 июня 2016 01:51 · Поправил: Apokrif · Личное сообщение · #29 mixer632 пишет: Как этого избежать почему-то после аттача получаем много кусков не проанализированного кода. reversecode пишет: возможно потому что в статике либа имеет ельф формат и ида ее авто анализирует, а при аттача это просто какая то память, ида ничего не знает о начале и конце кода Собственно вопрос (который мы задали в разной форме несколько раз): Есть проект с разобранной либой, над которым мы потрудились. Как при attach process подсказать ida, что либа в нашем process и разобранная либа это одно и тоже? Ida ведь честно спрашиват "уже открытая либа и либа в attached process: same или нет"? Но даже если ответить same, ida всё равно открывает либу "по новой", и никаких результатов предыдущего анализа там нет. (Либа 100 пудово одна и таже!) В инте проскакивают посты, что это возможно. Т.е. у нас похоже не соблюдаются какие-то условия (например, "ну очень кривые руки" ![]() Может есть (проверенный!) туториал, где по шагам расписано, что и как нужно делать? Добавлено спустя 2 часа 50 минут Apokrif пишет: Может есть (проверенный!) туториал, где по шагам расписано, что и как нужно делать? Заранее извиняюсь за длинный пост! Если пройти по * Неважно, по полному Dalvik debugger + Remote ARM Linux/Android debugger или только Remote ARM Linux/Android debugger, результат тот же! Запускаем IDA, открываем либу не в папке, а именно из apk. Находим нашу функцию Java_ida_debug_hellojni2_MainActivity_stringFromJNI Меняем имя на XXX_Java_ida_debug_hellojni2_MainActivity_stringFromJNI (Это типа наш анализ и есть!) Ставим на ней breakpoint Уточню, чуть поменял прогу (java part!), сделал 2 кнопки: загрузить либу вызвать нашу функцию На код либы это, ессно, никак не влияет. IDA | Attach process | Remote ARM Linux/Android debugger Видим: Rebasing program to 0xB6F82BA0... Debugger: attached to process /system/bin/app_process32_original (pid=15777) Проходит быстро, 1-2 сек Откуда взялся этот "Rebasing program"? Ведь наша либа еще не загружена... В нашей проге на Andriod-е нажимаем кнопку "загрузить либу" Выскакивает окно про новую либу у процесса - говорим "same" Видим: Rebasing program to 0x9BCC1BA0... 9BCC1000: loaded /data/app/ida.debug.hellojni2-2/lib/arm/libhello-jni.so Debugger: thread 15810 has exited (code 0) IDA что-то довольно долго делает, 3-4 минуты. Похоже IDA пытается как то увязать, загрузку новой либы и наш предварительный анализ? Либа крошечная, на диске 13kB, в памяти 6kB При первом открытии из apk открывается и анализируется меньше чем за секунду! В окне Module появляется наша либа Если на неё кликнуть ida скажет: Module /data/app/ida.debug.hellojni2-2/lib/arm/libhello-jni.so has no names Т.е. этот новый module и та либа, что мы открывали из apk никак не связаны (пока?) В нашей проге на Andriod-е нажимаем кнопку "вызвать нашу функцию" Получаем Break на нашей функции! Видим в окне IDA View-PC, наша функция показана как мы её переименовали XXX_Java_ida_debug_hellojni2_MainActivity_stringFromJNI Еще раз нажимаем на /data/app/ida.debug.hellojni2-2/lib/arm/libhello-jni.so в окне Module Появляется Module: libhello-jni.so И в нем наша функция показана как Java_ida_debug_hellojni2_MainActivity_stringFromJNI (т.е. так, как называется в либе, а не как мы её переименовали при анализе!) В окне функций всего 44, а при анализе было 69! Т.е. наш предварительный анализ почему-то не показывается… От того, что в окне IDA View-PC наша функция показана как нам нужно, как то не легче. В общем всё, традиционный вопрос: кто виноват и что делать? Это так и задумывалось или я что-то упустил? Единственный понятный момент, при отладке ASLR лучше отключать, чтобы не тратить время на этот длительный Rebase... ![]() |
|
Создано: 27 июня 2016 09:08 · Личное сообщение · #30 |
|
Создано: 27 июня 2016 09:26 · Личное сообщение · #31 Apokrif Это может быть баг иды, как раньше было с пропадающими переменными. Начальный ребейз, вероятно, из-за отличия базы самой программы (нативной части ВМ, например) от того куда ее загрузили. Поскольку он к модулю не относится - ребейз быстрый. Второй ребейз более долгий потому что ремапится уже специфичный модуль. Странно что при этом меняется состав экспорта. Это вы по Ctrl+E смотрите или в окне экспорта модуля? VodoleY Я на опережение работаю ))) Андроид в 6.8 был таки достаточно сырой, так что это гадание на кофейной гуще. ----- старый пень ![]() |
<< 1 ... 27 . 28 . 29 . 30 . 31 . 32 . 33 . 34 . 35 . 36 . 37 ... 38 . 39 . >> |
![]() |
eXeL@B —› Основной форум —› Взлом Android приложений |