-
Notifications
You must be signed in to change notification settings - Fork 187
Expand file tree
/
Copy pathWppXposed.java
More file actions
162 lines (131 loc) · 6.71 KB
/
WppXposed.java
File metadata and controls
162 lines (131 loc) · 6.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package com.wmods.wppenhacer;
import android.annotation.SuppressLint;
import android.content.ContextWrapper;
import android.content.res.XModuleResources;
import android.view.Window;
import android.view.WindowManager;
import android.view.View; // Added for Visibility
import androidx.annotation.NonNull;
import androidx.preference.PreferenceManager;
import com.wmods.wppenhacer.activities.MainActivity;
import com.wmods.wppenhacer.xposed.AntiUpdater;
import com.wmods.wppenhacer.xposed.bridge.ScopeHook;
import com.wmods.wppenhacer.xposed.core.FeatureLoader;
import com.wmods.wppenhacer.xposed.downgrade.Patch;
import com.wmods.wppenhacer.xposed.spoofer.HookBL;
import com.wmods.wppenhacer.xposed.utils.ResId;
import de.robv.android.xposed.IXposedHookInitPackageResources;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.IXposedHookZygoteInit;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XSharedPreferences;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_InitPackageResources;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import de.robv.android.xposed.callbacks.XC_LayoutInflated; // Added for Layout Hooking
public class WppXposed implements IXposedHookLoadPackage, IXposedHookInitPackageResources, IXposedHookZygoteInit {
private static XSharedPreferences pref;
private String MODULE_PATH;
public static XC_InitPackageResources.InitPackageResourcesParam ResParam;
@NonNull
public static XSharedPreferences getPref() {
if (pref == null) {
pref = new XSharedPreferences(BuildConfig.APPLICATION_ID, BuildConfig.APPLICATION_ID + "_preferences");
pref.makeWorldReadable();
pref.reload();
}
return pref;
}
@SuppressLint("WorldReadableFiles")
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
var packageName = lpparam.packageName;
var classLoader = lpparam.classLoader;
if (packageName.equals(BuildConfig.APPLICATION_ID)) {
XposedHelpers.findAndHookMethod(MainActivity.class.getName(), lpparam.classLoader, "isXposedEnabled", XC_MethodReplacement.returnConstant(true));
XposedHelpers.findAndHookMethod(PreferenceManager.class.getName(), lpparam.classLoader, "getDefaultSharedPreferencesMode", XC_MethodReplacement.returnConstant(ContextWrapper.MODE_WORLD_READABLE));
return;
}
AntiUpdater.hookSession(lpparam);
Patch.handleLoadPackage(lpparam, getPref());
ScopeHook.hook(lpparam);
// AndroidPermissions.hook(lpparam); in tests
if ((packageName.equals(FeatureLoader.PACKAGE_WPP) && App.isOriginalPackage()) || packageName.equals(FeatureLoader.PACKAGE_BUSINESS)) {
XposedBridge.log("[•] This package: " + lpparam.packageName);
// Load features
FeatureLoader.start(classLoader, getPref(), lpparam.appInfo.sourceDir);
disableSecureFlag();
}
}
@Override
public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
var packageName = resparam.packageName;
if (!packageName.equals(FeatureLoader.PACKAGE_WPP) && !packageName.equals(FeatureLoader.PACKAGE_BUSINESS))
return;
XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
ResParam = resparam;
// --- EXISTING RESOURCE INJECTION CODE ---
for (var field : ResId.string.class.getFields()) {
var field1 = R.string.class.getField(field.getName());
field.set(null, resparam.res.addResource(modRes, field1.getInt(null)));
}
for (var field : ResId.array.class.getFields()) {
var field1 = R.array.class.getField(field.getName());
field.set(null, resparam.res.addResource(modRes, field1.getInt(null)));
}
for (var field : ResId.drawable.class.getFields()) {
var field1 = R.drawable.class.getField(field.getName());
field.set(null, resparam.res.addResource(modRes, field1.getInt(null)));
}
// --- NEW CODE: HIDE PROFILE PICTURE (DP) ---
try {
// "conversations_row" WhatsApp ki chat list ka layout name hai
resparam.res.hookLayout(packageName, "layout", "conversations_row", new XC_LayoutInflated() {
@Override
public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable {
// "contact_photo" DP ka ID hai
int photoId = liparam.res.getIdentifier("contact_photo", "id", packageName);
if (photoId != 0) {
View photoView = liparam.view.findViewById(photoId);
if (photoView != null) {
// DP ko Gayab (GONE) kar rahe hain
photoView.setVisibility(View.GONE);
// Optional: Width bhi 0 kar dete hain taki khali jagah na bache
android.view.ViewGroup.LayoutParams params = photoView.getLayoutParams();
params.width = 0;
photoView.setLayoutParams(params);
}
}
}
});
XposedBridge.log("WA Enhancer: DP Hidden Hook Applied");
} catch (Throwable t) {
XposedBridge.log(t);
}
// -------------------------------------------
}
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
MODULE_PATH = startupParam.modulePath;
}
public void disableSecureFlag() {
XposedHelpers.findAndHookMethod(Window.class, "setFlags", int.class, int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[0] = (int) param.args[0] & ~WindowManager.LayoutParams.FLAG_SECURE;
param.args[1] = (int) param.args[1] & ~WindowManager.LayoutParams.FLAG_SECURE;
}
});
XposedHelpers.findAndHookMethod(Window.class, "addFlags", int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
param.args[0] = (int) param.args[0] & ~WindowManager.LayoutParams.FLAG_SECURE;
if ((int) param.args[0] == 0) {
param.setResult(null);
}
}
});
}
}