From b18f05abf941450f53cc2e2f98549f06ce256b70 Mon Sep 17 00:00:00 2001 From: kai-city <1830170041@qq.com> Date: Mon, 24 May 2021 22:07:07 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=8B=A5=E6=90=9C=E7=B4=A2=E6=A1=86=E4=B8=BA?= =?UTF-8?q?=E6=89=93=E5=BC=80=E7=8A=B6=E6=80=81=EF=BC=8C=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=97=B6=E4=BC=9A=E6=94=B6=E8=B5=B7=202.?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=AF=E5=8A=A8=E5=9B=BE=203.=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E4=BA=86=E8=AF=BB=E5=86=99=E6=96=87=E4=BB=B6=E6=9D=83?= =?UTF-8?q?=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackbox/proxy/ProxyActivity.java | 13 +- app/src/main/AndroidManifest.xml | 6 +- .../blackdex/view/base/WelcomeActivity.kt | 19 +++ .../blackdex/view/main/MainActivity.kt | 115 +++++++++++++++--- 4 files changed, 128 insertions(+), 25 deletions(-) create mode 100644 app/src/main/java/top/niunaijun/blackdex/view/base/WelcomeActivity.kt diff --git a/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyActivity.java b/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyActivity.java index 4771715..474ebf3 100644 --- a/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyActivity.java +++ b/Bcore/src/main/java/top/niunaijun/blackbox/proxy/ProxyActivity.java @@ -3,15 +3,9 @@ package top.niunaijun.blackbox.proxy; import android.app.Activity; import android.os.Bundle; import android.os.Process; -import android.util.Log; import androidx.annotation.Nullable; -import top.niunaijun.blackbox.app.BActivityThread; -import top.niunaijun.blackbox.fake.hook.HookManager; -import top.niunaijun.blackbox.fake.service.HCallbackProxy; -import top.niunaijun.blackbox.proxy.record.ProxyActivityRecord; - /** * Created by Milk on 3/28/21. * * ∧_∧ @@ -29,6 +23,12 @@ public class ProxyActivity extends Activity { finish(); } + @Override + protected void onDestroy() { + super.onDestroy(); + Process.killProcess(Process.myPid()); + } + public static class P0 extends ProxyActivity { } @@ -428,4 +428,5 @@ public class ProxyActivity extends Activity { public static class P99 extends ProxyActivity { } + } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6ffc0f3..8b73796 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,10 +11,12 @@ android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" - android:name="top.niunaijun.blackdex.App" + android:name=".App" android:supportsRtl="true" android:theme="@style/Theme.BlackDex"> - + + diff --git a/app/src/main/java/top/niunaijun/blackdex/view/base/WelcomeActivity.kt b/app/src/main/java/top/niunaijun/blackdex/view/base/WelcomeActivity.kt new file mode 100644 index 0000000..3c5d14f --- /dev/null +++ b/app/src/main/java/top/niunaijun/blackdex/view/base/WelcomeActivity.kt @@ -0,0 +1,19 @@ +package top.niunaijun.blackdex.view.base + +import android.content.Intent +import android.os.Bundle +import top.niunaijun.blackdex.view.main.MainActivity + +/** + * + * @Description: + * @Author: wukaicheng + * @CreateDate: 2021/5/24 21:49 + */ +class WelcomeActivity : BaseActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val intent = Intent(this, MainActivity::class.java) + startActivity(intent) + } +} \ No newline at end of file diff --git a/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt b/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt index 748bad7..c7752d9 100644 --- a/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt +++ b/app/src/main/java/top/niunaijun/blackdex/view/main/MainActivity.kt @@ -1,11 +1,17 @@ package top.niunaijun.blackdex.view.main +import android.Manifest import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri +import android.os.Build import android.os.Bundle +import android.provider.Settings import android.view.Menu import android.view.MenuItem +import android.view.inputmethod.InputMethodManager import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.RequiresApi import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.LinearLayoutManager import com.afollestad.materialdialogs.MaterialDialog @@ -14,6 +20,7 @@ import com.roger.catloadinglibrary.CatLoadingView import top.niunaijun.blackbox.BlackDexCore import top.niunaijun.blackbox.core.system.dump.IBDumpMonitor import top.niunaijun.blackbox.entity.dump.DumpResult +import top.niunaijun.blackbox.utils.compat.BuildCompat import top.niunaijun.blackdex.R import top.niunaijun.blackdex.data.entity.AppInfo import top.niunaijun.blackdex.data.entity.DumpInfo @@ -48,6 +55,7 @@ class MainActivity : BaseActivity() { initSearchView() BlackDexCore.get().registerDumpMonitor(mMonitor) + } private fun initView() { @@ -56,6 +64,11 @@ class MainActivity : BaseActivity() { viewBinding.recyclerView.layoutManager = LinearLayoutManager(this) mAdapter.setOnItemClick { _, _, data -> + if (viewBinding.searchView.isSearchOpen) { + viewBinding.searchView.closeSearch() + filterApp("") + } + hideKeyboard() viewModel.startDexDump(data.packageName) } @@ -65,10 +78,10 @@ class MainActivity : BaseActivity() { } private fun initViewModel() { - viewModel = ViewModelProvider(this, InjectionUtil.getMainFactory()).get(MainViewModel::class.java) - viewModel.getAppList() - + viewModel = + ViewModelProvider(this, InjectionUtil.getMainFactory()).get(MainViewModel::class.java) viewBinding.stateView.showLoading() + viewModel.getAppList() viewModel.mAppListLiveData.observe(this) { it?.let { @@ -94,8 +107,11 @@ class MainActivity : BaseActivity() { MaterialDialog(this).show { title(text = "脱壳失败") message(text = "未知错误,可前往GitHub(https://github.com/CodingGay/BlackDex)提Issue") - negativeButton(text = "Github"){ - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/CodingGay/BlackDex/issues")) + negativeButton(text = "Github") { + val intent = Intent( + Intent.ACTION_VIEW, + Uri.parse("https://github.com/CodingGay/BlackDex/issues") + ) startActivity(intent) } positiveButton(text = "确定") @@ -122,14 +138,24 @@ class MainActivity : BaseActivity() { } } - private val mMonitor = object: IBDumpMonitor.Stub(){ + private val mMonitor = object : IBDumpMonitor.Stub() { override fun onDump(result: DumpResult?) { result?.let { - if(result.success){ - viewModel.mDexDumpLiveData.postValue(DumpInfo(DumpInfo.SUCCESS,"DEX文件储存在:${result.dir}")) - }else{ + if (result.success) { + viewModel.mDexDumpLiveData.postValue( + DumpInfo( + DumpInfo.SUCCESS, + "DEX文件储存在:${result.dir}" + ) + ) + } else { - viewModel.mDexDumpLiveData.postValue(DumpInfo(DumpInfo.FAIL,"错误原因:${result.msg}")) + viewModel.mDexDumpLiveData.postValue( + DumpInfo( + DumpInfo.FAIL, + "错误原因:${result.msg}" + ) + ) } } } @@ -138,7 +164,8 @@ class MainActivity : BaseActivity() { private fun initSearchView() { - viewBinding.searchView.setOnQueryTextListener(object : SimpleSearchView.OnQueryTextListener { + viewBinding.searchView.setOnQueryTextListener(object : + SimpleSearchView.OnQueryTextListener { override fun onQueryTextChange(newText: String): Boolean { filterApp(newText) return true @@ -171,17 +198,70 @@ class MainActivity : BaseActivity() { LoadingUtil.showLoading(loadingView, supportFragmentManager) } + private fun hideKeyboard() { + val imm: InputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager + window.peekDecorView()?.run { + imm.hideSoftInputFromWindow(windowToken, 0) + } + } - private val openDocumentedResult = registerForActivityResult(ActivityResultContracts.GetContent()) { - it?.run { - viewModel.startDexDump(it.toString()) + private fun requestStoragePermission() { + if (BuildCompat.isM() && checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_DENIED) { + requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE) } } + private val openDocumentedResult = + registerForActivityResult(ActivityResultContracts.GetContent()) { + it?.run { + viewModel.startDexDump(it.toString()) + } + } + + @RequiresApi(Build.VERSION_CODES.M) + private val requestPermissionLauncher = + registerForActivityResult(ActivityResultContracts.RequestPermission()) { + if (!it) { + MaterialDialog(this).show { + title(text = "申请失败") + message(text = "请授予我们读写本地文件权限,否则软件将无法正常运行。") + + if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { + + positiveButton(text = "再次申请") { + requestStoragePermission() + } + + } else { + + positiveButton(text = "手动授予") { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + val uri = Uri.fromParts("package", packageName, null) + intent.data = uri + try { + startActivity(intent) + } catch (e: Exception) { + e.printStackTrace() + } + } + } + negativeButton(text = "退出软件") { + finish() + } + } + } + } + + + override fun onStart() { + super.onStart() + requestStoragePermission() + } override fun onBackPressed() { if (viewBinding.searchView.isSearchOpen) { viewBinding.searchView.closeSearch() + filterApp("") } else { super.onBackPressed() } @@ -198,9 +278,10 @@ class MainActivity : BaseActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { - when(item.itemId){ - R.id.main_git->{ - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/CodingGay/BlackDex")) + when (item.itemId) { + R.id.main_git -> { + val intent = + Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/CodingGay/BlackDex")) startActivity(intent) } }