├── .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 | 
5 | 
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 |
--------------------------------------------------------------------------------