Skip to content

Commit 9e3d652

Browse files
authored
Merge pull request #68 from talsec/rc/17.0.0
freeRASP and dependencies updated
2 parents cee24ff + e51c32f commit 9e3d652

File tree

6 files changed

+90
-71
lines changed

6 files changed

+90
-71
lines changed

FreeRASPDemoApp/app/build.gradle

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ plugins {
66
android {
77
defaultConfig {
88
applicationId "com.aheaditec.talsec.demoapp"
9-
minSdk 23
10-
compileSdk 35
11-
targetSdk 35
9+
minSdkVersion 23
10+
compileSdkVersion 36
11+
targetSdkVersion 36
1212
versionCode 1
1313
versionName "1.0"
1414

@@ -36,11 +36,11 @@ android {
3636

3737
dependencies {
3838
// freeRASP SDK
39-
implementation 'com.aheaditec.talsec.security:TalsecSecurity-Community:16.0.1'
39+
implementation 'com.aheaditec.talsec.security:TalsecSecurity-Community:17.0.0'
4040

4141
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
42-
implementation 'androidx.core:core-ktx:1.12.0'
43-
implementation 'androidx.appcompat:appcompat:1.6.1'
44-
implementation 'com.google.android.material:material:1.11.0'
45-
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
42+
implementation 'androidx.core:core-ktx:1.17.0'
43+
implementation 'androidx.appcompat:appcompat:1.7.1'
44+
implementation 'com.google.android.material:material:1.13.0'
45+
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
4646
}

FreeRASPDemoApp/app/src/main/AndroidManifest.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,18 @@
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
package="com.aheaditec.talsec.demoapp">
44

5+
<!-- Optional for Screen Protection features -->
56
<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />
67
<uses-permission android:name="android.permission.DETECT_SCREEN_RECORDING" />
78

9+
<!-- Optional for location spoofing feature -->
10+
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
11+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
12+
13+
<!-- Optional for unsecure WiFi detection feature -->
14+
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
15+
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
16+
817
<application
918
android:name=".TalsecApplication"
1019
android:allowBackup="true"
Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,37 @@
11
package com.aheaditec.talsec.demoapp
22

3-
import androidx.appcompat.app.AppCompatActivity
3+
import android.Manifest
4+
import android.content.pm.PackageManager
45
import android.os.Bundle
6+
import androidx.appcompat.app.AppCompatActivity
7+
import androidx.core.app.ActivityCompat
8+
import androidx.core.content.ContextCompat
59

610
class MainActivity : AppCompatActivity() {
711

812
override fun onCreate(savedInstanceState: Bundle?) {
913
super.onCreate(savedInstanceState)
1014
setContentView(R.layout.activity_main)
15+
requestFineLocationPermission()
16+
}
17+
18+
private fun requestFineLocationPermission() {
19+
if (ContextCompat.checkSelfPermission(
20+
this,
21+
FINE_LOCATION_PERMISSION
22+
) != PackageManager.PERMISSION_GRANTED
23+
) {
24+
// Permission is not granted, request it
25+
ActivityCompat.requestPermissions(
26+
this,
27+
arrayOf(COARSE_LOCATION_PERMISSION, FINE_LOCATION_PERMISSION),
28+
100
29+
)
30+
}
31+
}
32+
33+
private companion object {
34+
private const val FINE_LOCATION_PERMISSION = Manifest.permission.ACCESS_FINE_LOCATION
35+
private const val COARSE_LOCATION_PERMISSION = Manifest.permission.ACCESS_COARSE_LOCATION
1136
}
1237
}

FreeRASPDemoApp/app/src/main/java/com/aheaditec/talsec/demoapp/TalsecApplication.kt

Lines changed: 45 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,15 @@ package com.aheaditec.talsec.demoapp
22

33
import android.app.Activity
44
import android.app.Application
5-
import android.os.Build
65
import android.os.Bundle
7-
import android.util.Log
8-
import android.view.WindowManager.SCREEN_RECORDING_STATE_VISIBLE
6+
import com.aheaditec.talsec_security.security.api.ScreenProtector
97
import com.aheaditec.talsec_security.security.api.SuspiciousAppInfo
108
import com.aheaditec.talsec_security.security.api.Talsec
119
import com.aheaditec.talsec_security.security.api.TalsecConfig
1210
import com.aheaditec.talsec_security.security.api.ThreatListener
13-
import java.util.function.Consumer
1411

1512
class TalsecApplication : Application(), ThreatListener.ThreatDetected {
1613

17-
private var currentActivity: Activity? = null
18-
private var screenCaptureCallback: Activity.ScreenCaptureCallback? = null
19-
private val screenRecordCallback: Consumer<Int> = Consumer<Int> { state ->
20-
if (state == SCREEN_RECORDING_STATE_VISIBLE) {
21-
Talsec.onScreenRecordingDetected()
22-
}
23-
}
24-
2514
override fun onCreate() {
2615
super.onCreate()
2716

@@ -35,68 +24,33 @@ class TalsecApplication : Application(), ThreatListener.ThreatDetected {
3524
.watcherMail(watcherMail)
3625
.supportedAlternativeStores(supportedAlternativeStores)
3726
.prod(isProd)
27+
.killOnBypass(true) // determines if the app should be killed within the SDK if the callbacks are hooked/modified by an attacker
3828
.build()
3929

40-
ThreatListener(this, deviceStateListener).registerListener(this)
30+
ThreatListener(this, deviceStateListener, raspExecutionStateListener).registerListener(this)
4131
Talsec.start(this, config)
4232

4333
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
4434
override fun onActivityCreated(activity: Activity, bundle: Bundle?) {
45-
46-
// Set to 'true' to block screen capture
4735
Talsec.blockScreenCapture(activity, false)
4836
}
4937

50-
override fun onActivityStarted(activity: Activity) {
51-
unregisterCallbacks()
52-
currentActivity = activity
53-
registerCallbacks(activity)
54-
}
55-
56-
override fun onActivityResumed(activity: Activity) {}
57-
override fun onActivityPaused(activity: Activity) {}
38+
override fun onActivityStarted(activity: Activity) {}
5839

59-
override fun onActivityStopped(activity: Activity) {
60-
if (activity == currentActivity) {
61-
unregisterCallbacks()
62-
currentActivity = null
63-
}
40+
override fun onActivityResumed(activity: Activity) {
41+
ScreenProtector.INSTANCE.registerScreenCallbacks(activity)
6442
}
6543

66-
override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {}
67-
override fun onActivityDestroyed(activity: Activity) {}
68-
})
69-
}
70-
71-
private fun registerCallbacks(activity: Activity) {
72-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
73-
screenCaptureCallback = Activity.ScreenCaptureCallback {
74-
Talsec.onScreenshotDetected()
44+
override fun onActivityPaused(activity: Activity) {
45+
ScreenProtector.INSTANCE.unregisterScreenCallbacks(activity)
7546
}
76-
activity.registerScreenCaptureCallback(
77-
baseContext.mainExecutor, screenCaptureCallback!!
78-
)
79-
}
8047

81-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
82-
val initialState = activity.windowManager.addScreenRecordingCallback(
83-
mainExecutor, screenRecordCallback
84-
)
85-
screenRecordCallback.accept(initialState)
86-
}
87-
}
48+
override fun onActivityStopped(activity: Activity) {}
8849

89-
private fun unregisterCallbacks() {
90-
currentActivity?.let { activity ->
91-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && screenCaptureCallback != null) {
92-
activity.unregisterScreenCaptureCallback(screenCaptureCallback!!)
93-
screenCaptureCallback = null
94-
}
50+
override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {}
9551

96-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {
97-
activity.windowManager.removeScreenRecordingCallback(screenRecordCallback)
98-
}
99-
}
52+
override fun onActivityDestroyed(activity: Activity) {}
53+
})
10054
}
10155

10256
override fun onRootDetected() {
@@ -143,23 +97,44 @@ class TalsecApplication : Application(), ThreatListener.ThreatDetected {
14397
println("onObfuscationIssuesDetected")
14498
}
14599

146-
override fun onMalwareDetected(p0: MutableList<SuspiciousAppInfo>?) {
100+
override fun onMalwareDetected(suspiciousApps: List<SuspiciousAppInfo>) {
147101
// Set your reaction
148102
println("onMalwareDetected")
103+
suspiciousApps.forEach {
104+
println("Suspicious app: ${it.packageInfo.packageName}, reason: ${it.reason}")
105+
}
149106
}
150107

151108
override fun onScreenshotDetected() {
109+
// Set your reaction
152110
println("onScreenshotDetected")
153111
}
154112

155113
override fun onScreenRecordingDetected() {
114+
// Set your reaction
156115
println("onScreenRecordingDetected")
157116
}
158117

159118
override fun onMultiInstanceDetected() {
119+
// Set your reaction
160120
println("onMultiInstanceDetected")
161121
}
162122

123+
override fun onUnsecureWifiDetected() {
124+
// Set your reaction
125+
println("onUnsecureWifiDetected")
126+
}
127+
128+
override fun onTimeSpoofingDetected() {
129+
// Set your reaction
130+
println("onTimeSpoofingDetected")
131+
}
132+
133+
override fun onLocationSpoofingDetected() {
134+
// Set your reaction
135+
println("onLocationSpoofingDetected")
136+
}
137+
163138
// This is optional. Use only if you are interested in device state information like device lock and HW backed keystore state
164139
private val deviceStateListener = object : ThreatListener.DeviceState {
165140
override fun onUnlockedDeviceDetected() {
@@ -173,18 +148,28 @@ class TalsecApplication : Application(), ThreatListener.ThreatDetected {
173148
}
174149

175150
override fun onDeveloperModeDetected() {
151+
// Set your reaction
176152
println("onDeveloperModeDetected")
177153
}
178154

179155
override fun onADBEnabledDetected() {
156+
// Set your reaction
180157
println("onADBEnabledDetected")
181158
}
182159

183160
override fun onSystemVPNDetected() {
161+
// Set your reaction
184162
println("onSystemVPNDetected")
185163
}
186164
}
187165

166+
// This is optional. Use only if you are interested in RASP execution state information
167+
private val raspExecutionStateListener = object : ThreatListener.RaspExecutionState() {
168+
override fun onAllChecksFinished() {
169+
println("onAllChecksFinished")
170+
}
171+
}
172+
188173
companion object {
189174
private const val expectedPackageName = "com.aheaditec.talsec.demoapp" // Don't use Context.getPackageName!
190175
private val expectedSigningCertificateHashBase64 = arrayOf(
@@ -196,6 +181,6 @@ class TalsecApplication : Application(), ThreatListener.ThreatDetected {
196181
// Google Play Store and Huawei AppGallery are supported out of the box, you can pass empty array or null or add other stores like the Samsung's one:
197182
"com.sec.android.app.samsungapps" // Samsung Store
198183
)
199-
private val isProd = true
184+
private const val isProd = true
200185
}
201186
}

FreeRASPDemoApp/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ buildscript {
66
mavenCentral()
77
}
88
dependencies {
9-
classpath "com.android.tools.build:gradle:8.7.3"
9+
classpath 'com.android.tools.build:gradle:8.13.0'
1010
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
1111

1212
// NOTE: Do not place your application dependencies here; they belong
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

0 commit comments

Comments
 (0)