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"/>