#android #frida
#Android #фрида
Вопрос:
Фрида может распечатать обратную трассировку с помощью приведенного ниже кода:
var backtrace = Thread.backtrace(this.context, Backtracer.ACCURATE)
.map(DebugSymbol.fromAddress)
.join("nt");
Вывод выглядит следующим образом в Android:
0x72e82c2a50 libc.so!fopen64 0x50
0x72e82c2a4c libc.so!fopen64 0x4c
Но когда я пытаюсь использовать addr2line для получения строки кода, это не работает:
$ addr2line -f -C -i -e symbols/apex/com.android.runtime.release/lib64/bionic/libc.so 0x72e82c2a50
??
??:0
Похоже, что этот адрес не является фактическим ПК в качестве стека сбоев. Как я могу перевести этот адрес для использования в инструменте addr2line?
Комментарии:
1. Вы учитывали, что обычно исполняемые файлы выполняются со случайным базовым адресом (ASLR)? Следовательно, если вы не укажете правильный базовый адрес, addr2line не может работать по определению.
Ответ №1:
Ниже приведены шаги (например libc.so )
- Получить базовый адрес библиотеки:
0xac0ad000 <- Module.findBaseAddress(«libc.so «)
- Получить обратную трассировку
Поток.обратная трассировка (thz.context, средство отслеживания.ТОЧНЫЙ).map(DebugSymbol.fromAddress).join(» n «);
Пример вывода:
0xac151ed7 libc.so !fopen64 0x2e
3. Вычтите baseAddr, чтобы получить значение для ПК
#pc 0x000a4ed7 <- 0xac151ed7 — 0xac0ad000
- Добавьте строку 2 со значением PC
$ addr2line -f -C -i -e symbols/apex/com.android.runtime/lib/bionic/libc.so 0x000a4ed7
открыть (char const*, int pass_object_size1, unsigned short)
bionic/libc/include/bits/fortify/fcntl.h:74 открыть
bionic/libc/stdio/stdio. cpp:256