首页
社区
课程
招聘
检测frida注入的简单方法
2023-2-2 19:51 16539

检测frida注入的简单方法

2023-2-2 19:51
16539

frida在安卓逆向工程界中非常受欢迎,这是充分有理由的,基本上可以在运行时访问到你能想到的任何东西包括raw内存、native函数及Java对象实例等。不过,每个好用的注入工具都伴随着反注入、反反注入及反反反(...)注入的方法。在这篇文章中,我要介绍如何使用frida来检测frida是否被用于注入恶意代码的几种方法。

检测frida的痕迹

检测frida和同类工具的一种简单方法是检测工具的包文件、二进制文件、进程以及临时文件等运行痕迹。举个例子,我要针对的对象是fridaserver,该守护进程负责通过TCP协议与frida对外通信,我们就可以使用Java遍历在运行的进程列表而检查fridaserver是否在运行。

 

1

 

如果frida在默认配置运行,这种方法就很有效。逆向菜鸟可能被这种方法难倒了,但是一位有经验的逆向工程师会知道只需要重命名fridaserver就可以不费力绕过,那么我们要找一个更好的方法。

 

fridaserver默认的TCP端口是27047,另外一个好用的方法就是检查这个端口是否开放的。native代码如下:

 

2

 

同样,这种方法要求fridaserver在默认模式运行,但是可以使用命令行参数来轻而易举地改变监听端口,因此绕过不太麻烦了。不过我们可以使用nmap -sV来改善方法。因为fridaserver通过D-Bus协议通信,我们就可以向每个开放的端口发送D-Bus AUTH消息,让fridaserver露马脚。

 

2

 

我们现在有一个相对好用的方法,但还存在着一些突出的问题,例如frida能提供不需要fridaserver的运行模式!那怎么检测啊?

 

frida所有模式的共同特征就是代码注入,那么在运行情况下,frida有关的库都应该映射到内存。最简单的检测方法是检查加载的库中有没有frida的痕迹:

 

4

 

上面的代码检查是否存在名字含有frida的库。表面上看来方法是有效的,但实际上还存严重的问题:

 

1. 你们还记得可以很容易改变fridaserver的名字吗?同样适用于这种方法,只要对frida进行一些小的修改,就可以重命名frida的代理库。
2. 成功的检测依赖fopen()和strstr()等标准库的函数,但这些函数是被frida轻而易举hook的。很显然,这还不是一个非常可靠的方法。

 

第一个问题可以使用经典的病毒扫描程序的方法来解决,这样扫描frida库中是否存在 ”gadgets“。我选择的字符串的”LIBFRIDA“,该字符串好像在frida-gadget和frida-agent所有的版本中都会出现。我们可以使用下面的代码来遍历/proc/self/maps里的内存mappings找到所有可执行段中的字符串。请注意,为了简洁我省略了一些函数。

 

5

 

注意我用的函数是my_openat()等而不是平常用的libc库函数。函数是自定义实现的,但是和libc函数一样也可以设置系统调用的参数,执行软件中断(看下面的代码)。因为这样不依赖公共的API,就不容易被hook。下面是my_openat的代码:

 

6

 

这种方法相对有效,只用frida的话绕过就很麻烦,加了混淆会更难。即使这样,补丁和hook系统调用等我没提到的方法还可以绕过,但是要记住,逆向工程师永远胜利!

 

来源文章:https://web.archive.org/web/20200310081321/https://www.vantagepoint.sg/blog/90-the-jiu-jitsu-of-detecting-frida


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞5
打赏
分享
最新回复 (1)
雪    币: 52
活跃值: (3274)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DirtyAngle 2023-2-9 15:53
2
1
还有好多好多
游客
登录 | 注册 方可回帖
返回