diff --git a/nhterm/build.gradle b/nhterm/build.gradle index 9ebe5b6..d331904 100644 --- a/nhterm/build.gradle +++ b/nhterm/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.offsec.nhterm" minSdkVersion rootProject.ext.android.MIN_SDK_VERSION targetSdkVersion rootProject.ext.android.TARGET_SDK_VERSION - versionCode 20231 - versionName "2023.1-dev" + versionCode 20232 + versionName "2023.2-dev" testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner' resConfigs 'zh-rCN', 'zh-rTW' externalNativeBuild { diff --git a/nhterm/src/main/AndroidManifest.xml b/nhterm/src/main/AndroidManifest.xml index b3e545a..281768b 100644 --- a/nhterm/src/main/AndroidManifest.xml +++ b/nhterm/src/main/AndroidManifest.xml @@ -51,7 +51,6 @@ android:exported="true"> - diff --git a/nhterm/src/main/java/com/offsec/nhterm/services/NeoTermService.kt b/nhterm/src/main/java/com/offsec/nhterm/services/NeoTermService.kt index 947abc7..96709b7 100644 --- a/nhterm/src/main/java/com/offsec/nhterm/services/NeoTermService.kt +++ b/nhterm/src/main/java/com/offsec/nhterm/services/NeoTermService.kt @@ -13,12 +13,20 @@ import androidx.core.app.NotificationCompat import com.offsec.nhterm.R import com.offsec.nhterm.backend.EmulatorDebug import com.offsec.nhterm.backend.TerminalSession +import com.offsec.nhterm.component.config.NeoTermPath import com.offsec.nhterm.component.session.ShellParameter import com.offsec.nhterm.component.session.XParameter import com.offsec.nhterm.component.session.XSession +import com.offsec.nhterm.setup.SetupHelper +import com.offsec.nhterm.ui.other.AboutActivity import com.offsec.nhterm.ui.term.NeoTermActivity import com.offsec.nhterm.utils.NLog import com.offsec.nhterm.utils.Terminals +import com.offsec.nhterm.utils.extractAssetsDir +import java.io.BufferedReader +import java.io.File +import java.io.InputStreamReader +import java.lang.Process import java.util.concurrent.Executors import java.util.concurrent.ScheduledExecutorService @@ -40,6 +48,13 @@ class NeoTermService : Service() { override fun onCreate() { super.onCreate() + + // Check whather we need to populate initial boot scripts or not + // By simply checking */usr folder of ours + if (!checkPrefix()) { + resetApp() + } + createNotificationChannel() startForeground(NOTIFICATION_ID, createNotification()) } @@ -48,6 +63,39 @@ class NeoTermService : Service() { return serviceBinder } + fun resetApp() { + // Manual way of resetting required assets + Runtime.getRuntime().exec("mkdir -p "+" "+"/data/data/com.offsec.nhterm/files/usr/").waitFor() + Executer("/system/bin/rm -rf /data/data/com.offsec.nhterm/files/usr/bin") + Thread.sleep(1200) + extractAssetsDir("bin", "/data/data/com.offsec.nhterm/files/usr/bin/") + Thread.sleep(800) + Executer("/system/bin/chmod +x /data/data/com.offsec.nhterm/files/usr/bin/bash") // Static bash for arm ( works for *64 too ) + Executer("/system/bin/chmod +x /data/data/com.offsec.nhterm/files/usr/bin/kali") // Kali chroot scriptlet + Executer("/system/bin/chmod +x /data/data/com.offsec.nhterm/files/usr/bin/android-su") // Android su scriptlet + } + + fun Executer(command: String?): String? { + val output = StringBuilder() + val p: Process + try { + p = Runtime.getRuntime().exec(command) + p.waitFor() + val reader = BufferedReader(InputStreamReader(p.inputStream)) + var line: String? + while (reader.readLine().also { line = it } != null) { + output.append(line).append('\n') + } + } catch (e: Exception) { + e.printStackTrace() + } + return output.toString() + } + fun checkPrefix(): Boolean { + val PREFIX_FILE = File(NeoTermPath.USR_PATH) + return !PREFIX_FILE.isDirectory + } + override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { val action = intent.action when (action) { diff --git a/nhterm/src/main/java/com/offsec/nhterm/ui/other/AboutActivity.kt b/nhterm/src/main/java/com/offsec/nhterm/ui/other/AboutActivity.kt index 73ce5ed..3704080 100644 --- a/nhterm/src/main/java/com/offsec/nhterm/ui/other/AboutActivity.kt +++ b/nhterm/src/main/java/com/offsec/nhterm/ui/other/AboutActivity.kt @@ -181,7 +181,7 @@ class AboutActivity : AppCompatActivity() { .show() } - private fun resetApp() { + fun resetApp() { // Manual way of resetting required assets Runtime.getRuntime().exec("mkdir -p "+" "+"/data/data/com.offsec.nhterm/files/usr/").waitFor() Executer("/system/bin/rm -rf /data/data/com.offsec.nhterm/files/usr/bin") diff --git a/nhterm/src/main/res/layout/ui_about.xml b/nhterm/src/main/res/layout/ui_about.xml index 3ff53cd..4f85c32 100644 --- a/nhterm/src/main/res/layout/ui_about.xml +++ b/nhterm/src/main/res/layout/ui_about.xml @@ -60,6 +60,9 @@ android:paddingLeft="16dp" android:paddingRight="16dp" android:text="@string/app_name" + android:textSize="22sp" + android:autoSizeMaxTextSize="22sp" + android:autoSizeMinTextSize="18sp" android:textAppearance="@style/TextAppearance.AppCompat.Headline"/>