├── .gitignore ├── .gradle ├── 7.4 │ ├── checksums │ │ ├── checksums.lock │ │ ├── md5-checksums.bin │ │ └── sha1-checksums.bin │ ├── dependencies-accessors │ │ ├── dependencies-accessors.lock │ │ └── gc.properties │ ├── executionHistory │ │ └── executionHistory.lock │ ├── fileChanges │ │ └── last-build.bin │ ├── fileHashes │ │ └── fileHashes.lock │ └── gc.properties ├── buildOutputCleanup │ ├── buildOutputCleanup.lock │ └── cache.properties └── vcs-1 │ └── gc.properties ├── .project ├── README.md ├── app ├── .classpath ├── .gitignore ├── .project ├── .settings │ └── org.eclipse.buildship.core.prefs ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── ss │ │ └── colytitse │ │ └── fuckdmzj │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── xposed_info │ │ └── xposed_init │ ├── java │ │ └── ss │ │ │ └── colytitse │ │ │ └── fuckdmzj │ │ │ ├── MainActivity.java │ │ │ ├── MainHook.java │ │ │ ├── TestActivity.java │ │ │ ├── atsg │ │ │ ├── AutoSign.java │ │ │ ├── OkHttp.java │ │ │ └── UserInfo.java │ │ │ ├── gdhd │ │ │ ├── FilterKamiGakusi.java │ │ │ ├── ReplaceActivity.java │ │ │ └── dmzj │ │ │ │ ├── Chapter.java │ │ │ │ └── ComicDescription.java │ │ │ ├── hook │ │ │ ├── AdLayout.java │ │ │ ├── AdService.java │ │ │ ├── MethodHook.java │ │ │ └── Others.java │ │ │ ├── test │ │ │ ├── PublicContent.java │ │ │ └── printStackTrace.java │ │ │ └── tool │ │ │ ├── Base64Util.java │ │ │ ├── OkHttp.java │ │ │ └── RSAUtils.java │ └── res │ │ ├── drawable │ │ ├── img_icon_clock.png │ │ ├── img_icon_head.png │ │ ├── img_icon_tag.png │ │ ├── img_lauch_bitch.png │ │ ├── img_layout_neko.jpg │ │ ├── info_background_1.xml │ │ ├── info_background_2.xml │ │ ├── kyaru.png │ │ ├── main_background.xml │ │ ├── main_icon.png │ │ ├── sc_background.xml │ │ └── task_bg1.png │ │ ├── layout │ │ ├── main_layout.xml │ │ └── test_layout.xml │ │ ├── mipmap-hdpi │ │ └── fk_icon.png │ │ ├── mipmap-mdpi │ │ └── fk_icon.png │ │ ├── mipmap-xhdpi │ │ └── fk_icon.png │ │ ├── mipmap-xxhdpi │ │ └── fk_icon.png │ │ ├── mipmap-xxxhdpi │ │ └── fk_icon.png │ │ ├── values-night │ │ └── colors.xml │ │ └── values │ │ ├── colors.xml │ │ ├── settings.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── ss │ └── colytitse │ └── fuckdmzj │ ├── Base64Util.java │ ├── ExampleUnitTest.java │ └── RSAUtils.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── image0.png ├── image1.png ├── local.properties └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .gradle/7.0.2/fileHashes/resourceHashesCache.bin 3 | -------------------------------------------------------------------------------- /.gradle/7.4/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/checksums/checksums.lock -------------------------------------------------------------------------------- /.gradle/7.4/checksums/md5-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/checksums/md5-checksums.bin -------------------------------------------------------------------------------- /.gradle/7.4/checksums/sha1-checksums.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/checksums/sha1-checksums.bin -------------------------------------------------------------------------------- /.gradle/7.4/dependencies-accessors/dependencies-accessors.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock -------------------------------------------------------------------------------- /.gradle/7.4/dependencies-accessors/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/dependencies-accessors/gc.properties -------------------------------------------------------------------------------- /.gradle/7.4/executionHistory/executionHistory.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/executionHistory/executionHistory.lock -------------------------------------------------------------------------------- /.gradle/7.4/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/7.4/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/7.4/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/7.4/gc.properties -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Tue Nov 15 10:23:04 CST 2022 2 | gradle.version=7.4 3 | -------------------------------------------------------------------------------- /.gradle/vcs-1/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/.gradle/vcs-1/gc.properties -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | FuckDMZJ 4 | Project FuckDMZJ created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.buildship.core.gradleprojectbuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.buildship.core.gradleprojectnature 16 | 17 | 18 | 19 | 1668479001529 20 | 21 | 30 22 | 23 | org.eclipse.core.resources.regexFilterMatcher 24 | node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FuckDMZJXposed | 去他妈的DM之家 (已停止维护) 2 | ## 至于为什么不更新了呢?
原因很简单,那就是新版的dex采用动态混稀,每次更新的关键代码位置可能都不一样,都要重新找一次位置,维护成本极大。 3 | 4 | ![Image text](https://github.com/cokkeijigen/FuckDMZJ/blob/master/image0.png)
5 | ![Image text](https://github.com/cokkeijigen/FuckDMZJ/blob/master/image1.png)
6 | -------------------------------------------------------------------------------- /app/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | app 4 | Project app created by Buildship. 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | org.eclipse.buildship.core.gradleprojectbuilder 15 | 16 | 17 | 18 | 19 | 20 | org.eclipse.jdt.core.javanature 21 | org.eclipse.buildship.core.gradleprojectnature 22 | 23 | 24 | 25 | 1668479001551 26 | 27 | 30 28 | 29 | org.eclipse.core.resources.regexFilterMatcher 30 | node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /app/.settings/org.eclipse.buildship.core.prefs: -------------------------------------------------------------------------------- 1 | connection.project.dir=.. 2 | eclipse.preferences.version=1 3 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | android { 6 | compileSdk 31 7 | defaultConfig { 8 | applicationId "ss.colytitse.fuckdmzj" 9 | minSdk 20 10 | //noinspection OldTargetApi 11 | targetSdk 31 12 | versionCode 1987 13 | versionName "v1.1.9-4" 14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 15 | } 16 | 17 | android.applicationVariants.all { 18 | variant -> variant.outputs.all { 19 | outputFileName = /* apk命名方式:名称_版本_编译时间 */ 20 | "FuckDMZJ_${variant.versionName}_${new Date().format("HHmmss", TimeZone.getTimeZone("GMT+8"))}.apk" 21 | } 22 | } 23 | 24 | buildTypes { 25 | release { 26 | minifyEnabled false 27 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 28 | } 29 | } 30 | compileOptions { 31 | sourceCompatibility JavaVersion.VERSION_1_8 32 | targetCompatibility JavaVersion.VERSION_1_8 33 | } 34 | } 35 | 36 | dependencies { 37 | implementation 'org.jetbrains:annotations:15.0' 38 | implementation 'com.google.android.gms:play-services-basement:18.1.0' 39 | testImplementation 'junit:junit:4.13.2' 40 | compileOnly 'de.robv.android.xposed:api:82' 41 | implementation 'com.google.android.material:material:1.6.1' 42 | 43 | // implementation 'com.squareup.okhttp3:okhttp:3.10.0' 44 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/ss/colytitse/fuckdmzj/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("ss.colytitse.fuckdmzj", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 14 | 17 | 20 | 23 | 26 | 27 | 29 | 30 | 31 | 32 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/src/main/assets/xposed_info: -------------------------------------------------------------------------------- 1 | 1.优化部分界面的显示 2 | 2.去除更新检测 3 | 3.去除部分广告 4 | 4.阻止强○剪切板 5 | 5.去除青少年提示 6 | 6.每日自动签到 7 | 7.自动领取任务奖励 8 | ......< -------------------------------------------------------------------------------- /app/src/main/assets/xposed_init: -------------------------------------------------------------------------------- 1 | ss.colytitse.fuckdmzj.MainHook -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/MainActivity.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj; 2 | 3 | import static ss.colytitse.fuckdmzj.test.PublicContent.*; 4 | import static ss.colytitse.fuckdmzj.MainHook.*; 5 | import android.annotation.SuppressLint; 6 | import android.app.Activity; 7 | import android.content.Intent; 8 | import android.content.pm.PackageInfo; 9 | import android.content.pm.PackageManager; 10 | import android.net.Uri; 11 | import android.os.Bundle; 12 | import android.util.Log; 13 | import android.view.View; 14 | import android.view.Window; 15 | import android.widget.TextView; 16 | import androidx.annotation.Nullable; 17 | import androidx.core.content.ContextCompat; 18 | import java.io.BufferedReader; 19 | import java.io.InputStream; 20 | import java.io.InputStreamReader; 21 | import java.util.HashMap; 22 | import java.util.Objects; 23 | 24 | public class MainActivity extends Activity { 25 | 26 | // 获取当前版本 27 | public String getVersionName() { 28 | try { 29 | PackageManager packageManager = getPackageManager(); 30 | PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0); 31 | return String.format("%s(%s)", packageInfo.versionName, packageInfo.versionCode); 32 | } catch (Exception e) { 33 | Log.d(TAG, "getVersionName: err-> " + e); 34 | return null; 35 | } 36 | } 37 | 38 | @Override @SuppressLint({"SetTextI18n", "NewApi"}) 39 | protected void onCreate(@Nullable Bundle savedInstanceState) { 40 | super.onCreate(savedInstanceState); 41 | setContentView(R.layout.main_layout); 42 | { // 设置状态栏样式 43 | Window thisWindow = this.getWindow(); 44 | if(this.getResources().getConfiguration().uiMode == 0x11) 45 | thisWindow.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 46 | thisWindow.setStatusBarColor(ContextCompat.getColor(this, R.color.statusBarColor)); 47 | } 48 | { // 设置模块信息内容 49 | TextView AppVersionName = findViewById(R.id.version_name); 50 | AppVersionName.setText(String.format((String) AppVersionName.getText(), getVersionName())); 51 | TextView SupportItems = findViewById(R.id.support_items); 52 | try { 53 | InputStream inputStream = this.getAssets().open("xposed_info"); 54 | BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 55 | String temp; StringBuilder ContentText = new StringBuilder(); 56 | while ((temp = bufferedReader.readLine()) != null) ContentText.append(String.format(" %s\n",temp)); 57 | SupportItems.setText(String.format((String) SupportItems.getText(), ContentText.toString().replace("<\n",""))); 58 | } catch (Exception e) { 59 | Log.d(TAG, "setSupportItems: err - >" + e); 60 | } 61 | } 62 | { // 设置已安装状态 63 | HashMap dmzj = new HashMap<>(); 64 | getPackageManager().getInstalledPackages(0).stream() 65 | .filter(e -> (e.packageName.equals(DMZJ_PKGN) || e.packageName.equals(DMZJSQ_PKGN))) 66 | .forEach(e -> dmzj.put(e.packageName, e.versionName)); 67 | TextView isInstall = findViewById(R.id.dmzjinstall); 68 | String text = (String) isInstall.getText(); 69 | if (dmzj.size() == 2) 70 | text = String.format(text, String.format("普通版(v%s) & 社区版(v%s)", dmzj.get(DMZJ_PKGN) , dmzj.get(DMZJSQ_PKGN))); 71 | else if (dmzj.get(DMZJ_PKGN) != null) 72 | text = String.format(text, "仅普通版(v%)".replace("%", Objects.requireNonNull(dmzj.get(DMZJ_PKGN)))); 73 | else if (dmzj.get(DMZJSQ_PKGN) != null) 74 | text = String.format(text, "仅社区版(v%)".replace("%", Objects.requireNonNull(dmzj.get(DMZJSQ_PKGN)))); 75 | else 76 | text = String.format(text, "无"); 77 | isInstall.setText(text); 78 | } 79 | } 80 | 81 | public void openGitHub(View view) { 82 | Intent intent = new Intent(Intent.ACTION_VIEW); 83 | intent.setData(Uri.parse("https://github.com/cokkeijigen/FuckDMZJ")); 84 | startActivity(intent); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/MainHook.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj; 2 | 3 | import static de.robv.android.xposed.XposedHelpers.*; 4 | import static ss.colytitse.fuckdmzj.hook.AdLayout.*; 5 | import static ss.colytitse.fuckdmzj.hook.MethodHook.*; 6 | import android.app.Application; 7 | import android.content.Context; 8 | import android.content.res.XModuleResources; 9 | import java.lang.reflect.Field; 10 | import de.robv.android.xposed.*; 11 | import de.robv.android.xposed.callbacks.*; 12 | import ss.colytitse.fuckdmzj.atsg.*; 13 | import ss.colytitse.fuckdmzj.gdhd.*; 14 | import ss.colytitse.fuckdmzj.hook.*; 15 | import ss.colytitse.fuckdmzj.test.PublicContent; 16 | 17 | public class MainHook extends PublicContent implements IXposedHookLoadPackage, IXposedHookInitPackageResources, IXposedHookZygoteInit { 18 | 19 | // 普通版包名 20 | public static final String DMZJ_PKGN = "com.dmzj.manhua"; 21 | // 社区版包名 22 | public static final String DMZJSQ_PKGN = "com.dmzjsq.manhua"; 23 | /* hook所需字段:类加载器、进程包名、模块路径 */ 24 | public static ClassLoader APPLICATION_CLASS_LOADER = null; 25 | public static ClassLoader LPPARAM_CLASS_LOADER = null; 26 | public static String TARGET_PACKAGE_NAME = ""; 27 | private static String MODULE_PATH = ""; 28 | public static ReplaceActivity.CreateResId CREATE_RES_ID; 29 | 30 | // 获取类 31 | public static Class getClazz(String className){ 32 | className = className.trim().replace("/","."); 33 | try { 34 | return findClass(className, APPLICATION_CLASS_LOADER); 35 | } catch (Throwable ignored) {} 36 | try { 37 | return findClass(className, LPPARAM_CLASS_LOADER); 38 | } catch (Throwable ignored) {} 39 | return FuckerHook.getClass(className); 40 | } 41 | 42 | // 获取当前进程包名下路径类 43 | public static Class getThisPackgeClass(String name){ 44 | if (!name.contains(":")) return getClazz(TARGET_PACKAGE_NAME + name); 45 | String[] split = name.split(":"); 46 | if (TARGET_PACKAGE_NAME.equals(DMZJ_PKGN)) 47 | return getClazz(TARGET_PACKAGE_NAME + split[0].trim()); 48 | else 49 | return getClazz(TARGET_PACKAGE_NAME + split[1].trim()); 50 | } 51 | 52 | // 获取字段 53 | public static Object getField(XC_MethodHook.MethodHookParam param, String name) throws Throwable { 54 | Class clazz = param.thisObject.getClass(); 55 | Field field = clazz.getDeclaredField(name); 56 | field.setAccessible(true); 57 | return field.get(param.thisObject); 58 | } 59 | 60 | private void initApplicationHandleLoad(HandleLoad handleLoad){ 61 | findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { 62 | @Override 63 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 64 | super.beforeHookedMethod(param); 65 | APPLICATION_CLASS_LOADER = ((Context) param.args[0]).getClassLoader(); 66 | handleLoad.load(); 67 | } 68 | }); 69 | } 70 | 71 | @Override 72 | public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) { 73 | if (!lpparam.packageName.equals(lpparam.processName)) return; 74 | if (!(lpparam.packageName.equals(DMZJ_PKGN) || lpparam.packageName.equals(DMZJSQ_PKGN))) return; 75 | LPPARAM_CLASS_LOADER = lpparam.classLoader; 76 | TARGET_PACKAGE_NAME = lpparam.packageName; 77 | initApplicationHandleLoad(() -> { 78 | AdLayout.initClassHooks(); 79 | AdService.initClassHooks(); 80 | Others.initClassHooks(); 81 | AutoSign.initStart(); 82 | AutoSign.SignInView(); 83 | AutoSign.clearSignButtonView(); 84 | // test(); 85 | }); 86 | } 87 | 88 | private void test() { 89 | FilterKamiGakusi.Runnenr(); 90 | } 91 | 92 | @Override 93 | public void initZygote(StartupParam startupParam) { 94 | MODULE_PATH = startupParam.modulePath; 95 | } 96 | 97 | @Override 98 | public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) { 99 | if (!(resparam.packageName.equals(DMZJ_PKGN) || resparam.packageName.equals(DMZJSQ_PKGN))) return; 100 | XModuleResources instance = XModuleResources.createInstance(MODULE_PATH, resparam.res); 101 | int img_lauch_bitch = resparam.res.addResource(instance, R.drawable.img_lauch_bitch); 102 | initApplicationHandleLoad(() -> LaunchInterceptorActivity(img_lauch_bitch)); 103 | // CREATE_RES_ID = new ReplaceActivity.CreateResId(); 104 | // CREATE_RES_ID.img_layout = resparam.res.addResource(instance, R.drawable.img_layout_neko); 105 | // CREATE_RES_ID.img_icon_clock = resparam.res.addResource(instance, R.drawable.img_icon_clock); 106 | // CREATE_RES_ID.img_icon_tag = resparam.res.addResource(instance, R.drawable.img_icon_tag); 107 | // CREATE_RES_ID.img_icon_head = resparam.res.addResource(instance, R.drawable.img_icon_head); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/TestActivity.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | import androidx.annotation.Nullable; 7 | 8 | public class TestActivity extends Activity { 9 | 10 | @Override 11 | protected void onCreate(@Nullable Bundle savedInstanceState) { 12 | super.onCreate(savedInstanceState); 13 | this.setContentView(R.layout.test_layout); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/atsg/AutoSign.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.atsg; 2 | 3 | import static de.robv.android.xposed.XposedBridge.*; 4 | import static ss.colytitse.fuckdmzj.MainHook.*; 5 | import static ss.colytitse.fuckdmzj.hook.MethodHook.FuckerHook.*; 6 | import static ss.colytitse.fuckdmzj.hook.MethodHook.*; 7 | import android.annotation.SuppressLint; 8 | import android.app.Activity; 9 | import android.content.Context; 10 | import android.net.ConnectivityManager; 11 | import android.net.NetworkInfo; 12 | import android.util.Log; 13 | import android.view.View; 14 | import android.widget.ImageView; 15 | import android.widget.TextView; 16 | import java.lang.reflect.Field; 17 | import java.util.ArrayList; 18 | import java.util.Arrays; 19 | import java.util.List; 20 | import java.util.Objects; 21 | import de.robv.android.xposed.XC_MethodHook; 22 | import ss.colytitse.fuckdmzj.test.PublicContent; 23 | import ss.colytitse.fuckdmzj.tool.OkHttp; 24 | 25 | @SuppressLint({"NewApi", "StaticFieldLeak", "DefaultLocale"}) 26 | public final class AutoSign extends PublicContent { 27 | 28 | private static final String SIGN_RESULT_COM 29 | = "{\"code\":2,\"msg\":\"\\u4eca\\u5929\\u5df2\\u7ecf\\u7b7e\\u5230\\uff01\"}"; 30 | private static final String SIGN_RESULT_OK 31 | = "{\"code\":0,\"msg\":\"\\u6210\\u529f\"}"; 32 | private static Activity thisActivity = null; 33 | 34 | public static boolean hasNetworkAvailable(Context context) { 35 | NetworkInfo info; ConnectivityManager connectivity; 36 | if ((connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)) != null 37 | && (info = connectivity.getActiveNetworkInfo()) != null && info.isConnected()) 38 | return info.getState() == NetworkInfo.State.CONNECTED; 39 | return false; 40 | } 41 | 42 | public static void initStart(){ 43 | Class HomeTabsActivitysClass = getThisPackgeClass(".ui.home.HomeTabsActivitys"); 44 | if (HomeTabsActivitysClass != null) try { 45 | newHookMethods(HomeTabsActivitysClass,"onCreate", (HookCallBack) param -> { 46 | thisActivity = (Activity) param.thisObject; 47 | UserInfo userInfo = new UserInfo(thisActivity); 48 | if(hasNetworkAvailable(thisActivity)) 49 | new Thread(() -> onStart(userInfo)).start(); 50 | }); 51 | }catch (Exception ignored){} 52 | } 53 | 54 | public static void showToast(String text){ 55 | showToast(thisActivity, String.format("-- AutoSignInfo --\n%s", text)); 56 | } 57 | 58 | private static List onDaysTask(UserInfo userInfo){ 59 | List result = new ArrayList<>(); 60 | for (int i = 1; i < 17; i++) try { 61 | Object Request = OkHttp.RequestBuilder(String.format((DMZJSQ_PKGN.equals(TARGET_PACKAGE_NAME) ? 62 | "http://v3api.muwai.com" : "http://nnv3api.muwai.com") + /* 任务签到接口 */ 63 | "/task/get_reward?uid=%s&token=%s&sign=%s&id=%d", userInfo.getUserId(), userInfo.getUserToken(), userInfo.getUserSign(), i 64 | )); 65 | String temp = OkHttp.ResponseBodyString(Request); 66 | result.add(String.format("id_%d ->%s\n",i,temp)); 67 | } catch (Exception e) { 68 | Log.d(TAG, "DailyTask: err-> " + e); 69 | } 70 | return result; 71 | } 72 | 73 | private static String atSignApi(UserInfo userInfo) throws Exception { 74 | Object Request = OkHttp.RequestBuilder(String.format((DMZJSQ_PKGN.equals(TARGET_PACKAGE_NAME) ? 75 | "http://v3api.muwai.com" : "http://nnv3api.muwai.com") + /* APP签到接口 */ 76 | "/task/sign?uid=%s&token=%s&sign=%s", userInfo.getUserId(), userInfo.getUserToken(), userInfo.getUserSign() 77 | )); 78 | return OkHttp.ResponseBodyString(Request); 79 | } 80 | 81 | private static void onStart(UserInfo userInfo){ 82 | if (!(OkHttp.init() && userInfo.initComplete())) return; 83 | boolean signComplete = false; 84 | try { 85 | UserInfo.user beforeSG = new UserInfo.user(userInfo); // 签到前数据; 86 | String atSignResult = atSignApi(userInfo); 87 | if (Objects.equals(atSignResult, SIGN_RESULT_COM)) 88 | showToast("今日已签到!"); 89 | else if (Objects.equals(atSignResult, SIGN_RESULT_OK)){ 90 | UserInfo.user afterSG = new UserInfo.user(userInfo); // 签到后数据 91 | showToast("签到成功" + ( 92 | beforeSG.notEquals(afterSG) ? String.format( ":积分 + %d 银币 + %d", 93 | afterSG.credits_nums - beforeSG.credits_nums, afterSG.silver_nums - beforeSG.silver_nums 94 | ) : "!") 95 | ); 96 | showToast(String.format("已连续签到: %d 天", afterSG.sign_count)); 97 | } else showToast("签到状态未知!"); 98 | signComplete = true; 99 | UserInfo.user beforeDT = new UserInfo.user(userInfo); 100 | List DaysTaskResult = onDaysTask(userInfo); // 任务签到 101 | UserInfo.user afterDT = new UserInfo.user(userInfo); 102 | if (beforeDT.notEquals(afterDT)) showToast(String.format("完成任务:积分 + %d 银币 + %d", 103 | afterDT.credits_nums - beforeDT.credits_nums, afterDT.silver_nums - beforeDT.silver_nums) 104 | ); 105 | Log.d(INFO, "SignResult -> \n" + atSignResult); 106 | Log.d(INFO, "DaysTaskResult -> \n" + DaysTaskResult); 107 | }catch (Exception e){ 108 | Log.d(TAG, "SignResult: err-> " + e); 109 | if(!signComplete) showToast("签到失败!"); 110 | } 111 | } 112 | 113 | private static boolean fuckSignInView(Object object, UserInfo userInfo){ 114 | if (!Objects.requireNonNull(object).getClass().getName().contains("TextView")) return false; 115 | TextView signInTv = (TextView) object; 116 | List msgs = Arrays.asList("观看视频奖励 x 2", "立即签到", "明日再来"); 117 | if (!msgs.contains(signInTv.getText().toString())) return false; 118 | if (signInTv.getText().equals("立即签到")) new Thread(() -> { 119 | try { 120 | if (userInfo == null) return; 121 | String SignResult = atSignApi(userInfo); 122 | if (!Objects.equals(SignResult, SIGN_RESULT_COM) || !Objects.equals(SignResult, SIGN_RESULT_OK)) 123 | signInTv.performClick(); 124 | } catch (Exception ignored) {} 125 | }).start(); 126 | signInTv.setText("今日已签到"); 127 | signInTv.setClickable(false); 128 | return true; 129 | } 130 | 131 | public static void SignInView() { 132 | // 签到页自动点击签到按钮,前提是如果后台自动签到失败 133 | Class SignInViewClass = getThisPackgeClass("_kt.views.task.SignInView"); 134 | if (SignInViewClass != null) try { 135 | XC_MethodHook setDaySignTask = new XC_MethodHook() { 136 | @Override 137 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 138 | super.afterHookedMethod(param); 139 | Context mContext = (Context) param.args[0]; 140 | if(!hasNetworkAvailable(mContext)) return; 141 | UserInfo userInfo = new UserInfo(mContext); 142 | XC_MethodHook xc_methodHook = new XC_MethodHook() { 143 | @Override 144 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 145 | super.afterHookedMethod(param); 146 | for (Field declaredField : param.thisObject.getClass().getDeclaredFields()) try { 147 | declaredField.setAccessible(true); 148 | Object object = declaredField.get(param.thisObject); 149 | if (fuckSignInView(object, userInfo)) break; 150 | } catch (Exception ignored) {} 151 | } 152 | }; 153 | hookAllMethods(SignInViewClass, "setDaySignTask", xc_methodHook); 154 | } 155 | }; 156 | hookAllConstructors(SignInViewClass, setDaySignTask); 157 | } catch (Exception ignored) {} 158 | } 159 | 160 | public static void clearSignButtonView(){ 161 | // 隐藏签到按钮的红点 162 | if (DMZJ_PKGN.equals(TARGET_PACKAGE_NAME)) { 163 | Class MainSceneMineEnActivityClass = getThisPackgeClass(".ui.home.MainSceneMineEnActivity"); 164 | if (MainSceneMineEnActivityClass != null) try { 165 | newHookMethods(MainSceneMineEnActivityClass,"onStart", (HookCallBack) param ->{ 166 | Activity mActivty = (Activity) param.thisObject; 167 | Context mContext = mActivty.getApplicationContext(); 168 | int identifier = getIdentifier(mContext, "id", "iv_my_unread_counts2"); 169 | ImageView imageView = mActivty.findViewById(identifier); 170 | imageView.setImageAlpha(0); 171 | }); 172 | } catch (Throwable ignored) {} 173 | } else if (DMZJSQ_PKGN.equals(TARGET_PACKAGE_NAME)){ 174 | Class HomeMeFragmentClass = getThisPackgeClass("_kt.ui.home.HomeMeFragment"); 175 | if (HomeMeFragmentClass != null) try { 176 | newHookMethods(HomeMeFragmentClass, "onCreateView", (HookCallBack) param ->{ 177 | if(param.args.length != 3) return; 178 | View result = (View) param.getResult(); 179 | Context thisObject = result.getContext(); 180 | int resourceId = getIdentifier(thisObject,"id", "unread"); 181 | ImageView imageView = result.findViewById(resourceId); 182 | imageView.setImageAlpha(0); 183 | }); 184 | } catch (Throwable ignored) {} 185 | } 186 | } 187 | } -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/atsg/OkHttp.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.atsg; 2 | 3 | import static de.robv.android.xposed.XposedHelpers.callMethod; 4 | import static ss.colytitse.fuckdmzj.MainHook.getClazz; 5 | 6 | import ss.colytitse.fuckdmzj.test.PublicContent; 7 | 8 | public final class OkHttp extends PublicContent { 9 | 10 | private static Class RequestBuilderClass = null; 11 | private static Class FormBodyBuilderClass = null; 12 | private static Class OkHttpClientClass = null; 13 | private static boolean InitComplete = false; 14 | 15 | public static boolean init(){ 16 | if (InitComplete) return true; 17 | RequestBuilderClass = getClazz("okhttp3.Request$Builder"); 18 | FormBodyBuilderClass = getClazz("okhttp3.FormBody$Builder"); 19 | OkHttpClientClass = getClazz("okhttp3.OkHttpClient"); 20 | InitComplete = RequestBuilderClass != null && FormBodyBuilderClass != null && OkHttpClientClass != null; 21 | return InitComplete; 22 | } 23 | 24 | public static Object RequestBuilder(String url, Object post) throws Exception { 25 | if (!OkHttp.init()) return null; 26 | Object requestBuilder = RequestBuilderClass.newInstance(); 27 | requestBuilder = callMethod(requestBuilder, "url", url); 28 | if (post != null) 29 | requestBuilder = callMethod(requestBuilder, "post", post); 30 | return callMethod(requestBuilder, "build"); 31 | } 32 | 33 | public static String ResponseBodyString(Object Request) throws Exception{ 34 | if (!OkHttp.init()) return null; 35 | Object OkHttpClient = OkHttpClientClass.newInstance(); 36 | Object newCall = callMethod(OkHttpClient, "newCall", Request); 37 | Object Response = callMethod(newCall, "execute"); 38 | Object ResponseBody = callMethod(Response, "body"); 39 | return (String) callMethod(ResponseBody, "string"); 40 | } 41 | 42 | public static Object FormBodyBuilder(String ...args) throws Exception{ 43 | if (!OkHttp.init()) return null; 44 | Object formBodyBuilder = FormBodyBuilderClass.newInstance(); 45 | for (String arg : args) { 46 | String[] temp = arg.split("="); 47 | formBodyBuilder = callMethod(formBodyBuilder, "add", temp[0], temp[1]); 48 | } 49 | return callMethod(formBodyBuilder, "build"); 50 | } 51 | } 52 | 53 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/atsg/UserInfo.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.atsg; 2 | 3 | import static ss.colytitse.fuckdmzj.MainHook.*; 4 | import android.database.sqlite.SQLiteDatabase; 5 | import android.annotation.SuppressLint; 6 | import android.content.Context; 7 | import android.database.Cursor; 8 | import android.util.Log; 9 | import androidx.annotation.NonNull; 10 | import java.security.MessageDigest; 11 | import java.util.Arrays; 12 | import java.util.HashMap; 13 | import java.util.Map; 14 | import java.util.Objects; 15 | import ss.colytitse.fuckdmzj.test.PublicContent; 16 | import ss.colytitse.fuckdmzj.tool.OkHttp; 17 | 18 | @SuppressLint({"NewApi", "StaticFieldLeak", "DefaultLocale"}) 19 | public final class UserInfo extends PublicContent { 20 | 21 | private String userId; 22 | private String userToken; 23 | private String userSign; 24 | private final String database; 25 | private final String table; 26 | 27 | public UserInfo(Context mContext){ 28 | boolean dmzj = TARGET_PACKAGE_NAME.equals(DMZJ_PKGN); 29 | this.database = dmzj ? "cartoon" : "room_dmzjsq.db"; 30 | this.table = dmzj ? "user" : "User"; 31 | Map data = this.getData(mContext); 32 | if (data == null) return; 33 | this.userId = data.get("uid"); 34 | this.userToken = data.get("token"); 35 | this.userSign = createUserSign(); 36 | } 37 | 38 | @SuppressLint({"Recycle","Range"}) 39 | private Map getData(Context mContext){ 40 | try { 41 | // 读取本地数据库 42 | SQLiteDatabase sqLiteDatabase = mContext.openOrCreateDatabase(this.database, Context.MODE_PRIVATE, null); 43 | Cursor user = sqLiteDatabase.query(this.table, null, null, null, null, null, null); 44 | if (user != null){ 45 | Map result = new HashMap<>(); 46 | while(user.moveToNext()){ 47 | if (user.getInt(user.getColumnIndex("status"))!= 1) continue; 48 | result.put("uid", user.getString(user.getColumnIndex("uid"))); 49 | result.put("token", user.getString(user.getColumnIndex("dmzj_token"))); 50 | return result; 51 | } 52 | } 53 | } catch (Exception e) { 54 | Log.d(TAG, "getData: 错误?" + e); 55 | } 56 | return null; 57 | } 58 | 59 | private String createUserSign(){ 60 | String[] hexDigits = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}; 61 | StringBuilder result = new StringBuilder(); 62 | try { 63 | for (int md5 : MessageDigest.getInstance("MD5").digest((userToken + userId + "d&m$z*j_159753twt").getBytes())) { 64 | if (md5 < 0) md5 += 256; 65 | result.append(hexDigits[md5 / 16]).append(hexDigits[md5 % 16]); 66 | } 67 | return result.toString(); 68 | } catch (Exception e) { 69 | return null; 70 | } 71 | } 72 | 73 | public String getUserSign(){ 74 | return this.userSign; 75 | } 76 | 77 | public String getUserId() { 78 | return userId; 79 | } 80 | 81 | public String getUserToken() { 82 | return userToken; 83 | } 84 | 85 | public boolean initComplete(){ 86 | return (userId != null && userToken != null && userSign != null); 87 | } 88 | 89 | @Override @NonNull 90 | public String toString() { 91 | return String.format( 92 | "UserInfo ->{ uid(%s), token(%s), sign(%s) }", 93 | this.userId, this.userToken, this.userSign 94 | ); 95 | } 96 | 97 | public static class user { 98 | 99 | String result; // 请求结果 100 | int sign_count; // 连续签到天数 101 | int max_sign_count; // 最大连续天数 102 | int credits_nums; // 积分数 103 | int silver_nums; // 银币数 104 | boolean initComplete; // 初始化状态 105 | 106 | public user(UserInfo userInfo) throws Exception { 107 | initComplete = false; 108 | if (!OkHttp.init()) return; 109 | Object Request = OkHttp.RequestBuilder(String.format((TARGET_PACKAGE_NAME.equals(DMZJSQ_PKGN) ? 110 | "http://v3api.muwai.com" : "http://nnv3api.muwai.com") + /* 获取状态接口 */ 111 | "/task/index?uid=%s&token=%s&sign=%s", userInfo.userId, userInfo.userToken, userInfo.userSign 112 | )); 113 | this.result = OkHttp.ResponseBodyString(Request); 114 | Arrays.stream(Objects.requireNonNull(this.result).split(",")) 115 | .filter(e -> e.contains("sign_count") || e.contains("credits_nums")|| e.contains("silver_nums")) 116 | .filter(e -> !e.contains("}")).forEach(e -> { 117 | if (e.contains("\"sign_count\"")) 118 | this.sign_count = Integer.parseInt(e.split(":")[2].replace("\"", "").trim()); 119 | else { 120 | int num = Integer.parseInt(e.split(":")[1].replace("\"", "").trim()); 121 | if (e.contains("\"max_sign_count\"")) this.max_sign_count = num; 122 | else if (e.contains("\"credits_nums\"")) this.credits_nums = num; 123 | else if (e.contains("\"silver_nums\"")) this.silver_nums = num; 124 | } 125 | }); 126 | initComplete = true; 127 | } 128 | 129 | public boolean notEquals(user us) { 130 | return this.sign_count != us.sign_count || this.max_sign_count != us.max_sign_count || 131 | this.credits_nums != us.credits_nums || this.silver_nums != us.silver_nums; 132 | } 133 | 134 | @Override @NonNull 135 | public String toString() { 136 | if (initComplete) return " " + 137 | "\nuser -> {" + 138 | " \n max_sign_count = " + max_sign_count + 139 | "; sign_count = " + sign_count + 140 | "; \n credits_nums = " + credits_nums + 141 | "; silver_nums = " + silver_nums + 142 | ";\n} <- end"; 143 | else return "user -> { null } <- end"; 144 | } 145 | } 146 | } 147 | 148 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/gdhd/FilterKamiGakusi.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.gdhd; 2 | 3 | import static ss.colytitse.fuckdmzj.MainHook.*; 4 | import static ss.colytitse.fuckdmzj.hook.MethodHook.FuckerHook.*; 5 | import static ss.colytitse.fuckdmzj.hook.MethodHook.*; 6 | import static ss.colytitse.fuckdmzj.tool.OkHttp.*; 7 | import android.app.Activity; 8 | import android.content.Context; 9 | import android.content.Intent; 10 | import android.net.Uri; 11 | import android.util.Log; 12 | import android.widget.RelativeLayout; 13 | import ss.colytitse.fuckdmzj.test.PublicContent; 14 | import ss.colytitse.fuckdmzj.tool.OkHttp; 15 | import ss.colytitse.fuckdmzj.tool.RSAUtils; 16 | 17 | public class FilterKamiGakusi extends PublicContent { 18 | 19 | static final String RSA_PRIVATE_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAK8nNR1lTnIfIes6oRW" + 20 | "JNj3mB6OssDGx0uGMpgpbVCpf6+VwnuI2stmhZNoQcM417Iz7WqlPzbUmu9R4dEKmLGEEqOhOdVaeh9Xk2IPPjqIu5Tbk" + 21 | "LZRxkY3dJM1htbz57d/roesJLkZXqssfG5EJauNc+RcABTfLb4IiFjSMlTsnAgMBAAECgYEAiz/pi2hKOJKlvcTL4jpHJ" + 22 | "Gjn8+lL3wZX+LeAHkXDoTjHa47g0knYYQteCbv+YwMeAGupBWiLy5RyyhXFoGNKbbnvftMYK56hH+iqxjtDLnjSDKWnhc" + 23 | "B7089sNKaEM9Ilil6uxWMrMMBH9v2PLdYsqMBHqPutKu/SigeGPeiB7VECQQDizVlNv67go99QAIv2n/ga4e0wLizVuaN" + 24 | "BXE88AdOnaZ0LOTeniVEqvPtgUk63zbjl0P/pzQzyjitwe6HoCAIpAkEAxbOtnCm1uKEp5HsNaXEJTwE7WQf7PrLD4+Bp" + 25 | "GtNKkgja6f6F4ld4QZ2TQ6qvsCizSGJrjOpNdjVGJ7bgYMcczwJBALvJWPLmDi7ToFfGTB0EsNHZVKE66kZ/8Stx+ezue" + 26 | "ke4S556XplqOflQBjbnj2PigwBN/0afT+QZUOBOjWzoDJkCQClzo+oDQMvGVs9GEajS/32mJ3hiWQZrWvEzgzYRqSf3XV" + 27 | "cEe7PaXSd8z3y3lACeeACsShqQoc8wGlaHXIJOHTcCQQCZw5127ZGs8ZDTSrogrH73Kw/HvX55wGAeirKYcv28eauveCG" + 28 | "7iyFR0PFB/P/EDZnyb+ifvyEFlucPUI0+Y87F"; 29 | 30 | public static void Runnenr(){ 31 | 32 | newHookMethods(getThisPackgeClass(".proto.Comic$ComicResponse"), 33 | "getErrno", 34 | (HookCallBack) param -> param.setResult(0) 35 | ); 36 | 37 | Class CartoonInstructionActivity = getThisPackgeClass(".ui.CartoonInstructionActivity"); 38 | 39 | newHookMethods(CartoonInstructionActivity, "setTitle", (HookCallBack) param -> { 40 | if ("".equals(param.args[0])) param.setResult(null); 41 | }, BEFORE); 42 | 43 | // Class CartoonDescription = getClazz("com.dmzj.manhua.bean.CartoonDescription"); 44 | newHookMethods(CartoonInstructionActivity, "onStart", (HookCallBack) param -> { 45 | Context mContext = (Context)param.thisObject; 46 | Activity mActivity = (Activity)param.thisObject; 47 | new Thread(() -> { 48 | String comicId = (String) newMethodResult(() ->{ 49 | Intent intent = mActivity.getIntent(); 50 | String action = intent.getAction(); 51 | if ("android.intent.action.VIEW".equals(action)) { 52 | Uri data = intent.getData(); 53 | if (data != null) return data.getQueryParameter("id"); 54 | } 55 | return intent.getStringExtra("intent_extra_cid"); 56 | }, TAG); 57 | if(isKamiGakushi(comicId)) 58 | mActivity.runOnUiThread(() -> { 59 | showToast(mContext, "此乃神隐!!!"); 60 | int layout_inst_title = getIdentifier(mContext, "id", "layout_inst_title"); 61 | RelativeLayout layoutInstTitle = mActivity.findViewById(layout_inst_title); 62 | layoutInstTitle.removeAllViews(); 63 | layoutInstTitle.invalidate(); 64 | }); 65 | }).start(); 66 | }); 67 | } 68 | 69 | private static boolean isKamiGakushi(String comicId) { 70 | try { 71 | Object Request = RequestBuilder("https://nnv4api.muwai.com/comic/detail/" + comicId); 72 | String result = OkHttp.ResponseBodyString(Request); 73 | String decrypt = RSAUtils.decrypt(result, RSA_PRIVATE_KEY); 74 | return decrypt.contains("漫画不存在"); 75 | } catch (Exception e) { 76 | Log.d(TAG, "喵喵喵?" + e); 77 | } 78 | return false; 79 | } 80 | 81 | 82 | } 83 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/gdhd/ReplaceActivity.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.gdhd; 2 | 3 | public class ReplaceActivity { 4 | public static class CreateResId{ 5 | public int img_icon_clock; 6 | public int img_icon_head; 7 | public int img_icon_tag; 8 | public int img_layout; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/gdhd/dmzj/Chapter.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.gdhd.dmzj; 2 | 3 | public class Chapter { 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/gdhd/dmzj/ComicDescription.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.gdhd.dmzj; 2 | 3 | import java.util.List; 4 | 5 | public class ComicDescription { 6 | 7 | private String id; 8 | private String title; 9 | private String subtitle; 10 | private String types; 11 | private String zone; 12 | private String status; 13 | private String last_update_chapter_name; 14 | private String last_updatetime; 15 | private String cover; 16 | private String authors; 17 | private String description; 18 | private String first_letter; 19 | private String direction; 20 | private String islong; 21 | private String copyright; 22 | private List ChapterDescription; 23 | 24 | public void setChapterDescription(List chapterDescription) { 25 | ChapterDescription = chapterDescription; 26 | } 27 | 28 | public List getChapterDescription() { 29 | return ChapterDescription; 30 | } 31 | 32 | public ComicDescription() { 33 | this.id = ""; 34 | this.title = ""; 35 | this.subtitle = ""; 36 | this.types = ""; 37 | this.zone = ""; 38 | this.status = ""; 39 | this.last_update_chapter_name = ""; 40 | this.last_updatetime = ""; 41 | this.cover = ""; 42 | this.authors = ""; 43 | this.description = ""; 44 | this.first_letter = ""; 45 | this.direction = ""; 46 | this.islong = ""; 47 | this.copyright = ""; 48 | } 49 | 50 | public String getId() { 51 | return id; 52 | } 53 | 54 | public String getTitle() { 55 | return title; 56 | } 57 | 58 | public String getSubtitle() { 59 | return subtitle; 60 | } 61 | 62 | public String getTypes() { 63 | return types; 64 | } 65 | 66 | public String getZone() { 67 | return zone; 68 | } 69 | 70 | public String getStatus() { 71 | return status; 72 | } 73 | 74 | public String getLastUpdateChapterName() { 75 | return last_update_chapter_name; 76 | } 77 | 78 | public String getLastUpdatetime() { 79 | return last_updatetime; 80 | } 81 | 82 | public String getCover() { 83 | return cover; 84 | } 85 | 86 | public String getAuthors() { 87 | return authors; 88 | } 89 | 90 | public String getDescription() { 91 | return description; 92 | } 93 | 94 | public String getFirstLetter() { 95 | return first_letter; 96 | } 97 | 98 | public String getDirection() { 99 | return direction; 100 | } 101 | 102 | public String getIslong() { 103 | return islong; 104 | } 105 | 106 | public String getCopyright() { 107 | return copyright; 108 | } 109 | 110 | public void setId(String id) { 111 | this.id = id; 112 | } 113 | 114 | public void setTitle(String title) { 115 | this.title = title; 116 | } 117 | 118 | public void setSubtitle(String subtitle) { 119 | this.subtitle = subtitle; 120 | } 121 | 122 | public void setTypes(String types) { 123 | this.types = types; 124 | } 125 | 126 | public void setZone(String zone) { 127 | this.zone = zone; 128 | } 129 | 130 | public void setStatus(String status) { 131 | this.status = status; 132 | } 133 | 134 | public void setLastUpdateChapterName(String last_update_chapter_name) { 135 | this.last_update_chapter_name = last_update_chapter_name; 136 | } 137 | 138 | public void setLastUpdatetime(String last_updatetime) { 139 | this.last_updatetime = last_updatetime; 140 | } 141 | 142 | public void setCover(String cover) { 143 | this.cover = cover; 144 | } 145 | 146 | public void setAuthors(String authors) { 147 | this.authors = authors; 148 | } 149 | 150 | public void setDescription(String description) { 151 | this.description = description; 152 | } 153 | 154 | public void setFirstLetter(String first_letter) { 155 | this.first_letter = first_letter; 156 | } 157 | 158 | public void setDirection(String direction) { 159 | this.direction = direction; 160 | } 161 | 162 | public void setIslong(String islong) { 163 | this.islong = islong; 164 | } 165 | 166 | public void setCopyright(String copyright) { 167 | this.copyright = copyright; 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/hook/AdLayout.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.hook; 2 | 3 | import static de.robv.android.xposed.XposedHelpers.*; 4 | import static ss.colytitse.fuckdmzj.MainHook.*; 5 | import static ss.colytitse.fuckdmzj.hook.MethodHook.FuckerHook.*; 6 | import static ss.colytitse.fuckdmzj.hook.MethodHook.*; 7 | import static ss.colytitse.fuckdmzj.hook.MethodHook.FuckerHook.newHookMethods; 8 | 9 | import android.annotation.SuppressLint; 10 | import android.app.Activity; 11 | import android.content.Context; 12 | import android.content.Intent; 13 | import android.graphics.Color; 14 | import android.graphics.Typeface; 15 | import android.os.Bundle; 16 | import android.util.AttributeSet; 17 | import android.util.Log; 18 | import android.view.Gravity; 19 | import android.view.View; 20 | import android.view.ViewGroup; 21 | import android.widget.FrameLayout; 22 | import android.widget.ImageView; 23 | import android.widget.LinearLayout; 24 | import android.widget.RelativeLayout; 25 | import android.widget.TextView; 26 | 27 | import java.lang.reflect.InvocationTargetException; 28 | import java.lang.reflect.Method; 29 | import java.lang.reflect.Modifier; 30 | import java.util.Objects; 31 | 32 | import de.robv.android.xposed.XC_MethodHook; 33 | import de.robv.android.xposed.XC_MethodReplacement; 34 | import de.robv.android.xposed.XposedBridge; 35 | import ss.colytitse.fuckdmzj.test.PublicContent; 36 | 37 | public final class AdLayout extends PublicContent { 38 | 39 | public static void initClassHooks() { 40 | InstructionActivity(); 41 | NovelBrowseActivity(); 42 | CartoonDetailsView(); 43 | AdLoadingActivity(); 44 | } 45 | 46 | private static void InstructionActivity() { 47 | final XC_MethodHook layout_ad_layout = new XC_MethodHook() { 48 | @Override 49 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 50 | Activity activity = (Activity) param.thisObject; 51 | Context thisObject = (Context) param.thisObject; 52 | int identifier = getIdentifier(thisObject, "id", "layout_ad_layout"); 53 | RelativeLayout layout_ad_layout = activity.findViewById(identifier); 54 | ViewGroup.LayoutParams layoutParams = layout_ad_layout.getLayoutParams(); 55 | layoutParams.height = 0; 56 | layout_ad_layout.setLayoutParams(layoutParams); 57 | layout_ad_layout.setVisibility(View.GONE); 58 | } 59 | }; 60 | // CartoonInstructionActivity --漫画详细界面广告位 61 | final Class CartoonInstructionActivityClass = getThisPackgeClass(".ui.CartoonInstructionActivity"); 62 | if (CartoonInstructionActivityClass != null) try{ 63 | findAndHookMethod(CartoonInstructionActivityClass, "onResume", layout_ad_layout); 64 | }catch (Throwable ignored){} 65 | // NovelInstructionActivity --小说详细界面广告位 66 | final Class NovelInstructionActivityClass = getThisPackgeClass(".ui.NovelInstructionActivity"); 67 | if (NovelInstructionActivityClass != null) try { 68 | findAndHookMethod(NovelInstructionActivityClass, "onResume", layout_ad_layout); 69 | }catch (Throwable ignored){} 70 | 71 | } 72 | 73 | private static void CartoonDetailsView(){ 74 | final Class CartoonDetailsViewClass = getThisPackgeClass("_kt.views.custom.CartoonDetailsView"); 75 | if (CartoonDetailsViewClass != null) try{ 76 | final XC_MethodHook Fucked = new XC_MethodHook() { 77 | @Override 78 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 79 | FrameLayout adLayout = (FrameLayout) getField(param, "adLayout"); 80 | adLayout.setVisibility(View.GONE); 81 | } 82 | }; 83 | findAndHookConstructor(CartoonDetailsViewClass, Context.class, AttributeSet.class, int.class, Fucked); 84 | }catch (Throwable ignored){} 85 | } 86 | 87 | private static void NovelBrowseActivity(){ 88 | final Class NovelBrowseActivityClass = getThisPackgeClass(".ui.NovelBrowseActivity"); 89 | if (NovelBrowseActivityClass != null) try { 90 | newHookMethods(NovelBrowseActivityClass, "onStart", (HookCallBack) param -> { 91 | Context thisContext = (Context) param.thisObject; 92 | Activity thisActivity = (Activity) param.thisObject; 93 | int identifier = getIdentifier(thisContext, "id", "layout_container"); 94 | RelativeLayout layout_container = thisActivity.findViewById(identifier); 95 | ViewGroup.LayoutParams layoutParams = layout_container.getLayoutParams(); 96 | layoutParams.height = 0; 97 | layout_container.setLayoutParams(layoutParams); 98 | }); 99 | } catch (Exception ignored) {} 100 | } 101 | 102 | private static void AdLoadingActivity(){ 103 | final Class AdLoadingActivityClass = getThisPackgeClass("_kt.ui.AdLoadingActivity"); 104 | if (AdLoadingActivityClass != null) try{ 105 | final XC_MethodHook Fucked = onActivityFinish(false); 106 | findAndHookMethod(AdLoadingActivityClass, "addFragment", Fucked); 107 | }catch (Throwable ignored){} 108 | } 109 | 110 | @SuppressLint({"NewApi", "UseCompatLoadingForDrawables", "SetTextI18n", "ResourceType"}) 111 | private static void LaunchReplacement(XC_MethodHook.MethodHookParam param, int res){ 112 | int color = Color.parseColor(DMZJ_PKGN.equals(TARGET_PACKAGE_NAME) ? "#0080ec" : "#ffaf25"); 113 | Context mContext = (Context) param.thisObject; 114 | Activity mActivty = (Activity) param.thisObject; 115 | LinearLayout linearLayout = new LinearLayout(mActivty); 116 | linearLayout.setLayoutParams(new LinearLayout.LayoutParams(-1, -1)); 117 | linearLayout.setOrientation(LinearLayout.VERTICAL); 118 | linearLayout.setGravity(Gravity.CENTER); 119 | linearLayout.setPadding(110, linearLayout.getPaddingTop(), 110, linearLayout.getPaddingBottom()); 120 | TextView textView = new TextView(mActivty); 121 | textView.setText("-Started By FuckDMZJXposed-"); 122 | ImageView imageView = new ImageView(mActivty); 123 | textView.setTextColor(Color.parseColor("#ffffff")); 124 | try { 125 | imageView.setImageDrawable(mContext.getDrawable(res)); 126 | }catch (Exception igonred){ 127 | // lspatched 128 | int lsp_img_lauch_bitch = getIdentifier(mContext, "drawable", "img_lauch_bitch"); 129 | imageView.setImageDrawable(mContext.getDrawable(lsp_img_lauch_bitch)); 130 | if (DMZJSQ_PKGN.equals(TARGET_PACKAGE_NAME)) { 131 | textView.setTextColor(Color.parseColor("#000000")); 132 | color = Color.parseColor("#ffffff"); 133 | } 134 | } 135 | linearLayout.setBackgroundColor(color); 136 | textView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD)); 137 | textView.setPadding(0,100,0,0); 138 | textView.setGravity(Gravity.CENTER); 139 | textView.setTextSize(15); 140 | linearLayout.addView(imageView); 141 | linearLayout.addView(textView); 142 | mActivty.setContentView(linearLayout); 143 | new Thread(()->{ 144 | try { 145 | Thread.sleep(500); 146 | Intent intent = new Intent(); 147 | intent.setClass(mContext, getThisPackgeClass(".ui.home.HomeTabsActivitys")); 148 | intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 149 | mContext.startActivity(intent); 150 | callMethod(param.thisObject, "finish"); 151 | } catch (Exception ignored) {} 152 | }).start(); 153 | setActivityFullscreen(mActivty); 154 | } 155 | 156 | public static boolean notFirstRunning(XC_MethodHook.MethodHookParam param){ 157 | return ((Context)param.thisObject).getSharedPreferences("user_info", Context.MODE_PRIVATE) 158 | .getBoolean("app_usered", false); 159 | } 160 | 161 | public static void LaunchInterceptorActivity(int res) { 162 | final Class LaunchInterceptorActivity = getThisPackgeClass(".ui.LaunchInterceptorActivity"); 163 | if (LaunchInterceptorActivity == null) return; 164 | try { 165 | findAndHookMethod(Activity.class, "onCreate", Bundle.class, new XC_MethodHook() { 166 | @Override 167 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 168 | super.afterHookedMethod(param); 169 | if(!param.thisObject.getClass().equals(LaunchInterceptorActivity)) return; 170 | if (!notFirstRunning(param)) return; 171 | for (Method method : LaunchInterceptorActivity.getDeclaredMethods()) { 172 | if (method.getReturnType().equals(void.class) && ( 173 | !"onCreate&onStart&onRestart&onResume&onPause&onStop&onDestroy" 174 | .contains(method.getName()) 175 | )) try { 176 | XposedBridge.hookMethod(method, onReturnVoid); 177 | }catch (Exception ignored){} 178 | } 179 | } 180 | }); 181 | newHookMethods(LaunchInterceptorActivity,"onCreate", (HookCallBack) param-> { 182 | if (notFirstRunning(param)) LaunchReplacement(param, res); 183 | }); 184 | }catch (Throwable ignored){} 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/hook/AdService.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.hook; 2 | 3 | import static de.robv.android.xposed.XposedBridge.*; 4 | import static de.robv.android.xposed.XposedHelpers.*; 5 | import static ss.colytitse.fuckdmzj.MainHook.*; 6 | import static ss.colytitse.fuckdmzj.hook.MethodHook.FuckerHook.*; 7 | import static ss.colytitse.fuckdmzj.MainHook.getClazz; 8 | import static ss.colytitse.fuckdmzj.hook.MethodHook.*; 9 | import android.content.Context; 10 | import android.os.Bundle; 11 | import android.view.ViewGroup; 12 | import de.robv.android.xposed.XC_MethodHook; 13 | import de.robv.android.xposed.XposedBridge; 14 | import ss.colytitse.fuckdmzj.test.PublicContent; 15 | 16 | public final class AdService extends PublicContent { 17 | 18 | public static void initClassHooks(){ 19 | LandscapeADActivity(); 20 | LTUnionADPlatform(); 21 | PortraitADActivity(); 22 | GuangGaoBean(); 23 | TKBaseTKView(); 24 | CApplication(); 25 | POFactoryImpl(); 26 | ADActivity(); 27 | JDAdSDK(); 28 | JDAdSplash(); 29 | TempDealUtil(); 30 | NgSyCpAdHelp(); 31 | TTAdSdk(); 32 | } 33 | 34 | private static void GuangGaoBean(){ 35 | final String GuangGaoBean = TARGET_PACKAGE_NAME + ".bean.GuangGaoBean"; 36 | final XC_MethodHook Fucked = onSetResult(-1, true); 37 | final Class GuangGaoBeanClass = getClazz(GuangGaoBean); 38 | if (GuangGaoBeanClass != null) try{ 39 | findAndHookMethod(GuangGaoBeanClass, "getCode", Fucked); 40 | }catch (Throwable ignored){} 41 | } 42 | 43 | private static void LTUnionADPlatform(){ 44 | final String LTUnionADPlatform = TARGET_PACKAGE_NAME + ".ad.adv.LTUnionADPlatform"; 45 | final XC_MethodHook Fucked = new XC_MethodHook() { 46 | @Override 47 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 48 | super.beforeHookedMethod(param); 49 | callMethod(param.thisObject, "onAdCloseView"); 50 | } 51 | }; 52 | final Class LTUnionADPlatformClass = getClazz(LTUnionADPlatform); 53 | if (LTUnionADPlatformClass != null) try{ 54 | findAndHookMethod(LTUnionADPlatformClass, "LoadShowInfo", int.class, String.class, Fucked); 55 | }catch (Throwable ignored){} 56 | } 57 | 58 | private static void CApplication(){ 59 | final String CApplication = TARGET_PACKAGE_NAME + ".api.CApplication"; 60 | final Class CApplicationClass = getClazz(CApplication); 61 | if (CApplicationClass != null) { 62 | try { 63 | findAndHookMethod(CApplicationClass, "initWhSdk", onReturnVoid); 64 | } catch (Throwable ignored) {} 65 | try { 66 | findAndHookMethod(CApplicationClass, "initTouTiaoAd", onReturnVoid); 67 | } catch (Throwable ignored) {} 68 | }else{ 69 | inClassLoaderFindAndHook(clazz -> { 70 | if (!clazz.getName().equals(CApplication)) return; 71 | findAndHookMethod(clazz, "initWhSdk", onReturnVoid); 72 | }); 73 | inClassLoaderFindAndHook(clazz -> { 74 | if (!clazz.getName().equals(CApplication)) return; 75 | findAndHookMethod(clazz, "initTouTiaoAd", onReturnVoid); 76 | }); 77 | } 78 | } 79 | 80 | private static void LandscapeADActivity(){ 81 | final String LandscapeADActivity = "com.qq.e.ads.LandscapeADActivity"; 82 | final Class LandscapeADActivityClass = getClazz(LandscapeADActivity); 83 | if (LandscapeADActivityClass != null) try{ 84 | findAndHookConstructor(LandscapeADActivityClass, onReturnVoid); 85 | }catch (Throwable ignored){} 86 | } 87 | 88 | private static void PortraitADActivity(){ 89 | final String PortraitADActivity = "com.qq.e.ads.PortraitADActivity"; 90 | final Class PortraitADActivityClass = getClazz(PortraitADActivity); 91 | if (PortraitADActivityClass != null) try{ 92 | findAndHookConstructor(PortraitADActivityClass, onReturnVoid); 93 | }catch (Throwable ignored){} 94 | } 95 | 96 | private static void TKBaseTKView(){ 97 | final String[] ClassName = {"com.tachikoma.core.component.TKBase", "com.tachikoma.core.component.view.TKView"}; 98 | final String[] MethodName = {"addEventListener", "dispatchEvent", "removeEventListener"}; 99 | for (String clazz : ClassName) for (String method : MethodName){ 100 | try{ 101 | findAndHookMethod(getClazz(clazz), method, onReturnVoid); 102 | }catch (Throwable ignored){} 103 | } 104 | } 105 | 106 | private static void POFactoryImpl(){ 107 | final String POFactoryImpl = "com.qq.e.comm.plugin.POFactoryImpl"; 108 | final Class POFactoryImplClass = getClazz(POFactoryImpl); 109 | if (POFactoryImplClass != null) try { 110 | findAndHookConstructor(POFactoryImplClass, onReturnVoid); 111 | }catch (Throwable ignored){} 112 | } 113 | 114 | private static void ADActivity(){ 115 | final String ADActivity = "com.qq.e.ads.ADActivity"; 116 | final Class ADActivityClass = getClazz(ADActivity); 117 | if (ADActivityClass != null) try{ 118 | findAndHookMethod(ADActivityClass, "onCreate", Bundle.class, onActivityFinish(true)); 119 | }catch (Throwable ignored){} 120 | } 121 | 122 | private static void TempDealUtil() { 123 | final String TempDealUtil = TARGET_PACKAGE_NAME + ".ad.adv.channels.NgAdHelper.bean.TempDealUtil"; 124 | final String OnKpAdShowListener = TARGET_PACKAGE_NAME + "ad.adv.channels.NgAdHelper.bean.OnKpAdShowListener"; 125 | final Class TempDealUtilClass = getClazz(TempDealUtil); 126 | final Class OnKpAdShowListenerClass = getClazz(OnKpAdShowListener); 127 | if (TempDealUtilClass != null && OnKpAdShowListenerClass != null) try { 128 | findAndHookMethod(TempDealUtilClass, 129 | "showColdStartCp", Context.class, String.class, 130 | OnKpAdShowListenerClass, onReturnVoid 131 | ); 132 | } catch (Throwable ignored) {} 133 | } 134 | 135 | private static void NgSyCpAdHelp(){ 136 | final String NgSyCpAdHelp = TARGET_PACKAGE_NAME + ".ad.adv.channels.NgAdHelper.bean.NgSyCpAdHelp"; 137 | final String OnCpAdListener = TARGET_PACKAGE_NAME + ".ad.adv.channels.NgAdHelper.bean.OnCpAdListener"; 138 | final Class NgSyCpAdHelpClass = getClazz(NgSyCpAdHelp); 139 | final Class OnCpAdListenerClass = getClazz(OnCpAdListener); 140 | if (NgSyCpAdHelpClass != null && OnCpAdListenerClass != null) try { 141 | findAndHookMethod(NgSyCpAdHelpClass, "showCpAd", ViewGroup.class, 142 | OnCpAdListenerClass, onReturnVoid 143 | ); 144 | } catch (Throwable ignored) {} 145 | } 146 | 147 | private static void JDAdSplash(){ 148 | final String JDAdSplash = "com.ap.android.trunk.sdk.ad.wrapper.jd.JDAdSplash"; 149 | final Class JDAdSplashClass = getClazz(JDAdSplash); 150 | if (JDAdSplashClass != null) try { 151 | hookAllMethods(JDAdSplashClass, "realCreate", onReturnVoid); 152 | } catch (Throwable ignored) {} 153 | } 154 | 155 | private static void JDAdSDK(){ 156 | final String JDAdSDK = "com.ap.android.trunk.sdk.ad.wrapper.jd.JDAdSDK"; 157 | final Class JDAdSDKClass = getClazz(JDAdSDK); 158 | if (JDAdSDKClass != null) { 159 | try { 160 | hookAllMethods(JDAdSDKClass, "realInit", new XC_MethodHook() { 161 | @Override 162 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 163 | super.beforeHookedMethod(param); 164 | XposedBridge.log("进入hook"); 165 | } 166 | }); 167 | } catch (Throwable ignored) { 168 | } 169 | try { 170 | findAndHookMethod(JDAdSDKClass, "isSDKAvaliable", onSetResult(false, true)); 171 | } catch (Throwable ignored) { 172 | } 173 | }else inClassLoaderFindAndHook(clazz -> { 174 | if (!clazz.getName().equals(JDAdSDK)) return; 175 | XposedBridge.log("找到类" + clazz.getName()); 176 | try{ 177 | hookAllMethods(clazz, "realInit", new XC_MethodHook() { 178 | @Override 179 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 180 | super.beforeHookedMethod(param); 181 | XposedBridge.log("进入hook"); 182 | } 183 | }); 184 | }catch (Exception e){ 185 | XposedBridge.log("错误?" + e); 186 | } 187 | }); 188 | } 189 | 190 | private static void TTAdSdk(){ 191 | final String TTAdSdk = "com.bytedance.sdk.openadsdk.TTAdSdk"; 192 | final Class TTAdSdkClass = getClazz(TTAdSdk); 193 | if (TTAdSdkClass != null) try { 194 | hookAllMethods(TTAdSdkClass, "init", onReturnVoid); 195 | } catch (Throwable ignored) {} 196 | TTAdConfig(); 197 | } 198 | 199 | private static void TTAdConfig(){ 200 | final String TTAdConfig = "com.bytedance.sdk.openadsdk.TTAdConfig"; 201 | Class TTAdConfigClass = getClazz(TTAdConfig); 202 | if (TTAdConfigClass != null) try { 203 | findAndHookMethod(TTAdConfigClass, "getData", onSetResult("", true)); 204 | } catch (Throwable ignored) {} 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/hook/MethodHook.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.hook; 2 | 3 | import static de.robv.android.xposed.XposedBridge.*; 4 | import static de.robv.android.xposed.XposedHelpers.callMethod; 5 | import static ss.colytitse.fuckdmzj.MainHook.TARGET_PACKAGE_NAME; 6 | import static ss.colytitse.fuckdmzj.MainHook.getClazz; 7 | 8 | import android.annotation.SuppressLint; 9 | import android.app.Activity; 10 | import android.content.Context; 11 | import android.os.Build; 12 | import android.util.Log; 13 | import android.view.View; 14 | import android.view.Window; 15 | import android.view.WindowManager; 16 | import androidx.annotation.RequiresApi; 17 | 18 | import java.lang.reflect.Method; 19 | import java.lang.reflect.Modifier; 20 | import java.security.NoSuchAlgorithmException; 21 | import java.security.spec.InvalidKeySpecException; 22 | 23 | import de.robv.android.xposed.XC_MethodHook; 24 | import de.robv.android.xposed.XC_MethodReplacement; 25 | import de.robv.android.xposed.XposedBridge; 26 | import ss.colytitse.fuckdmzj.test.PublicContent; 27 | 28 | public final class MethodHook extends PublicContent { 29 | 30 | public static final XC_MethodReplacement onReturnVoid = new XC_MethodReplacement(){ 31 | @Override 32 | protected Object replaceHookedMethod(MethodHookParam param) { 33 | return null; 34 | } 35 | }; 36 | 37 | public static XC_MethodHook onSetResult(T value, boolean before){ 38 | return before ? new XC_MethodHook() { 39 | @Override 40 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 41 | super.beforeHookedMethod(param); 42 | param.setResult(value); 43 | } 44 | } : new XC_MethodHook() { 45 | @Override 46 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 47 | super.afterHookedMethod(param); 48 | param.setResult(value); 49 | } 50 | }; 51 | } 52 | 53 | public static XC_MethodHook onActivityFinish(boolean before) { 54 | return before ? new XC_MethodHook() { 55 | @Override 56 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 57 | super.beforeHookedMethod(param); 58 | Activity activity = (Activity) param.thisObject; 59 | activity.finish(); 60 | } 61 | } : new XC_MethodHook() { 62 | @Override 63 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 64 | super.afterHookedMethod(param); 65 | Activity activity = (Activity) param.thisObject; 66 | activity.finish(); 67 | } 68 | }; 69 | } 70 | 71 | @SuppressLint("NewApi") 72 | public static void setActivityFullscreen(Activity activity){ 73 | try { 74 | activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 75 | WindowManager.LayoutParams lp = activity.getWindow().getAttributes(); 76 | lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; 77 | activity.getWindow().setAttributes(lp); 78 | } catch (Exception ignored) {} 79 | } 80 | 81 | @SuppressLint("InlinedApi") 82 | public static void onSetActivityStatusBar(Activity activity, int color){ 83 | Window window = activity.getWindow(); 84 | View decorView = window.getDecorView(); 85 | window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 86 | window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 87 | decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 88 | window.setStatusBarColor(color); 89 | } 90 | 91 | public static XC_MethodHook onSetActivityStatusBar(int Color){ 92 | return new XC_MethodHook() { 93 | @Override @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 94 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 95 | super.afterHookedMethod(param); 96 | Activity activity = (Activity) param.thisObject; 97 | onSetActivityStatusBar(activity, Color); 98 | } 99 | }; 100 | } 101 | 102 | public static int getIdentifier(Context mContext, String defType, String name){ 103 | if (!defType.contains(":")) return mContext.getResources().getIdentifier(name, defType, TARGET_PACKAGE_NAME); 104 | String[] split = defType.split(":"); 105 | return mContext.getResources().getIdentifier(name, split[1], split[0]); 106 | } 107 | 108 | public static class FuckerHook { 109 | 110 | private static Class thisFuckerClass; 111 | public static final int BEFORE = -1; 112 | public static final int AFTER = 0; 113 | public static final int REPLACE = 1; 114 | 115 | // 在全部类加载器中查找并hook 116 | public static void inClassLoaderFindAndHook(Fucker fucker){ 117 | hookAllMethods(ClassLoader.class, "loadClass", new XC_MethodHook() { 118 | @Override 119 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 120 | super.afterHookedMethod(param); 121 | if (param.hasThrowable() || param.args.length != 1) return; 122 | try{ 123 | fucker.hook((Class) param.getResult()); 124 | }catch (Throwable ignored){} 125 | } 126 | }); 127 | } 128 | 129 | public static void newHookMethods(String className, String methodName, Object callBack){ 130 | Class clazz = getClazz(className); 131 | if(clazz != null) newHookMethods(getClazz(className), methodName, callBack); 132 | } 133 | 134 | public static void newHookMethods(Class clazz, String methodName, Object callBack){ 135 | newHookMethods(clazz, methodName, callBack, AFTER); 136 | } 137 | 138 | public static void newHookMethods(String className, String methodName, Object callBack, int callBackType){ 139 | Class clazz = getClazz(className); 140 | if(clazz != null) newHookMethods(clazz, methodName, callBack, callBackType); 141 | } 142 | 143 | public static void newHookMethods(Class clazz, String methodName, Object callBack, int callBackType){ 144 | new hookMethods(clazz, methodName, callBack, callBackType).run(); 145 | } 146 | 147 | public static Class getClass(String clazzName){ 148 | inClassLoaderFindAndHook(clazz -> { 149 | if (clazz.getName().equals(clazzName)) thisFuckerClass = clazz; 150 | else thisFuckerClass = null; 151 | }); 152 | return thisFuckerClass; 153 | } 154 | 155 | public static final class hookMethods{ 156 | 157 | private final Class targetClass; 158 | private final String targetMethodName; 159 | private final XC_MethodHook hookCallBack; 160 | 161 | public hookMethods(Class targetClazz, String methodName , Object callBack, int callBackType){ 162 | this.targetClass = targetClazz; 163 | this.targetMethodName = methodName; 164 | this.hookCallBack = new XC_MethodHook() { 165 | @Override 166 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 167 | super.beforeHookedMethod(param); 168 | if (!param.thisObject.getClass().equals(targetClass)) return; 169 | if (callBackType == REPLACE) 170 | param.setResult(((HookReplaceCallBack) callBack).hook(param)); 171 | else if (callBackType == BEFORE) 172 | ((HookCallBack) callBack).hook(param); 173 | } 174 | @Override 175 | protected void afterHookedMethod(MethodHookParam param) throws Throwable { 176 | super.afterHookedMethod(param); 177 | if (param.thisObject.getClass().equals(targetClass) && callBackType == AFTER) 178 | ((HookCallBack) callBack).hook(param); 179 | } 180 | }; 181 | } 182 | 183 | private void nextFindAndHooks(Class clazz) { 184 | int thisResult = 0; // 成功找到method的次数 185 | for (Method declaredMethod : clazz.getDeclaredMethods()) 186 | if (declaredMethod.getName().equals(targetMethodName)) try { 187 | ++thisResult; 188 | XposedBridge.hookMethod(declaredMethod, hookCallBack); 189 | } catch (Exception ignored) {} 190 | if (thisResult != 0) return; 191 | Class superclass = clazz.getSuperclass(); 192 | if (superclass != null) nextFindAndHooks(superclass); 193 | } 194 | 195 | public void run(){ 196 | nextFindAndHooks(targetClass); 197 | } 198 | } 199 | 200 | public interface Fucker { 201 | void hook(Class clazz); 202 | } 203 | public interface HookCallBack{ 204 | void hook(XC_MethodHook.MethodHookParam param); 205 | } 206 | public interface HookReplaceCallBack{ 207 | Object hook(XC_MethodHook.MethodHookParam param); 208 | } 209 | } 210 | } 211 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/hook/Others.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.hook; 2 | 3 | import static de.robv.android.xposed.XposedHelpers.*; 4 | import static ss.colytitse.fuckdmzj.MainHook.*; 5 | import static ss.colytitse.fuckdmzj.hook.MethodHook.*; 6 | import static ss.colytitse.fuckdmzj.hook.MethodHook.FuckerHook.*; 7 | import android.app.Activity; 8 | import android.content.ClipData; 9 | import android.content.ClipboardManager; 10 | import android.content.Context; 11 | import android.graphics.Color; 12 | import android.os.Build; 13 | import android.os.Bundle; 14 | import android.view.View; 15 | import android.widget.FrameLayout; 16 | 17 | import de.robv.android.xposed.XC_MethodHook; 18 | import ss.colytitse.fuckdmzj.test.PublicContent; 19 | 20 | public final class Others extends PublicContent { 21 | 22 | public static void initClassHooks(){ 23 | TeenagerModeDialogActivity(); 24 | allActivitySetStatusBar(); 25 | ActivityOptimization(); 26 | DoNotFuckMyClipboard(); 27 | AppUpDataHelper(); 28 | } 29 | 30 | // 获取状态栏高度 31 | private static int getStatusBarHeight(Context context) { 32 | int resourceId = getIdentifier(context, "android:dimen", "status_bar_height"); 33 | if (resourceId > 0) return context.getResources().getDimensionPixelSize(resourceId); 34 | return 0; 35 | } 36 | 37 | // 界面显示优化 38 | private static void ActivityOptimization(){ 39 | { // 漫画阅读界面 40 | final Class BrowseActivityAncestorsClass 41 | = getThisPackgeClass(".ui.BrowseActivityAncestors : .ui.abc.viewpager2.BrowseActivityAncestors4"); 42 | if (BrowseActivityAncestorsClass != null) try { 43 | newHookMethods(BrowseActivityAncestorsClass, "onStart", 44 | (HookCallBack) param -> setActivityFullscreen((Activity) param.thisObject) 45 | ); 46 | }catch (Throwable ignored){} 47 | } 48 | { // 小说阅读界面 49 | final Class NovelBrowseActivityClass = getThisPackgeClass(".ui.NovelBrowseActivity"); 50 | if (NovelBrowseActivityClass != null) try { 51 | newHookMethods(NovelBrowseActivityClass, "onStart", (HookCallBack) param -> { 52 | Activity activity = (Activity) param.thisObject; 53 | setActivityFullscreen(activity); 54 | View decorView = activity.getWindow().getDecorView(); 55 | decorView.post(() -> { 56 | if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)) return; 57 | if (!(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P)) return; 58 | if (decorView.getRootWindowInsets().getDisplayCutout() == null) return; 59 | try { 60 | int identifier = getIdentifier(activity.getApplicationContext(), "id", "framelayout"); 61 | FrameLayout framelayout = activity.findViewById(identifier); 62 | int left = framelayout.getPaddingStart(); 63 | int top = getStatusBarHeight((Context) param.thisObject); 64 | int right = framelayout.getPaddingEnd(); 65 | int bottom = framelayout.getPaddingBottom(); 66 | framelayout.setPadding(left, top, right, bottom); 67 | } catch (Throwable ignored) {} 68 | }); 69 | }); 70 | }catch (Throwable ignored){} 71 | } 72 | { // 分享页 73 | if (TARGET_PACKAGE_NAME.equals(DMZJ_PKGN)) { 74 | final Class ShareActivityClass = getThisPackgeClass(".ui.ShareActivity"); 75 | if (ShareActivityClass != null) try { 76 | newHookMethods(ShareActivityClass, "onStart",(HookCallBack) param -> { 77 | onSetActivityStatusBar((Activity) param.thisObject, 0x80000000); 78 | }); 79 | }catch (Throwable ignored){} 80 | }else { 81 | final Class ShareActivityV2Class = getThisPackgeClass(".ui.ShareActivityV2"); 82 | if (ShareActivityV2Class != null) try { 83 | newHookMethods(ShareActivityV2Class, "onStart", (HookCallBack) param -> { 84 | setActivityFullscreen((Activity) param.thisObject); 85 | }); 86 | }catch (Throwable ignored){} 87 | } 88 | } 89 | } 90 | 91 | // 状态栏优化 92 | private static void allActivitySetStatusBar(){ 93 | final XC_MethodHook setStatusBar = onSetActivityStatusBar(Color.WHITE); 94 | findAndHookMethod(Activity.class, "onCreate", Bundle.class, setStatusBar); 95 | } 96 | 97 | // 去除更新检测 98 | private static void AppUpDataHelper(){ 99 | newHookMethods("okhttp3.Request$Builder", "url", (HookCallBack) param -> { 100 | Object url = param.args[0]; 101 | if (url.getClass().equals(String.class) && ((String) url).contains("/dynamic/comicversion/android")) 102 | param.args[0] = "https://1919.114.514/"; 103 | }, BEFORE); 104 | } 105 | 106 | // 关闭傻逼青少年弹窗 107 | private static void TeenagerModeDialogActivity(){ 108 | final Class TeenagerModeDialogActivityClass = getThisPackgeClass("_kt.ui.TeenagerModeDialogActivity"); 109 | if (TeenagerModeDialogActivityClass != null) try { 110 | newHookMethods(TeenagerModeDialogActivityClass, "onStart", (HookCallBack) param -> { 111 | callMethod(param.thisObject, "finish"); 112 | }); 113 | } catch (Throwable ignored) {} 114 | } 115 | 116 | // 阻止剪切板被强○ 117 | private static void DoNotFuckMyClipboard(){ 118 | XC_MethodHook setPrimaryClip = new XC_MethodHook() { 119 | @Override 120 | protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 121 | super.beforeHookedMethod(param); 122 | ClipData clipData = (ClipData) param.args[0]; 123 | String inText = clipData.getItemAt(0).getText().toString().trim(); 124 | if ((boolean) (newMethodResult(() -> { 125 | String clazzName; 126 | for (StackTraceElement stack : Thread.currentThread().getStackTrace()) 127 | if ((clazzName = stack.getClassName()) != null && (clazzName.contains(DMZJ_PKGN) || clazzName.contains(DMZJSQ_PKGN))) 128 | return true; 129 | return false; 130 | }))) return; 131 | for(String reg : new String[]{".*[A-Z]+.*", ".*[a-z]+.*", ".*[~!@#$%^&*()_+|<>,.?/:;'\\\\[\\\\]{}\\\"]+.*"}) 132 | if (inText.matches(reg) && !(inText.contains("http") && (inText.contains("muwai.com") || inText.contains("dmzj.com")))) { 133 | param.args[0] = ClipData.newPlainText("",""); 134 | return; 135 | } 136 | } 137 | }; 138 | try { 139 | findAndHookMethod(ClipboardManager.class, "setPrimaryClip", ClipData.class, setPrimaryClip); 140 | }catch (Throwable ignored){} 141 | } 142 | } 143 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/test/PublicContent.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.test; 2 | 3 | import android.content.Context; 4 | import android.os.Looper; 5 | import android.util.Log; 6 | import android.widget.Toast; 7 | 8 | public class PublicContent extends printStackTrace { 9 | 10 | public static final String INFO = "definfo_"; 11 | public static final String TAG = "test_"; 12 | 13 | public static Object newMethodResult(MethodResult methodResult){ 14 | return newMethodResult(methodResult, TAG); 15 | } 16 | 17 | public static Object newMethodResult(MethodResult methodResult, String _tag){ 18 | try{ 19 | return methodResult.method(); 20 | }catch (Exception e){ 21 | if (_tag == null) _tag = TAG; 22 | Log.d(_tag, "newMethodResult Err: " + e); 23 | } 24 | return null; 25 | } 26 | 27 | 28 | public interface MethodResult{ 29 | Object method(); 30 | } 31 | 32 | public interface HandleLoad{ 33 | void load(); 34 | } 35 | public static void showToast(Context mContext, String text){ 36 | new Thread(() -> { 37 | Looper.prepare(); 38 | Toast.makeText( 39 | mContext, text, 40 | Toast.LENGTH_SHORT 41 | ).show(); 42 | Looper.loop(); 43 | }).start(); 44 | } 45 | } -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/test/printStackTrace.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.test; 2 | 3 | import static ss.colytitse.fuckdmzj.test.PublicContent.TAG; 4 | import static ss.colytitse.fuckdmzj.MainHook.DMZJ_PKGN; 5 | import android.annotation.SuppressLint; 6 | import android.util.Log; 7 | import java.lang.reflect.Method; 8 | import java.lang.reflect.Modifier; 9 | import java.util.Arrays; 10 | import de.robv.android.xposed.XC_MethodHook; 11 | import de.robv.android.xposed.XposedBridge; 12 | 13 | public class printStackTrace { 14 | 15 | @SuppressLint("NewApi") 16 | public static void setStackTracePrint(){ 17 | StackTraceElement[] stackTraceElement = Thread.currentThread().getStackTrace(); 18 | Log.d(TAG, "#############################[start]#############################"); 19 | Arrays.stream(stackTraceElement).forEach(stack -> Log.d(TAG, 20 | "at " + stack.getClassName() + "." 21 | + stack.getMethodName() + 22 | "(" + stack.getFileName() + 23 | ":" + stack.getLineNumber() + ")")); 24 | Log.d(TAG, "#############################[end]#############################"); 25 | } 26 | 27 | public static void setMethodInvokePrint(Class clazz) { 28 | String clazzName = clazz.getName(); 29 | if (!clazzName.contains(DMZJ_PKGN)) return; 30 | Method[] mds = clazz.getDeclaredMethods(); 31 | for (final Method md : mds) { 32 | int mod = md.getModifiers(); 33 | if (!Modifier.isAbstract(mod) && !Modifier.isNative(mod) && !Modifier.isInterface(mod)) { 34 | XposedBridge.hookMethod(md, new XC_MethodHook() { 35 | public void beforeHookedMethod(MethodHookParam param) throws Throwable { 36 | Log.d(TAG, clazzName + " -> " + md.getName() + " :args[" + Arrays.toString(param.args) + "]"); 37 | } 38 | }); 39 | } 40 | } 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/tool/Base64Util.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.tool; 2 | 3 | public class Base64Util { 4 | 5 | static private final int BASELENGTH = 128; 6 | static private final int FOURBYTE = 4; 7 | static private final char PAD = '='; 8 | static final private byte[] base64Alphabet = new byte[BASELENGTH]; 9 | 10 | static { 11 | for (int i = 0; i < BASELENGTH; ++i) 12 | base64Alphabet[i] = -1; 13 | for (int i = 'Z'; i >= 'A'; i--) 14 | base64Alphabet[i] = (byte) (i - 'A'); 15 | for (int i = 'z'; i >= 'a'; i--) 16 | base64Alphabet[i] = (byte) (i - 'a' + 26); 17 | for (int i = '9'; i >= '0'; i--) 18 | base64Alphabet[i] = (byte) (i - '0' + 52); 19 | base64Alphabet['+'] = 62; 20 | base64Alphabet['/'] = 63; 21 | } 22 | 23 | private static boolean isWhiteSpace(char octect) { 24 | return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); 25 | } 26 | 27 | private static boolean isPad(char octect) { 28 | return (octect == PAD); 29 | } 30 | 31 | private static boolean isData(char octect) { 32 | return (octect >= BASELENGTH || base64Alphabet[octect] == -1); 33 | } 34 | 35 | public static byte[] decode(String encoded) { 36 | if (encoded == null) { 37 | return null; 38 | } 39 | char[] base64Data = encoded.toCharArray(); 40 | int len = removeWhiteSpace(base64Data); 41 | if (len % FOURBYTE != 0) return null; 42 | int numberQuadruple = (len / FOURBYTE); 43 | if (numberQuadruple == 0) return new byte[0]; 44 | byte[] decodedData; 45 | byte b1, b2, b3, b4; 46 | char d1, d3, d2, d4; 47 | int i = 0; 48 | int encodedIndex = 0; 49 | int dataIndex = 0; 50 | decodedData = new byte[(numberQuadruple) * 3]; 51 | for (; i < numberQuadruple - 1; i++) { 52 | if (isData((d1 = base64Data[dataIndex++])) || isData((d2 = base64Data[dataIndex++])) 53 | || isData((d3 = base64Data[dataIndex++])) 54 | || isData((d4 = base64Data[dataIndex++]))) return null; 55 | b1 = base64Alphabet[d1]; 56 | b2 = base64Alphabet[d2]; 57 | b3 = base64Alphabet[d3]; 58 | b4 = base64Alphabet[d4]; 59 | decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); 60 | decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); 61 | decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); 62 | } 63 | if (isData((d1 = base64Data[dataIndex++])) || isData((d2 = base64Data[dataIndex++]))) { 64 | return null; 65 | } 66 | b1 = base64Alphabet[d1]; 67 | b2 = base64Alphabet[d2]; 68 | d3 = base64Data[dataIndex++]; 69 | d4 = base64Data[dataIndex]; 70 | if (isData((d3)) || isData((d4))) {//Check if they are PAD characters 71 | if (isPad(d3) && isPad(d4)) { 72 | if ((b2 & 0xf) != 0) return null; 73 | byte[] tmp = new byte[i * 3 + 1]; 74 | System.arraycopy(decodedData, 0, tmp, 0, i * 3); 75 | tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); 76 | return tmp; 77 | } else if (!isPad(d3) && isPad(d4)) { 78 | b3 = base64Alphabet[d3]; 79 | if ((b3 & 0x3) != 0) return null; 80 | byte[] tmp = new byte[i * 3 + 2]; 81 | System.arraycopy(decodedData, 0, tmp, 0, i * 3); 82 | tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); 83 | tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); 84 | return tmp; 85 | } else return null; 86 | } else { 87 | b3 = base64Alphabet[d3]; 88 | b4 = base64Alphabet[d4]; 89 | decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); 90 | decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); 91 | decodedData[encodedIndex] = (byte) (b3 << 6 | b4); 92 | } 93 | return decodedData; 94 | } 95 | 96 | private static int removeWhiteSpace(char[] data) { 97 | if (data == null) return 0; 98 | int newSize = 0; 99 | int len = data.length; 100 | for (int i = 0; i < len; i++) 101 | if (!isWhiteSpace(data[i])) 102 | data[newSize++] = data[i]; 103 | return newSize; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/tool/OkHttp.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.tool; 2 | 3 | import static de.robv.android.xposed.XposedHelpers.callMethod; 4 | import static ss.colytitse.fuckdmzj.MainHook.getClazz; 5 | 6 | import ss.colytitse.fuckdmzj.test.PublicContent; 7 | 8 | public final class OkHttp extends PublicContent { 9 | 10 | private static Class RequestBuilderClass = null; 11 | private static Class OkHttpClientClass = null; 12 | private static boolean InitComplete = false; 13 | 14 | public static boolean init(){ 15 | if (InitComplete) return true; 16 | RequestBuilderClass = getClazz("okhttp3.Request$Builder"); 17 | OkHttpClientClass = getClazz("okhttp3.OkHttpClient"); 18 | InitComplete = RequestBuilderClass != null && OkHttpClientClass != null; 19 | return InitComplete; 20 | } 21 | 22 | public static Object RequestBuilder(String url) throws Exception { 23 | if (!OkHttp.init()) return null; 24 | Object requestBuilder = RequestBuilderClass.newInstance(); 25 | requestBuilder = callMethod(requestBuilder, "url", url); 26 | return callMethod(requestBuilder, "build"); 27 | } 28 | 29 | public static String ResponseBodyString(Object Request) throws Exception{ 30 | if (!OkHttp.init()) return null; 31 | Object OkHttpClient = OkHttpClientClass.newInstance(); 32 | Object newCall = callMethod(OkHttpClient, "newCall", Request); 33 | Object Response = callMethod(newCall, "execute"); 34 | Object ResponseBody = callMethod(Response, "body"); 35 | return (String) callMethod(ResponseBody, "string"); 36 | } 37 | } 38 | 39 | -------------------------------------------------------------------------------- /app/src/main/java/ss/colytitse/fuckdmzj/tool/RSAUtils.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj.tool; 2 | 3 | import java.io.ByteArrayInputStream; 4 | import java.io.ByteArrayOutputStream; 5 | import java.io.InputStream; 6 | import java.nio.charset.StandardCharsets; 7 | import java.security.KeyFactory; 8 | import java.security.PrivateKey; 9 | import java.security.spec.PKCS8EncodedKeySpec; 10 | import javax.crypto.Cipher; 11 | 12 | public class RSAUtils { 13 | 14 | public static String decrypt(String content, String private_key) throws Exception { 15 | PrivateKey priKey = getPrivateKey(private_key); 16 | Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 17 | cipher.init(Cipher.DECRYPT_MODE, priKey); 18 | InputStream ins = new ByteArrayInputStream(Base64Util.decode(content)); 19 | ByteArrayOutputStream writer = new ByteArrayOutputStream(); 20 | byte[] buf = new byte[128]; 21 | int bufl; 22 | while ((bufl = ins.read(buf)) != -1) { 23 | byte[] block; 24 | if (buf.length == bufl) block = buf; 25 | else { 26 | block = new byte[bufl]; 27 | System.arraycopy(buf, 0, block, 0, bufl); 28 | } 29 | writer.write(cipher.doFinal(block)); 30 | } 31 | return new String(writer.toByteArray(), StandardCharsets.UTF_8); 32 | } 33 | 34 | public static PrivateKey getPrivateKey(String key) throws Exception { 35 | byte[] keyBytes; 36 | keyBytes = Base64Util.decode(key); 37 | PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); 38 | KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 39 | return keyFactory.generatePrivate(keySpec); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_icon_clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/img_icon_clock.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_icon_head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/img_icon_head.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_icon_tag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/img_icon_tag.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_lauch_bitch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/img_lauch_bitch.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/img_layout_neko.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/img_layout_neko.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable/info_background_1.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/info_background_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/kyaru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/kyaru.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/main_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/main_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/main_icon.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/sc_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/task_bg1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/drawable/task_bg1.png -------------------------------------------------------------------------------- /app/src/main/res/layout/main_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 15 | 28 | 29 | 32 | 40 | 48 | 54 | 65 | 79 | 85 | 86 | 100 | 106 | 107 | 123 | 124 | 125 | 131 | 141 | 142 | 152 | 153 | 158 | 159 | 160 | 161 | 162 | -------------------------------------------------------------------------------- /app/src/main/res/layout/test_layout.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 15 | 20 | 27 | 31 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/fk_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/mipmap-hdpi/fk_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/fk_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/mipmap-mdpi/fk_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/fk_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/mipmap-xhdpi/fk_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/fk_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/mipmap-xxhdpi/fk_icon.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/fk_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/app/src/main/res/mipmap-xxxhdpi/fk_icon.png -------------------------------------------------------------------------------- /app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | #FFFFFF 5 | @color/main_color 6 | #212121 7 | #FFFFFF 8 | #FFFFFF 9 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | #FFFFFF 11 | #000000 12 | #000000 13 | #212121 14 | @color/main_color 15 | #3F4245 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | com.dmzj.manhua 5 | com.dmzjsq.manhua 6 | 7 | 优化净化大妈之家。仅供技术交流使用,严禁特殊用途! 8 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 去你妈的DM之家\nFuckDMZJXposed 3 | -------------------------------------------------------------------------------- /app/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /app/src/test/java/ss/colytitse/fuckdmzj/Base64Util.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj; 2 | 3 | public final class Base64Util { 4 | 5 | static private final int BASELENGTH = 128; 6 | static private final int FOURBYTE = 4; 7 | static private final char PAD = '='; 8 | static final private byte[] base64Alphabet = new byte[BASELENGTH]; 9 | 10 | static { 11 | for (int i = 0; i < BASELENGTH; ++i) 12 | base64Alphabet[i] = -1; 13 | for (int i = 'Z'; i >= 'A'; i--) 14 | base64Alphabet[i] = (byte) (i - 'A'); 15 | for (int i = 'z'; i >= 'a'; i--) 16 | base64Alphabet[i] = (byte) (i - 'a' + 26); 17 | for (int i = '9'; i >= '0'; i--) 18 | base64Alphabet[i] = (byte) (i - '0' + 52); 19 | base64Alphabet['+'] = 62; 20 | base64Alphabet['/'] = 63; 21 | } 22 | 23 | private static boolean isWhiteSpace(char octect) { 24 | return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); 25 | } 26 | 27 | private static boolean isPad(char octect) { 28 | return (octect == PAD); 29 | } 30 | 31 | private static boolean isData(char octect) { 32 | return (octect >= BASELENGTH || base64Alphabet[octect] == -1); 33 | } 34 | 35 | public static byte[] decode(String encoded) { 36 | if (encoded == null) { 37 | return null; 38 | } 39 | char[] base64Data = encoded.toCharArray(); 40 | int len = removeWhiteSpace(base64Data); 41 | if (len % FOURBYTE != 0) return null; 42 | int numberQuadruple = (len / FOURBYTE); 43 | if (numberQuadruple == 0) return new byte[0]; 44 | byte[] decodedData; 45 | byte b1, b2, b3, b4; 46 | char d1, d3, d2, d4; 47 | int i = 0; 48 | int encodedIndex = 0; 49 | int dataIndex = 0; 50 | decodedData = new byte[(numberQuadruple) * 3]; 51 | for (; i < numberQuadruple - 1; i++) { 52 | if (isData((d1 = base64Data[dataIndex++])) || isData((d2 = base64Data[dataIndex++])) 53 | || isData((d3 = base64Data[dataIndex++])) 54 | || isData((d4 = base64Data[dataIndex++]))) return null; 55 | b1 = base64Alphabet[d1]; 56 | b2 = base64Alphabet[d2]; 57 | b3 = base64Alphabet[d3]; 58 | b4 = base64Alphabet[d4]; 59 | decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); 60 | decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); 61 | decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); 62 | } 63 | if (isData((d1 = base64Data[dataIndex++])) || isData((d2 = base64Data[dataIndex++]))) { 64 | return null; 65 | } 66 | b1 = base64Alphabet[d1]; 67 | b2 = base64Alphabet[d2]; 68 | d3 = base64Data[dataIndex++]; 69 | d4 = base64Data[dataIndex]; 70 | if (isData((d3)) || isData((d4))) {//Check if they are PAD characters 71 | if (isPad(d3) && isPad(d4)) { 72 | if ((b2 & 0xf) != 0) return null; 73 | byte[] tmp = new byte[i * 3 + 1]; 74 | System.arraycopy(decodedData, 0, tmp, 0, i * 3); 75 | tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); 76 | return tmp; 77 | } else if (!isPad(d3) && isPad(d4)) { 78 | b3 = base64Alphabet[d3]; 79 | if ((b3 & 0x3) != 0) return null; 80 | byte[] tmp = new byte[i * 3 + 2]; 81 | System.arraycopy(decodedData, 0, tmp, 0, i * 3); 82 | tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); 83 | tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); 84 | return tmp; 85 | } else return null; 86 | } else { 87 | b3 = base64Alphabet[d3]; 88 | b4 = base64Alphabet[d4]; 89 | decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); 90 | decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); 91 | decodedData[encodedIndex] = (byte) (b3 << 6 | b4); 92 | } 93 | return decodedData; 94 | } 95 | 96 | private static int removeWhiteSpace(char[] data) { 97 | if (data == null) return 0; 98 | int newSize = 0; 99 | int len = data.length; 100 | for (int i = 0; i < len; i++) 101 | if (!isWhiteSpace(data[i])) 102 | data[newSize++] = data[i]; 103 | return newSize; 104 | } 105 | } -------------------------------------------------------------------------------- /app/src/test/java/ss/colytitse/fuckdmzj/ExampleUnitTest.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj; 2 | 3 | 4 | import android.util.Log; 5 | 6 | import org.junit.Test; 7 | 8 | 9 | 10 | /** 11 | * Example local unit test, which will execute on the development machine (host). 12 | * 13 | * @see Testing documentation 14 | */ 15 | public class ExampleUnitTest { 16 | 17 | static final String RSA_KEY = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAK8nNR1lTnIfIes6oRW" + 18 | "JNj3mB6OssDGx0uGMpgpbVCpf6+VwnuI2stmhZNoQcM417Iz7WqlPzbUmu9R4dEKmLGEEqOhOdVaeh9Xk2IPPjqIu5Tbk" + 19 | "LZRxkY3dJM1htbz57d/roesJLkZXqssfG5EJauNc+RcABTfLb4IiFjSMlTsnAgMBAAECgYEAiz/pi2hKOJKlvcTL4jpHJ" + 20 | "Gjn8+lL3wZX+LeAHkXDoTjHa47g0knYYQteCbv+YwMeAGupBWiLy5RyyhXFoGNKbbnvftMYK56hH+iqxjtDLnjSDKWnhc" + 21 | "B7089sNKaEM9Ilil6uxWMrMMBH9v2PLdYsqMBHqPutKu/SigeGPeiB7VECQQDizVlNv67go99QAIv2n/ga4e0wLizVuaN" + 22 | "BXE88AdOnaZ0LOTeniVEqvPtgUk63zbjl0P/pzQzyjitwe6HoCAIpAkEAxbOtnCm1uKEp5HsNaXEJTwE7WQf7PrLD4+Bp" + 23 | "GtNKkgja6f6F4ld4QZ2TQ6qvsCizSGJrjOpNdjVGJ7bgYMcczwJBALvJWPLmDi7ToFfGTB0EsNHZVKE66kZ/8Stx+ezue" + 24 | "ke4S556XplqOflQBjbnj2PigwBN/0afT+QZUOBOjWzoDJkCQClzo+oDQMvGVs9GEajS/32mJ3hiWQZrWvEzgzYRqSf3XV" + 25 | "cEe7PaXSd8z3y3lACeeACsShqQoc8wGlaHXIJOHTcCQQCZw5127ZGs8ZDTSrogrH73Kw/HvX55wGAeirKYcv28eauveCG" + 26 | "7iyFR0PFB/P/EDZnyb+ifvyEFlucPUI0+Y87F"; 27 | 28 | @Test 29 | public void addition_isCorrect(){ 30 | String data = "EcvVJ01JblNrJ50ur6H+4ddxxqVHrX8iw8Lfp60sj6MheByad0Eeqc9EKrFZd/++JAJBpd44gbGV3frVBEXNy0sorgub657W997YPzEFUpM3+BU9RpELXwdr+bQz474YzvSpO222qgmaUsC1OwVgiLNfWWQoCHIxlV8IGO/W9sc="; 31 | try { 32 | String decrypt = RSAUtils.decrypt(data, RSA_KEY); 33 | System.out.println(decrypt); 34 | } catch (Exception e) { 35 | System.out.println("喵咪喵?" + e); 36 | } 37 | } 38 | 39 | 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/src/test/java/ss/colytitse/fuckdmzj/RSAUtils.java: -------------------------------------------------------------------------------- 1 | package ss.colytitse.fuckdmzj; 2 | 3 | import android.util.Base64; 4 | 5 | import java.io.ByteArrayInputStream; 6 | import java.io.ByteArrayOutputStream; 7 | import java.io.InputStream; 8 | import java.nio.charset.StandardCharsets; 9 | import java.security.KeyFactory; 10 | import java.security.PrivateKey; 11 | import java.security.spec.PKCS8EncodedKeySpec; 12 | import javax.crypto.Cipher; 13 | 14 | public class RSAUtils { 15 | 16 | public static String decrypt(String content, String private_key) throws Exception { 17 | PrivateKey priKey = getPrivateKey(private_key); 18 | Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 19 | cipher.init(Cipher.DECRYPT_MODE, priKey); 20 | InputStream ins = new ByteArrayInputStream(Base64Util.decode(content)); 21 | ByteArrayOutputStream writer = new ByteArrayOutputStream(); 22 | byte[] buf = new byte[128]; 23 | int bufl; 24 | while ((bufl = ins.read(buf)) != -1) { 25 | byte[] block; 26 | if (buf.length == bufl) { 27 | block = buf; 28 | } else { 29 | block = new byte[bufl]; 30 | System.arraycopy(buf, 0, block, 0, bufl); 31 | } 32 | writer.write(cipher.doFinal(block)); 33 | } 34 | return new String(writer.toByteArray(), StandardCharsets.UTF_8); 35 | } 36 | 37 | public static PrivateKey getPrivateKey(String key) throws Exception { 38 | byte[] keyBytes; 39 | keyBytes = Base64Util.decode(key); 40 | PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes); 41 | KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 42 | return keyFactory.generatePrivate(keySpec); 43 | } 44 | 45 | 46 | } -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:7.3.0' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | task clean(type: Delete) { 15 | delete rootProject.buildDir 16 | } 17 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sat Oct 09 22:55:40 CST 2021 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega 90 | -------------------------------------------------------------------------------- /image0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/image0.png -------------------------------------------------------------------------------- /image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cokkeijigen/FuckDMZJ/1309a27611595c23b44a16b49c44a913008760b9/image1.png -------------------------------------------------------------------------------- /local.properties: -------------------------------------------------------------------------------- 1 | ## This file must *NOT* be checked into Version Control Systems, 2 | # as it contains information specific to your local configuration. 3 | # 4 | # Location of the SDK. This is only used by Gradle. 5 | # For customization when using a Version Control System, please read the 6 | # header note. 7 | #Fri Nov 26 17:28:55 CST 2021 8 | sdk.dir=D\:\\Android\\Sdk 9 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 3 | repositories { 4 | google() 5 | mavenCentral() 6 | jcenter() // Warning: this repository is going to shut down soon 7 | } 8 | } 9 | rootProject.name = "FuckDMZJ" 10 | include ':app' 11 | --------------------------------------------------------------------------------