На каком форуме задавать вопросы касательно: Android, JNI, NativeActivity, отладка JNI lib без исходников, их реверс-инжиниринг, — почти что хакинг?
А может, даже и дизассемблирование ELF ARM/x86 сборок...
===
Проблема моя с точки зрения реверсера, а не простого разраба - сравнительно нубская и несложная. Чай, не Пентагон взламываю.
Есть Приложение Android.
У него есть JNI-библиотека вида lib.so. NativeActivity.
Основной функционал - в ней, но Behavior (десяток классов с полтинником методов в каждом) написан на Java.
Обфускации нет.
И вот моя задача - создать для этой библиотеки свое приложение типа Лаунчер, добавив доп. функционал.
Декомпиляция всего целиком - дело тяжелое и долгое, де-smali-ция - тем более.
Поэтому просто беру библиотеку и начинаю воссоздавать Behaviour, методом тыка определяя реально нужные методы, заделывая заглушками (stub) и т.д. и т.п.
Сначала всё шло хорошо. В LogCat подробный StackTrace каждого исключения. Декомпилировал, брал нужный метод, копипастил - и шел дальше.
Но потом я дошел до тех мест в библиотеке, где методы Behavior вызываются как-то иначе!
Я не знаю в чем там дело, я не умею дизассемблировать библиотеки такие.
Но в LogCat появлялось лишь "Exception блаблабла NoSuchMethodError", без Stacktrace.
...Не прошло и недели, как я решил проблему, просто догадавшись нажать Debug в Eclipse, в то время, как раньше всю жизнь жал Run.
Исправил я эти экскепшны.
Но теперь другая проблема:
в LogCat выскакивает ошибка "JNI ERROR",
никакого StackTrace нигде нет,
что интересно, в отладчике опять есть упоминание "exception NoSuchMethodError", но ни стектрейсов, ни чего. Всё обшарил - ну нет и всё. Везде написано: мол код нативный, поэтому отлаживать его невозможно...
====
...И к сожалению, ни здесь, на Тостере, ни на StackOverflow (включая англ.) я не нашел помощи, как ни искал, сколько вопросов ни задавал, сколько тэгов ни пробовал.
На StackOverflow даже по первой проблеме сказали, будто решить ее невозможно. Но решение-то нашлось.
Думаю, со второй тоже всё просто - но надо обладать особой магией.
Итак, где мне таких магов найти?
Может быть, в Группах Google? Все-таки официальный форум по Android...
Или на XDA (форум, в названии которого есть и слово "Hacking")?
Или вообще стоит ориентироваться не на "андроидность" форума, а на что-то иное?
Денис Загаевский: вам есть что по делу сказать, или вы потралить пришли? Ну, если потралить, то вы лишний раз подтверждаете, что ни здесь, ни на SO нет никого, кто бы мог помочь в сравнительно сложной ситуации. А в простых мне помогать не очень и надо - сам разберусь, дело времени.
есть JNI-библиотека вида lib.so. NativeActivity.
...
я не умею дизассемблировать библиотеки такие.
Берёшь objdump из тулчейна которым собрана либа и выполняешь objdump -xd lib.so.NativeActivity.
Задавай уточняющие вопросы: непонятно, с чем именно у тебя сложности.
А что мне даст objdump?
Зачем оно мне? У меня есть IDA Pro, я могу ею пройтись по .so, но хрен там че поймешь, а главное - сохранить-то обратно нельзя, если я там что-то изменю.
Я ж говорю, сложность в том, что всё слетает в JNI ERROR, вроде бы проблема в отсутствии метода, но какого именно - и вообще никакой отладочной информации - не только не дается, но и клещами не вытащишь.
> я не умею дизассемблировать библиотеки такие
> У меня есть IDA Pro, я могу ею пройтись по .so
Ну так значит умеешь? Не вводи в заблуждение тех кого просишь тебе помочь.
> сложность в том, что всё слетает в JNI ERROR, вроде бы проблема в отсутствии метода, но какого именно - и вообще никакой отладочной информации - не только не дается, но и клещами не вытащишь
Сложность в том, что ты не даёшь никакой полезной информации в своём вопросе.
Опиши, что происходит, кто кого вызывает, куда ты попадаешь, где ты видишь ошибку.
jcmvbkbc: > Ну так значит умеешь? Не вводи в заблуждение тех кого просишь тебе помочь.
Пройтись могу. Ничего интересного найти - не могу. И пока буду искать в этом асме - с ума сойду.
> кто кого вызывает
Java-behavior вызывает native-метод из библиотеки.
Затем метод из библиотеки должен вызвать несколько методов в Behavior. Как именно - я не знаю, библиотека для меня почти черный ящик.
В Behavior нет нужного метода - соответственно, "JNI ERROR" и экспешн.
И всё. Больше никакой информации. Как узанть, какого именно метода.
> Как узанть, какого именно метода.
Я бы делал так:
- понять, как библиотека получает JNIEnv через который она вызывает джавовский код;
- запустить приложение под отладчиком, получить JNIEnv, поставить точку останова на вызовы GetStaticMethodID и GetMethodID
- посмотреть для какого метода их вызывают последними.
jcmvbkbc: спасибо, но тут-то и трудности: Как понять, как библиотека получает JNIEnv? Тот асм, который выдает IDA Pro, мне кажется слишком тяжелым для этого. Может, есть путь легче? И какой именно отладчик использовать в данной не совсем типовой ситуации?
> Как понять, как библиотека получает JNIEnv?
Я не специалист в java, но вижу следующие три принципиальные возможности:
- как параметр;
- вызовом JNI_CreateJavaVM: похоже, не твой случай;
- вызовом AttachCurrentThread: stackoverflow.com/questions/12900695/how-to-obtain...
По идее тебе нужен специалист по java/JNI.
> И какой именно отладчик использовать в данной не совсем типовой ситуации?
Я бы использовал gdb, потому что я всегда использую gdb.
jcmvbkbc: > Я не специалист в java, но вижу следующие три принципиальные возможности:
Вы не поняли.
Я имел в виду - чем открыть библиотеку .so (ARM или x86), чтобы можно было что-то там понять, и не сойти с ума как в случае с IDA?
> Я бы использовал gdb, потому что я всегда использую gdb.
А гуй для него есть?
А в эклипсе (+ADT) вот гуй (в перспективе Debug) - это для какого отладчика, вы не в курсе?
А в Android Studio?
> Я имел в виду - чем открыть библиотеку .so (ARM или x86), чтобы можно было что-то там понять, и не сойти с ума как в случае с IDA? objdump выложи библиотеку куда-нибудь, оценить масштабы бедствия?
> А гуй для него есть?
Есть, но зачем? тот же эклипс.
> А в эклипсе (+ADT) вот гуй (в перспективе Debug) - это для какого отладчика, вы не в курсе?
Не уверен, что перспектива однозначно идентифицирует отладчик. Когда я разрабатывал в эклипсе на С в этой перспективе торчал gdb.
> выложи библиотеку куда-нибудь
Коммерческая тайна. За всё это мне еще и деньги платят.
Весит несколько мегабайт.
> Есть, но зачем?
Для удобства и RAD. И в целом польза для отрасли - ниже порог вхождения.
> Хз, никогда не пользовался.
Примерно так.
А пока я пошел по иному пути.
Понял, что главное в моем случае, это сам факт наличия метода Java с нужной сигнатурой, а не то, что в его тело (пусть там будут ошибки - да и пофиг, всегда можно легко отладить, т.к. это уже Java, и код мой, а не чужой)
И так порассуждав, я взял jd-gui, декомпилировал то приложение, которое и "подделывал", и весь Java behavior прямо кучей побросал в новосозданный проект, и быстренько залатал все error marker'ы, просто чтобы компилировалось, ну и по возможности чтобы работало; логирование добавил везде на всякий случай.
Итог: буквально полчаса - и вуаля: пациент скорее жив, чем мертв. Приложение хотя бы загружается.
))