首页
社区
课程
招聘
[翻译]在未root的设备上使用frida
发表于: 2018-7-16 19:39 55987

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

2018-7-16 19:39
55987

在这篇教程中我们可以学会怎么在未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来实现。

简而言之,可执行文件格式包含了链接在可执行文件上的库。我们可以使用lddreadelf(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的.apklib目录结构如下:

libtmessages.28.so链接到了libgadget.so

在满足下述要求后:

安装new.apk这个重新打包的APK,并把myscript.js放在/data/local/tmp目录下:

这篇教程中用到的Frida脚本myscript.js只实现了一个对Android log函数调用的功能:

myscript.js

最后,我们就可以运行telegram程序并查看它的Android日志了。
图片描述

在这篇教程中我们看到了静态插桩和动态插桩的结合方法。

下面是这一技术的优/缺点

优点:

缺点:

API

原文链接:https://lief.quarkslab.com/doc/latest/tutorials/09_frida_lief.html
编译:看雪翻译小组 梦野间
校对:看雪翻译小组 lumou

 
 
 
 
 
 
 
 
 
 
 

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-7-18 00:04 被梦野间编辑 ,原因:
收藏
免费 8
支持
分享
打赏 + 2.00雪花
打赏次数 1 雪花 + 2.00
 
赞赏  junkboy   +2.00 2018/07/17
最新回复 (11)
雪    币: 33
活跃值: (322)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢lz 终于等到这篇了 之前都没见到有重打包frida的介绍
2018-7-16 23:40
0
雪    币: 11716
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢翻译,mark
2018-7-17 00:47
0
雪    币: 239
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢lz,很有帮助
2018-8-29 15:49
0
雪    币: 183
活跃值: (563)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
5
赞,非常有用,我基于这个,最近撸个的实现,大伙可以试试,https://tboox.org/cn/2020/04/26/luject/  可以对apk/ipa/mac app 还有elf/pe/macho的可执行文件,动态库进行修改注入

项目源码在:https://github.com/lanoox/luject
最后于 2020-4-26 23:23 被waruqi编辑 ,原因:
2020-4-26 23:22
1
雪    币: 102
活跃值: (2180)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
mark
2020-5-29 19:42
0
雪    币: 143
活跃值: (493)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
脚本最后一行写错了名字,应该是libnative
libnative = lief.parse("libnative.so")
libnative.add_library("libgadget.so") # Injection!
libnative.write("libnative.so")
2021-2-24 17:46
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享
2021-7-1 14:01
0
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
lvcoffee 脚本最后一行写错了名字,应该是libnative libnative = lief.parse("libnative.so") libnative.add_library(&q ...
是的,我也疑惑了一会,检查了原文是写错了。
2021-7-15 10:26
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
重新签名后,app安装不了了咋搞
2021-12-8 11:44
0
雪    币: 3757
活跃值: (1757)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
11
wx_@无知男 重新签名后,app安装不了了咋搞
这么老的文还有人回。。。
用adb install 命令安装,看报错提示是什么
2021-12-8 19:18
0
雪    币: 33
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
我试了Pixel Android8.1.0可以,Miui Android 11不行,不知道是不是路径不一致导致的,Miui上app的路径是/data/app/~~88RoweeJkg1m32k1maESDw==/org.telegram.messenger-04jmp3aH5ri-GneXwPrZiw==/lib,是不是这个原因有没大佬知道的
2022-11-9 15:38
1
游客
登录 | 注册 方可回帖
返回
//