frida — Как перевести собственную обратную трассировку для использования с инструментом addr2line

#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 )

  1. Получить базовый адрес библиотеки:

0xac0ad000 <- Module.findBaseAddress(«libc.so «)

  1. Получить обратную трассировку

Поток.обратная трассировка (thz.context, средство отслеживания.ТОЧНЫЙ).map(DebugSymbol.fromAddress).join(» n «);

Пример вывода:

0xac151ed7 libc.so !fopen64 0x2e

3. Вычтите baseAddr, чтобы получить значение для ПК

#pc 0x000a4ed7 <- 0xac151ed7 — 0xac0ad000

  1. Добавьте строку 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