轻松绕过 Frida 检测的技巧/提示和脚本 UwU
大家好,在我之前的文章中,我们研究了漏洞应用程序 AndroGoat,并使用 FRIDA 绕过了 sslpinning、root 等。但如果由于应用程序具有反 Frida 机制而导致 Frida 本身无法运行,该怎么办?
好吧好吧我回来了UwU
让我们开始吧
Frida 机制代码:
public class FridaDetection {
private static final String TAG = "FridaDetection";
private static boolean checkForFridaFiles() {
String[] strArr = {"/data/local/tmp/frida-server", "/data/local/tmp/frida", "/data/local/tmp/re.frida.server"};
for (int i2 = 0; i2 < 3; i2++) {
String str = strArr[i2];
if (new File(str).exists()) {
StringBuilder sb = new StringBuilder();
sb.append("Frida file detected: ");
sb.append(str);
return true;
}
}
return false;
}
private static boolean checkForFridaPorts() {
int[] iArr = {27042, 27043};
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("netstat -an").getInputStream()));
while (true) {
String readLine = bufferedReader.readLine();
if (readLine == null) {
break;
}
for (int i2 = 0; i2 < 2; i2++) {
int i3 = iArr[i2];
if (readLine.contains(String.valueOf(i3))) {
StringBuilder sb = new StringBuilder();
sb.append("Frida port detected: ");
sb.append(i3);
return true;
}
}
}
} catch (IOException e2) {
Log.e(TAG, "Error checking for Frida ports", e2);
}
return false;
}
private static boolean checkForFridaServerProcesses() {
String readLine;
String[] strArr = {"frida-server", "frida"};
int i2 = 0;
while (i2 < 2) {
String str = strArr[i2];
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec("ps").getInputStream()));
do {
readLine = bufferedReader.readLine();
if (readLine != null) {
}
} while (!readLine.contains(str));
StringBuilder sb = new StringBuilder();
sb.append("Frida process detected: ");
sb.append(str);
return true;
} catch (IOException e2) {
Log.e(TAG, "Error checking for Frida server processes", e2);
}
}
return false;
i2++;
}
public static void detectFrida() {
if (!checkForFridaServerProcesses() && !checkForFridaFiles() && !checkForFridaPorts()) {
} else {
throw new RuntimeException("null");
}
}
}
该代码包含三个 frida 检查
1. 检查 data/local/tmp 目录中的硬编码 Frida 文件名
2. 检查 Frida 默认运行的端口
3. 检查以 Frida 命名运行的服务
如果任何这些检查返回 true,则应用程序崩溃,因为它会抛出运行时异常。
让我们绕过这些
绕过第一轮检查
private static boolean checkForFridaFiles() {
String[] strArr = {"/data/local/tmp/frida-server", "/data/local/tmp/frida", "/data/local/tmp/re.frida.server"};
它基本上是在上面的代码片段中硬编码的目录中寻找文件。
为了绕过此检查,我们只需更改已推送到 data/local/tmp 的 frida-server 的名称,它可以命名为除三个值(即 frida-server、frida、re.frida.server)之外的任何名称。
我将我的命名为mytools以避免检测。
第一次检查已被绕过 UwU
绕过第二轮检查
private static boolean checkForFridaPorts() {
int[] iArr = {27042, 27043};
它会检查 frida 默认运行的端口 27042 和 27043。它会运行 netstat -an 来查看硬编码端口是否被占用,如果被占用,则意味着 frida 正在其中一个端口上运行,它会抛出运行时异常,导致应用程序崩溃。
为了避免检测并绕过此检查,我们将把在这些端口上运行的服务转发到不同的端口。
使用命令
# adb forward tcp:27044 tcp:27042
# adb forward tcp:27045 tcp:27043
这会将 27042 和 27043 的服务移动到 27044 和 27045,这样两个默认端口都将空闲,并且不会被第二次检查检测为被占用,这将绕过端口检测。
第二次检查已被绕过 UwU
这些是先决条件,以便我们可以运行自定义反弗里达绕过脚本
自定义脚本是根据用于检测 frida 的应用程序中的代码编写的。如果没有遇到相同的代码,那么您将不得不根据需要修改自定义脚本。我当前使用的脚本可以帮助您理解和创建自己的脚本。
这是自定义脚本
Java.perform(function() {
// Hook the file detection method
var fridaDetection = Java.use('PROCESSNAME.FridaDetection');
//This line finds and loads the FridaDetection class from the app’s code (the full class path is processname.path.FridaDetection).
//Java.use() gives access to the app's Java classes and methods, allowing you to modify or intercept them.
fridaDetection.checkForFridaFiles.implementation = function() {
console.log("Bypassed Frida file detection");
return false; // Always return false to bypass the check
};
// Hook the port detection method
fridaDetection.checkForFridaPorts.implementation = function() {
console.log("Bypassed Frida port detection");
return false; // Always return false to bypass the check
};
// Hook the process detection method
fridaDetection.checkForFridaServerProcesses.implementation = function() {
console.log("Bypassed Frida process detection");
return false; // Always return false to bypass the check
};
});
让我们运行脚本
frida -H 127.0.0.1:27044 -f (process name) -l antifridadetectionscript.js127.0.0.1:27044 -f (process name) -l antifridadetectionscript.js
注意:我们使用 -H 参数与给定的 ip:port 建立远程连接,而不是使用 -U 参数建立直接 USB 连接。
运行该程序将绕过所有检查并将其值返回为 FALSE。
现在所有检查都已绕过 UwU
笔记:
之所以要先满足先决条件,然后再运行脚本,是因为如果我运行脚本,而没有先决条件,应用程序就会崩溃,因为它需要几毫秒的时间来检测 Frida 的存在,但是在更改名称和端口后,它给了脚本足够的时间来运行并将所有值返回为 FALSE
逐步程序
adb shell
cd data/local/tmpdata/local/tmp
./mytools & (remember this is my frida server renamed to avoid detection)
在不同的终端上
adb forward tcp:27044 tcp:27042tcp:27044 tcp:27042
adb forward tcp:27045 tcp :27043
frida -H 127.0.0.1:27044 -f (process name) -l antifridadetectionscript.js
注意:我们使用 -H 参数与给定的 ip:port 建立远程连接,而不是使用 -U 参数建立直接 USB 连接。
运行该程序将绕过所有检查并将其值返回为 FALSE。
按 Enter 键访问 frida 终端
>%load rootbypassscript.jsload rootbypassscript.js
这将运行 root 绕过脚本并且无法绕过 root 检测,但会告诉我们应用程序具有 rootbeer 保护。
>%load rootbeerbypass.jsload rootbeerbypass.js
这将绕过 root 检测,你的应用程序就可以运行了 UwU
这就是关于绕过 Frida 检测的内容。我希望它能帮助你绕过 Frida 或者了解该机制的工作原理,以便你可以绕过不同的 Frida 检查。
原文始发于微信公众号(Ots安全):Frida 检测绕过
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论