我有一个安卓应用程序。如何使用fried打印该应用程序的函数调用堆栈?我需要对调用哪个函数以及从哪个类调用的可读引用。该应用程序是用 Java + Kotlin 编写的。 我使用了 frida-trace,但是当我在过滤器中写入我需要的函数(该函数肯定存在)时,它向我显示了这个。
frida-trace -U -f org.mozilla.firefox -i "checkRequest*"
Started tracing 0 functions. Press Ctrl+C to stop.
如果我使用他们在示例中编写的内容,例如 send 方法,那么它会显示非 Java 函数并且不明白什么
frida-trace -U -f org.mozilla.firefox -i "*send*"
Instrumenting...
_ZN4aidl7android5media24BpResourceManagerService17sendCapacityErrorEiilRKNSt3__110shared_ptrINS1_22IResourceManagerClientEEERKNS3_6vectorINS_3com7samsung7android5media15MediaInfoParcelENS3_9allocatorISE_EEEE: Loaded handler at "/home/teammrpa/__handlers__/libmedia.so/_ZN4aidl7android5media24BpResour_a5adc3e0.js"
_ZN4aidl7android5media30IResourceManagerServiceDefault17sendCapacityErrorEiilRKNSt3__110shared_ptrINS1_22IResourceManagerClientEEERKNS3_6vectorINS_3com7samsung7android5media15MediaInfoParcelENS3_9allocatorISE_EEEE: Loaded handler at "/home/teammrpa/__handlers__/libmedia.so/_ZN4aidl7android5media30IResourc_d783483c.js"
_ZN7android13MediaRecorder11sendCommandEiii: Loaded handler at "/home/teammrpa/__handlers__/libmedia.so/_ZN7android13MediaRecorder11send_54e1e7bb.js"
_ZN7android14MtpEventPacket11sendRequestEP11usb_request: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android14MtpEventPacket11sen_93bad13a.js"
_ZN7android9MtpServer14sendStoreAddedEj: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android9MtpServer14sendStoreAddedEj.js"
_ZN7android9MtpDevice8sendDataEv: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android9MtpDevice8sendDataEv.js"
_ZN7android18MtpFfsCompatHandle8sendFileE14mtp_file_range: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android18MtpFfsCompatHandle8_37263f12.js"
_ZN7android9MtpServer21sendObjectInfoChangedEj: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android9MtpServer21sendObjec_f93a69c2.js"
_ZN7android12MtpDevHandle8sendFileE14mtp_file_range: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android12MtpDevHandle8sendFi_e48bebb3.js"
_ZN7android9MtpServer17sendObjectRemovedEj: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android9MtpServer17sendObjec_4c09ad98.js"
_ZN7android9MtpDevice14sendObjectInfoEPNS_13MtpObjectInfoE: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android9MtpDevice14sendObjec_714e59c5.js"
_ZN7android9MtpServer15sendObjectAddedEj: Loaded handler at "/home/teammrpa/__handlers__/libmtp.so/_ZN7android9MtpServer15sendObjectAddedEj.js"
...
Started tracing 176 functions. Press Ctrl+C to stop.
/* TID 0x723b */
297 ms _ZN7android11GraphicsEnv18sendGpuStatsLockedENS_12GpuStatsInfo3ApiEbl()
/* TID 0x7239 */
302 ms _ZN7android3gui7BitTube11sendObjectsEPS1_PKvmm()
302 ms | sendto(sockfd=0x6d, len=0x7959f5d550, flags=0xd8, dest_addr=0x4040, addrlen=0x0)
/* TID 0x7202 */
404 ms _ZN7android13InputConsumer18sendFinishedSignalEjb()
404 ms | _ZN7android13InputConsumer27sendUnchainedFinishedSignalEjb()
404 ms | | _ZN7android12InputChannel11sendMessageEPKNS_12InputMessageE()
404 ms | | | __sendto_chk()
404 ms | | | | sendto(sockfd=0x8f, len=0x7ff84226d0, flags=0x18, dest_addr=0x4040, addrlen=0x0)
/* TID 0x724d */
436 ms sendmsg(sockfd=0xa7, msg=0x79e7d5e3e0, flags=0x40)
/* TID 0x7250 */
535 ms _ZN12FwmarkClient4sendEP13FwmarkCommandiP17FwmarkConnectInfo()
535 ms | sendmsg(sockfd=0xc6, msg=0x79e65fa750, flags=0x0)
536 ms _ZN12FwmarkClient4sendEP13FwmarkCommandiP17FwmarkConnectInfo()
536 ms | sendmsg(sockfd=0xc6, msg=0x79e65fa750, flags=0x0)
537 ms _ZN12FwmarkClient4sendEP13FwmarkCommandiP17FwmarkConnectInfo()
537 ms | sendmsg(sockfd=0xcd, msg=0x79e65fa750, flags=0x0)
538 ms _ZN12FwmarkClient4sendEP13FwmarkCommandiP17FwmarkConnectInfo()
538 ms | sendmsg(sockfd=0xcd, msg=0x79e65fa750, flags=0x0)
。 ChatGPT 也尝试为我编写一个脚本,但它根本没有输出任何内容。
如果您想跟踪 Java/Kotlin 方法,那么您使用了错误的参数。
-i "checkRequest*"
仅捕获 C/本机方法。
要捕获以 checkRequest 开头的任何类的 Java 方法,您需要使用
-j "*!checkRequest*"
。
!
前面的星号是类名过滤方法名过滤后面的部分。
另请参阅 Frida 网页上的 frida-trace 示例。
为了获取 Java 堆栈跟踪 AFIR,Frida 不提供直接方法(在 Frida 跟踪中,如果挂钩方法,您只能看到调用堆栈)。但您可以编辑生成的处理程序 js 文件。
您应该能够通过使用 Frida 引发 Java 异常来获取 Java 堆栈跟踪,然后直接捕获它以获取包含堆栈跟踪的异常。