Skip to content

Commit bc2cdf1

Browse files
committed
Frida detection implemented
1 parent 99dd822 commit bc2cdf1

File tree

9 files changed

+157
-26
lines changed

9 files changed

+157
-26
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ android {
2828
targetCompatibility JavaVersion.VERSION_17
2929
}
3030
kotlinOptions {
31-
jvmTarget = '11'
31+
jvmTarget = '17'
3232
}
3333
buildFeatures {
3434
viewBinding true

gradle/wrapper/gradle-wrapper.jar

-17.7 KB
Binary file not shown.
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
44
networkTimeout=10000
5+
validateDistributionUrl=true
56
zipStoreBase=GRADLE_USER_HOME
67
zipStorePath=wrapper/dists

gradlew

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
# See the License for the specific language governing permissions and
1616
# limitations under the License.
1717
#
18+
# SPDX-License-Identifier: Apache-2.0
19+
#
1820

1921
##############################################################################
2022
#
@@ -55,7 +57,7 @@
5557
# Darwin, MinGW, and NonStop.
5658
#
5759
# (3) This script is generated from the Groovy template
58-
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
60+
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
5961
# within the Gradle project.
6062
#
6163
# You can find Gradle at https://github.com/gradle/gradle/.
@@ -83,10 +85,9 @@ done
8385
# This is normally unused
8486
# shellcheck disable=SC2034
8587
APP_BASE_NAME=${0##*/}
86-
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
87-
88-
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89-
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
88+
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
89+
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
90+
' "$PWD" ) || exit
9091

9192
# Use the maximum available, or set MAX_FD != -1 to use that value.
9293
MAX_FD=maximum
@@ -133,26 +134,29 @@ location of your Java installation."
133134
fi
134135
else
135136
JAVACMD=java
136-
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137+
if ! command -v java >/dev/null 2>&1
138+
then
139+
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137140
138141
Please set the JAVA_HOME variable in your environment to match the
139142
location of your Java installation."
143+
fi
140144
fi
141145

142146
# Increase the maximum file descriptors if we can.
143147
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144148
case $MAX_FD in #(
145149
max*)
146150
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
147-
# shellcheck disable=SC3045
151+
# shellcheck disable=SC2039,SC3045
148152
MAX_FD=$( ulimit -H -n ) ||
149153
warn "Could not query maximum file descriptor limit"
150154
esac
151155
case $MAX_FD in #(
152156
'' | soft) :;; #(
153157
*)
154158
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
155-
# shellcheck disable=SC3045
159+
# shellcheck disable=SC2039,SC3045
156160
ulimit -n "$MAX_FD" ||
157161
warn "Could not set maximum file descriptor limit to $MAX_FD"
158162
esac
@@ -197,11 +201,15 @@ if "$cygwin" || "$msys" ; then
197201
done
198202
fi
199203

200-
# Collect all arguments for the java command;
201-
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
202-
# shell script including quotes and variable substitutions, so put them in
203-
# double quotes to make sure that they get re-expanded; and
204-
# * put everything else in single quotes, so that it's not re-expanded.
204+
205+
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
206+
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
207+
208+
# Collect all arguments for the java command:
209+
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
210+
# and any embedded shellness will be escaped.
211+
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
212+
# treated as '${Hostname}' itself on the command line.
205213

206214
set -- \
207215
"-Dorg.gradle.appname=$APP_BASE_NAME" \

gradlew.bat

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
@rem See the License for the specific language governing permissions and
1414
@rem limitations under the License.
1515
@rem
16+
@rem SPDX-License-Identifier: Apache-2.0
17+
@rem
1618

1719
@if "%DEBUG%"=="" @echo off
1820
@rem ##########################################################################
@@ -43,11 +45,11 @@ set JAVA_EXE=java.exe
4345
%JAVA_EXE% -version >NUL 2>&1
4446
if %ERRORLEVEL% equ 0 goto execute
4547

46-
echo.
47-
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
48-
echo.
49-
echo Please set the JAVA_HOME variable in your environment to match the
50-
echo location of your Java installation.
48+
echo. 1>&2
49+
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
50+
echo. 1>&2
51+
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
52+
echo location of your Java installation. 1>&2
5153

5254
goto fail
5355

@@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
5759

5860
if exist "%JAVA_EXE%" goto execute
5961

60-
echo.
61-
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
62-
echo.
63-
echo Please set the JAVA_HOME variable in your environment to match the
64-
echo location of your Java installation.
62+
echo. 1>&2
63+
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
64+
echo. 1>&2
65+
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
66+
echo location of your Java installation. 1>&2
6567

6668
goto fail
6769

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package com.webileapps.safeguard;
2+
3+
import android.util.Log;
4+
5+
import java.io.BufferedReader;
6+
import java.io.File;
7+
import java.io.InputStreamReader;
8+
import java.util.Arrays;
9+
import java.util.List;
10+
11+
public class FridaDetection {
12+
13+
public boolean detectFridaServer() {
14+
List<String> suspiciousProcesses = Arrays.asList("frida", "gum-js-loop", "frida-agent", "frida-server");
15+
16+
try {
17+
File[] files = new File("/proc").listFiles();
18+
if (files == null) return false;
19+
20+
for (File file : files) {
21+
if (file.getName().matches("\\d+")) { // Check only PID directories
22+
String cmdline = new String(java.nio.file.Files.readAllBytes(new File("/proc/" + file.getName() + "/cmdline").toPath()));
23+
for (String suspiciousProcess : suspiciousProcesses) {
24+
if (cmdline.contains(suspiciousProcess)) {
25+
Log.e("Security", "Frida detected: " + cmdline);
26+
return true;
27+
}
28+
}
29+
}
30+
}
31+
return false;
32+
} catch (Exception e) {
33+
e.printStackTrace();
34+
return false;
35+
}
36+
}
37+
38+
public boolean detectFridaPort() {
39+
try {
40+
Process process = Runtime.getRuntime().exec("netstat -an");
41+
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
42+
return reader.lines().anyMatch(line -> line.contains("27042") || line.contains("frida"));
43+
} catch (Exception e) {
44+
e.printStackTrace();
45+
return false;
46+
}
47+
}
48+
49+
public boolean detectFridaLibrary() {
50+
try {
51+
String maps = new String(java.nio.file.Files.readAllBytes(new File("/proc/self/maps").toPath()));
52+
if (maps.contains("frida") || maps.contains("gum-js")) {
53+
Log.e("Security", "Frida detected in memory!");
54+
return true;
55+
}
56+
return false;
57+
} catch (Exception e) {
58+
e.printStackTrace();
59+
return false;
60+
}
61+
}
62+
63+
public boolean detectFridaTracer() {
64+
try {
65+
List<String> statusLines = java.nio.file.Files.readAllLines(new File("/proc/self/status").toPath());
66+
for (String line : statusLines) {
67+
if (line.startsWith("TracerPid")) {
68+
int tracerPid = Integer.parseInt(line.split("\t")[1].trim());
69+
return tracerPid > 0;
70+
}
71+
}
72+
return false;
73+
} catch (Exception e) {
74+
e.printStackTrace();
75+
return false;
76+
}
77+
}
78+
79+
public boolean detectFridaDebugging() {
80+
boolean fridaServer = detectFridaServer();
81+
boolean fridaPort = detectFridaPort();
82+
boolean fridaLibrary = detectFridaLibrary();
83+
boolean fridaTracer = detectFridaTracer();
84+
85+
boolean detected = fridaServer || fridaPort || fridaLibrary || fridaTracer;
86+
Log.e("Security>>>", "Frida detection result: Server=" + fridaServer + ", Port=" + fridaPort + ", Library=" + fridaLibrary + ", Tracer=" + fridaTracer);
87+
88+
return detected;
89+
}
90+
}

protect/src/main/java/com/webileapps/safeguard/SecurityChecker.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.webileapps.safeguard;
22

33
import android.Manifest;
4+
import android.app.ActivityManager;
45
import android.app.AlertDialog;
56
import android.content.Context;
67
import android.content.pm.PackageManager;
@@ -12,6 +13,8 @@
1213
import android.net.NetworkRequest;
1314
import android.net.LinkProperties;
1415
import android.os.Build;
16+
import android.os.Handler;
17+
import android.os.Looper;
1518
import android.provider.Settings;
1619
import android.telephony.PhoneStateListener;
1720
import android.telephony.TelephonyCallback;
@@ -45,6 +48,7 @@ public class SecurityChecker {
4548
private ComponentActivity activity;
4649
private Runnable permissionGrantedCallback;
4750
private ActivityResultLauncher<String> permissionLauncher;
51+
private Handler handler = new Handler(Looper.getMainLooper());
4852

4953
public static class SecurityConfig {
5054
private final SecurityCheckState rootCheck;
@@ -755,4 +759,29 @@ public void checkFileIntegrity(String filePath, String expectedChecksum) {
755759
Log.e("ChecksumValidation", "File does not exist: " + filePath);
756760
}
757761
}
762+
763+
public void startFridaDetection(){
764+
765+
handler.post(new Runnable() {
766+
@Override
767+
public void run() {
768+
FridaDetection fridaDetection = new FridaDetection();
769+
if(fridaDetection.detectFridaDebugging()){
770+
exitApp();
771+
}
772+
handler.postDelayed(this,5000);
773+
}
774+
});
775+
}
776+
777+
public void exitApp(){
778+
ActivityManager activityManager= (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
779+
if (activityManager != null) {
780+
for (ActivityManager.AppTask task : activityManager.getAppTasks()) {
781+
task.finishAndRemoveTask(); // Finish and remove each task
782+
}
783+
}
784+
System.exit(0);
785+
}
786+
758787
}

protect/src/main/java/com/webileapps/safeguard/SecurityConfigManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public class SecurityConfigManager {
99
public static void initialize(Context context, SecurityChecker.SecurityConfig configuration) {
1010
config = configuration;
1111
securityChecker = new SecurityChecker(context, configuration);
12+
new SecurityChecker(context).startFridaDetection();
1213
}
1314

1415
public static SecurityChecker getSecurityChecker() {

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ dependencyResolutionManagement {
1616
}
1717

1818
rootProject.name = "protect"
19-
include ':protect'
19+
include ':protect',':app'
2020
// include ':app'

0 commit comments

Comments
 (0)