Пред. Frida Framework vs Android p.1
След. Frida Framework vs Android p.3
Frida and Radare2: r2frida
Было бы неплохо, если бы мы могли использовать фрэймворк дизассеблирования, например
Вы можете установит r2frida используя Radare2 packet management (кончено, если radare2 у вас уже установлен):
Вернитесь назад на пример с frida-trace, удалите или переименуйте наш измененный скрипт, теперь вывод будет такой же каким он был изначально:
В r2frida вы можете легко вы можете посмотреть что лежит по выводимым адресам и прочитать путь, в данном случае /dev/binder.
Синтаксис доступа к процессу и подключения r2frida:
Также проверьте доступные команды r2frida, они доступны с помощью префикса =!, который помимо прочего позволяет вам быстро находить области памяти с требуемым содержимым или записывать по требуемым адресам.
Теперь, после знакомства с Frida в первой части, мы готовы к решению небольшого CrackMe используя Frida. После того что мы узнали о Frida это должно быть очень легко, ну теоретически. Если вы хотите повторять за мной, скачайте:
Установите Uncrackable Crackme Level 1 на ваше устройство:
Подождите пока он установится, затем запустите его (оранжевая иконка в правом нижнем углу):
После запуска приложение сообщит, что не оно не работает на устройстве с правами супер-пользователя:
Если вы нажмете “ОК” приложение сразу же закроется. Хм. Нехорошо. Похоже мы не сможем решить CrackMe таким способом. А разве мы ожидали другого? Давайте разберемся что происходит, разберем как работает приложение внутри.
Сконвертируем APK в jar c помощью dex2jar:
Теперь загрузим файл а BytecodeViewer (или любой другой дизассемблер на ваш выбор, главное что бы он поддерживал Java). Вы также можете попробовать загрузить APK напрямую в BytecodeViewer или открыть его classes.dex, но у меня это не работало, поэтому я предварительно сконвертировал в jar с помощью dex2jar.
В BytecodeViewer выберете View->Panel 1->CFR->Java для использования CFR Decompiler. Вы можете включить отображение smali кода во втором окне (Panel 2) если вы хотите сравнивать вывод декомпилятора с дизассемблированным листингом (который зачастую точнее декомпилированного кода).
Вывод CFR Decompiler для MainActivity:
Взглянув на остальные декомпилированные файлы, можно заметить, что приложение достаточно небольшое, и возможно, мы могли бы решить CrackMe просто разобрав алгоритм расшифровки и преобразования строк. Однако, после знакомства с Frida разве мы не можем сделать проще?
Всё не получается опубликовать одной статьёй, поэтому разбиваю на статьи по-мельче.
След. Frida Framework vs Android p.3
Frida and Radare2: r2frida
Было бы неплохо, если бы мы могли использовать фрэймворк дизассеблирования, например
Ссылка скрыта от гостей
для изучения памяти приложения. Здесь появляется r2frida. Вы можете использовать r2frida для подключения radare2 к Frida и проводить статический анализ и дизассеблировать память процесса. Я не буду вдаваться в подробности r2froda здесь, потому что он предполагает знаний Radare2 (на что совершенно точно следует посмотреть, если вы еще не сделали этого), но тем не менее, я хочу дать вам представление об его использовании.Вы можете установит r2frida используя Radare2 packet management (кончено, если radare2 у вас уже установлен):
Код:
r2pm install r2frida
Код:
michael@sixtyseven:~$ frida-trace -i open -U -f com.android.chrome
Instrumenting functions...
open: Loaded handler at "/home/michael/__handlers__/libc.so/open.js"
Started tracing 1 function. Press Ctrl+C to stop.
/* TID 0x2740 */
282 ms open(pathname=0xa843ffc9, flags=0x80002)
/* TID 0x2755 */
[...]
Код:
root@sixtyseven:~# r2 frida://emulator-5556/com.android.chrome
-- Enhance your graphs by increasing the size of the block and graph.depth eval variable.
[0x00000000]> s 0xa843ffc9
[0xa843ffc9]> px
- offset - 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF
0xa843ffc9 2f64 6576 2f62 696e 6465 7200 4269 6e64 /dev/binder.Bind
0xa843ffd9 6572 2069 6f63 746c 2074 6f20 6f62 7461 er ioctl to obta
0xa843ffe9 696e 2076 6572 7369 6f6e 2066 6169 6c65 in version faile
0xa843fff9 643a 2025 7300 4269 6e64 6572 2064 7269 d: %s.Binder dri
[...]
Код:
r2 frida://DEVICE-ID/PROCESS
Код:
[0x00000000]> =!?
r2frida commands available via =!
? Show this help
?V Show target Frida version
/[x][j] <string|hexpairs> Search hex/string pattern in memory ranges (see search.in=?)
/w[j] string Search wide string
[...]
- OWASP Uncrackable Crackme Level 1 (APK)
-
Ссылка скрыта от гостей
- dex2jar
Установите Uncrackable Crackme Level 1 на ваше устройство:
Код:
adb install sg.vantagepoint.uncrackable1.apk
После запуска приложение сообщит, что не оно не работает на устройстве с правами супер-пользователя:
Если вы нажмете “ОК” приложение сразу же закроется. Хм. Нехорошо. Похоже мы не сможем решить CrackMe таким способом. А разве мы ожидали другого? Давайте разберемся что происходит, разберем как работает приложение внутри.
Сконвертируем APK в jar c помощью dex2jar:
Код:
michael@sixtyseven:/opt/dex2jar/dex2jar-2.0$ ./d2j-dex2jar.sh -o /home/michael/UnCrackable-Level1.jar /home/michael/UnCrackable-Level1.apk
dex2jar /home/michael/UnCrackable-Level1.apk -> /home/michael/UnCrackable-Level1.jar
В BytecodeViewer выберете View->Panel 1->CFR->Java для использования CFR Decompiler. Вы можете включить отображение smali кода во втором окне (Panel 2) если вы хотите сравнивать вывод декомпилятора с дизассемблированным листингом (который зачастую точнее декомпилированного кода).
Вывод CFR Decompiler для MainActivity:
Код:
package sg.vantagepoint.uncrackable1;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
import sg.vantagepoint.uncrackable1.a;
import sg.vantagepoint.uncrackable1.b;
import sg.vantagepoint.uncrackable1.c;
public class MainActivity
extends Activity {
private void a(String string) {
AlertDialog alertDialog = new AlertDialog.Builder((Context)this).create();
alertDialog.setTitle((CharSequence)string);
alertDialog.setMessage((CharSequence)"This in unacceptable. The app is now going to exit.");
alertDialog.setButton(-3, (CharSequence)"OK", (DialogInterface.OnClickListener)new b(this));
alertDialog.show();
}
protected void onCreate(Bundle bundle) {
if (sg.vantagepoint.a.c.a() || sg.vantagepoint.a.c.b() || sg.vantagepoint.a.c.c()) {
this.a("Root detected!"); //This is the message we are looking for
}
if (sg.vantagepoint.a.b.a((Context)this.getApplicationContext())) {
this.a("App is debuggable!");
}
super.onCreate(bundle);
this.setContentView(2130903040);
}
public void verify(View object) {
object = ((EditText)this.findViewById(2131230720)).getText().toString();
AlertDialog alertDialog = new AlertDialog.Builder((Context)this).create();
if (a.a((String)object)) {
alertDialog.setTitle((CharSequence)"Success!");
alertDialog.setMessage((CharSequence)"This is the correct secret.");
} else {
alertDialog.setTitle((CharSequence)"Nope...");
alertDialog.setMessage((CharSequence)"That's not it. Try again.");
}
alertDialog.setButton(-3, (CharSequence)"OK", (DialogInterface.OnClickListener)new c(this));
alertDialog.show();
}
}
Всё не получается опубликовать одной статьёй, поэтому разбиваю на статьи по-мельче.