论坛首页 移动安全专区 阅读主题

[翻译]在未root的设备上使用frida

279 浏览 12 回复
#1 楼主 2026-06-01 21:08:53
在这篇教程中我们可以学会怎么在未root设备上使用Frida gadget。
脚本和工具在这里:materials
作者Romain Thomas - @rh0main最近几年,Frida已经成为这一行业进行hook的首选工具。它使用起来快速,灵活,且支持跨平台。大部分时候在root过后的设备上使用Frida并没有什么限制,但某些场景中有些app可能会检测执行环境。 @ikoz在他的博文Using Frida on Android without root中提到了一种修改Dalvik字节码的方法,以实现在未root设备上使用Frida。在这篇教程中我们提出了一种不需要修改Dalvik字节码的新方法。(即classes.dex) 在默认模式下,Frida需要在目的应用程序中注入一个代理以访问目标进行的内存空间。 在Android和Linux中这种注入使用到了ptrace。它通过附加或启动一个程序,然后注入对应的代理程序。在代理程序被注入后,它通过管道和服务器进行通信。 有些注入需要权限。比如,我们不能使用普通用户调用ptrace。为了解除这个限制,Frida提供了另一种模式,叫作“embedded”。在这一模式中,用户需要注入frida-gadget库。 这种注入需要:...要获取关于Frida gadget的更多信息,可以看官方文档:frida-gadget 有一种不那么出名但非常古老的注入技术是通过修改ELF格式。Mayhem 在Phrack详细解释了这一技术的原理,而LIEF(译者注:LIEF,本文作者实现的一个库)提供了一种用户友好的API来实现。简而言之,可执行文件格式包含了链接在可执行文件上的库。我们可以使用ldd或readelf(Unix)列出这些库,或者是使用elf_reader.py(Linux, Windows, OSX):在这里/bin/ls有两个依赖:当可执行文件载入的时候,载入器会遍历这些库,并把它们映射到进程到的内存空间中去,并在加载之后调用它的构造方法。这一想法的原理是添加frida-agent.so作为APK的native库的依赖。添加这个依赖的代码非常简单,像下面这样:为了解释这个进程,我们会注入frida gadget到Telegram这个应用中。Telegram是个好玩的目标,因为:关于环境,软件是Telegram的4.8.4-12207版本(2018.2.18),系统是在Android 6.0.1上,架构是Samsung Galaxy S6的AArch64架构。正如上面解释的,注入过程只需要在libtmessages.28.so上调用lief.ELF.Binary.add_library()。在注入之前,libtmessages.28.so与下列库相链接:在执行了telegram.add_library("libgadget.so")这条语句后,在第一个位置上,我们有了一条新的依赖。根据文档我们可以知道,Frida Gadgets可以使用配置文件作为参数来进行交互。Frida payload会定位到/data/local/tmp/myscript.js文件,gadget配置文件的配置如下:使用配置配置文件必须遵循两个条件:第二个要求也就意味着在设备中安装之后,gadget库会会在/data/app/org.telegram.messenger-1/lib目录中寻找配置文件。在安装app之后,当满足下述条件时,Android包管理器会从APK的lib/目录中复制文件:Frida 实现这些要求的源码如下。因此我们只需要给libgadget.conf添加.so后缀就行了。lib/gadget/gadget.vala最终,新的Telegram的.apk的lib目录结构如下:libtmessages.28.so链接到了libgadget.so在满足下述要求后:安装new.apk这个重新打包的APK,并把myscript.js放在/data/local/tmp目录下:这篇教程中用到的Frida脚本myscript.js只实现了一个对Android log函数调用的功能:myscript.js最后,我们就可以运行telegram程序并查看它的Android日志了。
在这篇教程中我们看到了静态插桩和动态插桩的结合方法。下面是这一技术的优/缺点优点:缺点:API原文链接:cbbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9K9h3g2X3i4K6u0W2M7i4g2S2M7X3E0K6L8r3q4T1i4K6u0W2j5$3!0E0i4K6u0r3k6r3!0U0i4K6u0r3L8r3q4@1k6i4y4@1i4K6u0r3N6s2g2@1L8%4u0A6j5h3I4K6i4K6u0r3x3o6W2Q4y4h3k6X3M7X3W2V1j5g2)9#2k6X3I4A6k6h3k6Q4x3X3g2Z5N6r3#2D9
编译:看雪翻译小组 梦野间
校对:看雪翻译小组 lumou

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-229970.htm
#2 2026-06-01 21:08:53
感谢lz 终于等到这篇了 之前都没见到有重打包frida的介绍
#3 2026-06-01 21:08:53
谢谢翻译,mark
#4 2026-06-01 21:08:53
感谢lz,很有帮助
#5 2026-06-01 21:08:53
赞,非常有用,我基于这个,最近撸个的实现,大伙可以试试,53eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6@1j5X3!0G2P5q4)9J5k6h3!0J5k6#2)9J5c8X3y4F1i4K6u0r3x3U0l9J5x3q4)9J5c8U0l9@1i4K6u0r3x3U0k6Q4x3V1k6D9N6h3A6W2j5%4c8Q4x3V1k6Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4K6t1$3L8X3u0K6M7q4)9K6b7W2!0q4y4g2)9^5c8W2!0m8c8W2!0q4y4q4!0n7b7W2!0m8y4g2!0q4y4g2!0m8c8W2!0n7z5h3q4H3K9#2)9J5c8X3W2H3j5g2)9J5c8X3#2S2j5#2)9J5y4X3&6T1M7%4m8Q4x3@1u0S2M7s2m8Q4x3U0k6F1j5Y4y4H3i4K6y4n7i4@1f1^5i4@1u0r3i4K6V1^5i4@1f1$3i4K6W2o6i4K6R3&6k6h3I4X3i4K6u0r3M7r3g2Q4x3V1k6E0j5h3y4Z5L8#2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4g2)9^5c8W2!0m8c8W2!0q4y4W2)9^5z5g2!0m8y4#2!0q4z5q4!0m8x3g2)9^5b7#2!0q4y4W2)9&6y4W2)9^5y4#2!0q4y4q4!0n7b7W2!0n7y4W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2)9^5b7g2!0m8z5q4!0q4y4W2)9^5x3q4)9^5x3g2!0q4y4g2!0n7b7g2)9&6x3#2!0q4z5q4!0n7c8W2)9&6b7W2!0q4z5q4!0m8x3g2)9^5b7#2!0q4y4q4!0n7c8W2!0m8c8g2!0q4y4W2)9&6y4q4!0n7z5g2!0q4y4W2!0n7x3#2!0m8z5q4!0q4y4g2)9^5y4g2!0m8y4b7`.`.
#6 2026-06-01 21:08:53
mark
#7 2026-06-01 21:08:53
脚本最后一行写错了名字,应该是libnative
libnative = lief.parse("libnative.so")
libnative.add_library("libgadget.so") # Injection!
libnative.write("libnative.so")
#8 2026-06-01 21:08:53
感谢分享
#9 2026-06-01 21:08:53
lvcoffee


脚本最后一行写错了名字,应该是libnative
libnative = lief.parse("libnative.so")
libnative.add_library(&q ...

是的,我也疑惑了一会,检查了原文是写错了。
#10 2026-06-01 21:08:53
重新签名后,app安装不了了咋搞
#11 2026-06-01 21:08:53
wx_@无知男


重新签名后,app安装不了了咋搞

这么老的文还有人回。。。
用adb install 命令安装,看报错提示是什么
#12 2026-06-01 21:08:53
我试了Pixel Android8.1.0可以,Miui Android 11不行,不知道是不是路径不一致导致的,Miui上app的路径是/data/app/~~88RoweeJkg1m32k1maESDw==/org.telegram.messenger-04jmp3aH5ri-GneXwPrZiw==/lib,是不是这个原因有没大佬知道的
#13 2026-06-01 21:08:53
mark

请登录后参与讨论

立即登录 注册账号