Skip to content

Commit ba93429

Browse files
committed
Refactor JID class resolution to use dynamic suffix matching across components
Signed-off-by: Dev4Mod <[email protected]>
1 parent c8415dc commit ba93429

File tree

10 files changed

+53
-33
lines changed

10 files changed

+53
-33
lines changed

app/src/main/java/com/wmods/wppenhacer/adapter/IGStatusAdapter.java

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import androidx.annotation.NonNull;
2323
import androidx.annotation.Nullable;
2424

25-
import com.wmods.wppenhacer.R;
2625
import com.wmods.wppenhacer.views.dialog.TabDialogContent;
2726
import com.wmods.wppenhacer.xposed.core.WppCore;
2827
import com.wmods.wppenhacer.xposed.core.components.FMessageWpp;
@@ -33,6 +32,8 @@
3332
import com.wmods.wppenhacer.xposed.utils.ResId;
3433
import com.wmods.wppenhacer.xposed.utils.Utils;
3534

35+
import org.luckypray.dexkit.query.enums.StringMatchType;
36+
3637
import java.lang.reflect.Method;
3738
import java.util.Arrays;
3839
import java.util.Objects;
@@ -176,17 +177,23 @@ public void setInfo(Object item) {
176177
setCountStatus(0, 0);
177178
return;
178179
}
179-
var statusInfo = XposedHelpers.getObjectField(item, "A01");
180-
var field = ReflectionUtils.getFieldByExtendType(statusInfo.getClass(), XposedHelpers.findClass("com.whatsapp.jid.Jid", statusInfoClazz.getClassLoader()));
181-
this.userJid = new FMessageWpp.UserJid(ReflectionUtils.getObjectField(field, statusInfo));
182-
var contactName = WppCore.getContactName(this.userJid);
183-
igStatusContactName.setText(contactName);
184-
var profile = WppCore.getContactPhotoDrawable(this.userJid.getPhoneRawString());
185-
if (profile == null) profile = Utils.getApplication().getDrawable(ResId.drawable.user_foreground);
186-
igStatusContactPhoto.setImageDrawable(profile);
187-
var countUnseen = XposedHelpers.getIntField(statusInfo, "A01");
188-
var total = XposedHelpers.getIntField(statusInfo, "A00");
189-
setCountStatus(countUnseen, total);
180+
try {
181+
var statusInfo = XposedHelpers.getObjectField(item, "A01");
182+
var classJid = Unobfuscator.findFirstClassUsingName(statusInfoClazz.getClassLoader(), StringMatchType.EndsWith, "jid.Jid");
183+
var field = ReflectionUtils.getFieldByExtendType(statusInfo.getClass(), classJid);
184+
this.userJid = new FMessageWpp.UserJid(ReflectionUtils.getObjectField(field, statusInfo));
185+
var contactName = WppCore.getContactName(this.userJid);
186+
igStatusContactName.setText(contactName);
187+
var profile = WppCore.getContactPhotoDrawable(this.userJid.getPhoneRawString());
188+
if (profile == null)
189+
profile = Utils.getApplication().getDrawable(ResId.drawable.user_foreground);
190+
igStatusContactPhoto.setImageDrawable(profile);
191+
var countUnseen = XposedHelpers.getIntField(statusInfo, "A01");
192+
var total = XposedHelpers.getIntField(statusInfo, "A00");
193+
setCountStatus(countUnseen, total);
194+
} catch (Exception e) {
195+
XposedBridge.log(e);
196+
}
190197
}
191198

192199
public void setCountStatus(int countUnseen, int total) {

app/src/main/java/com/wmods/wppenhacer/xposed/core/components/FMessageWpp.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
99
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
1010

11+
import org.luckypray.dexkit.query.enums.StringMatchType;
12+
1113
import java.io.File;
1214
import java.lang.reflect.Field;
1315
import java.lang.reflect.Method;
@@ -45,14 +47,14 @@ public FMessageWpp(Object fMessage) {
4547
public static void initialize(ClassLoader classLoader) {
4648
try {
4749
TYPE = Unobfuscator.loadFMessageClass(classLoader);
48-
var userJidClass = classLoader.loadClass("com.whatsapp.jid.UserJid");
50+
var userJidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.UserJid");
4951
userJidMethod = ReflectionUtils.findMethodUsingFilter(TYPE, method -> method.getParameterCount() == 0 && method.getReturnType() == userJidClass);
5052
keyMessage = Unobfuscator.loadMessageKeyField(classLoader);
5153
Key.TYPE = keyMessage.getType();
5254
messageMethod = Unobfuscator.loadNewMessageMethod(classLoader);
5355
messageWithMediaMethod = Unobfuscator.loadNewMessageWithMediaMethod(classLoader);
5456
getFieldIdMessage = Unobfuscator.loadSetEditMessageField(classLoader);
55-
var deviceJidClass = XposedHelpers.findClass("com.whatsapp.jid.DeviceJid", classLoader);
57+
var deviceJidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.DeviceJid");
5658
deviceJidField = ReflectionUtils.findFieldUsingFilter(TYPE, field -> field.getType() == deviceJidClass);
5759
mediaTypeField = Unobfuscator.loadMediaTypeField(classLoader);
5860
getOriginalMessageKey = Unobfuscator.loadOriginalMessageKey(classLoader);

app/src/main/java/com/wmods/wppenhacer/xposed/core/components/WaContactWpp.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
44
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
55

6+
import org.luckypray.dexkit.query.enums.StringMatchType;
7+
68
import java.lang.reflect.Field;
79

810
import de.robv.android.xposed.XposedBridge;
@@ -25,15 +27,18 @@ public WaContactWpp(Object object) {
2527
public static void initialize(ClassLoader classLoader) {
2628
try {
2729
TYPE = Unobfuscator.loadWaContactClass(classLoader);
28-
var phoneUserJid = ReflectionUtils.getFieldByExtendType(TYPE, "com.whatsapp.jid.PhoneUserJid");
30+
var classPhoneUserJid = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.PhoneUserJid");
31+
var classJid = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.Jid");
32+
33+
var phoneUserJid = ReflectionUtils.getFieldByExtendType(TYPE, classPhoneUserJid);
2934
if (phoneUserJid == null) {
3035
var contactDataClass = Unobfuscator.loadWaContactData(classLoader);
3136
fieldContactData = ReflectionUtils.getFieldByType(TYPE, contactDataClass);
32-
fieldUserJid = ReflectionUtils.getFieldByExtendType(contactDataClass, "com.whatsapp.jid.Jid");
33-
fieldPhoneUserJid = ReflectionUtils.getFieldByExtendType(contactDataClass, "com.whatsapp.jid.PhoneUserJid");
37+
fieldUserJid = ReflectionUtils.getFieldByExtendType(contactDataClass, classJid);
38+
fieldPhoneUserJid = ReflectionUtils.getFieldByExtendType(contactDataClass, classPhoneUserJid);
3439
} else {
35-
fieldUserJid = ReflectionUtils.getFieldByExtendType(TYPE, "com.whatsapp.jid.Jid");
36-
fieldPhoneUserJid = ReflectionUtils.getFieldByExtendType(TYPE, "com.whatsapp.jid.PhoneUserJid");
40+
fieldUserJid = ReflectionUtils.getFieldByExtendType(TYPE, classJid);
41+
fieldPhoneUserJid = ReflectionUtils.getFieldByExtendType(TYPE, classPhoneUserJid);
3742
}
3843
} catch (Exception e) {
3944
XposedBridge.log(e);

app/src/main/java/com/wmods/wppenhacer/xposed/core/devkit/Unobfuscator.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,11 +205,12 @@ public synchronized static Method loadGhostModeMethod(ClassLoader classLoader) t
205205

206206
public synchronized static Method loadReceiptMethod(ClassLoader classLoader) throws Exception {
207207
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> {
208+
var classDeviceJid = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.DeviceJid");
208209
var methods = dexkit.findMethod(
209210
FindMethod.create()
210211
.matcher(MethodMatcher.create().addUsingString("receipt")
211212
.paramCount(2, 7)
212-
.paramTypes(null, "com.whatsapp.jid.DeviceJid", null, null, null, null, null)
213+
.paramTypes(null, classDeviceJid, null, null, null, null, null)
213214
)
214215
);
215216
if (methods.isEmpty())
@@ -716,7 +717,7 @@ public synchronized static Field loadAntiRevokeConvChatField(ClassLoader loader)
716717
public synchronized static Field loadAntiRevokeChatJidField(ClassLoader loader) throws Exception {
717718
return UnobfuscatorCache.getInstance().getField(loader, () -> {
718719
Class<?> chatClass = findFirstClassUsingStrings(loader, StringMatchType.Contains, "conversation/createconversation");
719-
Class<?> jidClass = XposedHelpers.findClass("com.whatsapp.jid.Jid", loader);
720+
Class<?> jidClass = Unobfuscator.findFirstClassUsingName(loader, StringMatchType.EndsWith, "jid.Jid");
720721
Field field = ReflectionUtils.getFieldByExtendType(chatClass, jidClass);
721722
if (field == null) throw new Exception("AntiRevokeChatJid field not found");
722723
return field;
@@ -1329,7 +1330,7 @@ public synchronized static Field loadProfileInfoField(ClassLoader loader) throws
13291330
return UnobfuscatorCache.getInstance().getField(loader, () -> {
13301331
var clazz = findFirstClassUsingStrings(loader, StringMatchType.Contains, "[obfuscated]@%s");
13311332
if (clazz == null) throw new RuntimeException("ProfileInfo class not found");
1332-
var fieldList = ReflectionUtils.getFieldsByExtendType(clazz, XposedHelpers.findClass("com.whatsapp.jid.Jid", loader));
1333+
var fieldList = ReflectionUtils.getFieldsByExtendType(clazz, Unobfuscator.findFirstClassUsingName(loader, StringMatchType.EndsWith, "jid.Jid"));
13331334
if (fieldList.isEmpty()) throw new RuntimeException("ProfileInfo field not found");
13341335
return fieldList.get(0);
13351336
});
@@ -1372,7 +1373,7 @@ public synchronized static Method loadGroupCheckAdminMethod(ClassLoader loader)
13721373
var invokeMethod = invoke.getMethodInstance(loader);
13731374
if (invokeMethod.getParameterCount() != 2 || invokeMethod.getReturnType() != boolean.class)
13741375
continue;
1375-
if (invokeMethod.getParameterTypes()[1].getName().equals("com.whatsapp.jid.UserJid")) {
1376+
if (invokeMethod.getParameterTypes()[1].getName().contains("jid.UserJid")) {
13761377
XposedBridge.log("FIND: " + invokeMethod);
13771378
return invokeMethod;
13781379
}

app/src/main/java/com/wmods/wppenhacer/xposed/features/general/Others.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,7 @@ private void disablePhotoProfileStatus() throws Exception {
247247
var refreshStatusClass = Unobfuscator.loadRefreshStatusClass(classLoader);
248248
var photoProfileClass = classLoader.loadClass("com.whatsapp.wds.components.profilephoto.WDSProfilePhoto");
249249
var convClass = classLoader.loadClass("com.whatsapp.conversationslist.ConversationsFragment");
250-
var jidClass = classLoader.loadClass("com.whatsapp.jid.Jid");
250+
var jidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.Jid");
251251
var method = ReflectionUtils.findMethodUsingFilter(convClass, m -> m.getParameterCount() > 0 && !Modifier.isStatic(m.getModifiers()) && m.getParameterTypes()[0] == View.class && ReflectionUtils.findIndexOfType(m.getParameterTypes(), jidClass) != -1);
252252
var field = ReflectionUtils.getFieldByExtendType(convClass, refreshStatusClass);
253253
logDebug("disablePhotoProfileStatus", Unobfuscator.getMethodDescriptor(method));

app/src/main/java/com/wmods/wppenhacer/xposed/features/others/ToastViewer.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import com.wmods.wppenhacer.xposed.utils.ResId;
1717
import com.wmods.wppenhacer.xposed.utils.Utils;
1818

19+
import org.luckypray.dexkit.query.enums.StringMatchType;
20+
1921
import java.util.Collection;
2022
import java.util.Collections;
2123
import java.util.HashMap;
@@ -58,14 +60,14 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
5860
});
5961
}
6062

61-
private void processNewWA(XC_MethodHook.MethodHookParam param, boolean toastViewedMessage, boolean toastViewedStatus) throws ClassNotFoundException, IllegalAccessException {
63+
private void processNewWA(XC_MethodHook.MethodHookParam param, boolean toastViewedMessage, boolean toastViewedStatus) throws Exception {
6264
Collection collection;
6365
if (!(param.args[0] instanceof Collection)) {
6466
collection = Collections.singleton(param.args[0]);
6567
} else {
6668
collection = (Collection) param.args[0];
6769
}
68-
var jidClass = classLoader.loadClass("com.whatsapp.jid.Jid");
70+
var jidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.Jid");
6971
for (var messageStatusUpdateReceipt : collection) {
7072
var fieldByType = ReflectionUtils.getFieldByType(messageStatusUpdateReceipt.getClass(), int.class);
7173
var fieldId = ReflectionUtils.getFieldByType(messageStatusUpdateReceipt.getClass(), long.class);

app/src/main/java/com/wmods/wppenhacer/xposed/features/privacy/CallPrivacy.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
1515
import com.wmods.wppenhacer.xposed.utils.Utils;
1616

17+
import org.luckypray.dexkit.query.enums.StringMatchType;
18+
1719
import java.lang.reflect.InvocationTargetException;
1820
import java.util.ArrayList;
1921
import java.util.Arrays;
@@ -96,7 +98,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
9698
@Override
9799
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
98100
if (!prefs.getString("call_type", "no_internet").equals("no_internet")) return;
99-
var jidClass = XposedHelpers.findClass("com.whatsapp.jid.Jid", classLoader);
101+
var jidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.Jid");
100102
var jidObj = ReflectionUtils.getArg(param.args, jidClass, 0);
101103
var userJid = new FMessageWpp.UserJid(jidObj);
102104
var type = Integer.parseInt(prefs.getString("call_privacy", "0"));

app/src/main/java/com/wmods/wppenhacer/xposed/features/privacy/CustomPrivacy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ public void doHook() throws Throwable {
6060

6161
Class<?> ContactInfoActivityClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "ContactInfoActivity");
6262
Class<?> GroupInfoActivityClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "GroupChatInfoActivity");
63-
Class<?> userJidClass = XposedHelpers.findClass("com.whatsapp.jid.UserJid", classLoader);
64-
Class<?> groupJidClass = XposedHelpers.findClass("com.whatsapp.jid.GroupJid", classLoader);
63+
Class<?> userJidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.UserJid");
64+
Class<?> groupJidClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.GroupJid");
6565

6666
chatUserJidMethod = ReflectionUtils.findMethodUsingFilter(ContactInfoActivityClass, method -> method.getParameterCount() == 0 && userJidClass.isAssignableFrom(method.getReturnType()));
6767
groupUserJidMethod = ReflectionUtils.findMethodUsingFilter(GroupInfoActivityClass, method -> method.getParameterCount() == 0 && groupJidClass.isAssignableFrom(method.getReturnType()));

app/src/main/java/com/wmods/wppenhacer/xposed/features/privacy/HideReceipt.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@
88
import com.wmods.wppenhacer.xposed.core.db.MessageHistory;
99
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
1010
import com.wmods.wppenhacer.xposed.features.customization.HideSeenView;
11-
import com.wmods.wppenhacer.xposed.utils.DebugUtils;
1211
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
1312

13+
import org.luckypray.dexkit.query.enums.StringMatchType;
14+
1415
import java.lang.reflect.Method;
1516

1617
import de.robv.android.xposed.XC_MethodHook;
@@ -36,7 +37,7 @@ public void doHook() throws Exception {
3637
XposedBridge.hookMethod(method, new XC_MethodHook() {
3738
@Override
3839
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
39-
var userJid = ReflectionUtils.getArg(param.args, classLoader.loadClass("com.whatsapp.jid.Jid"), 0);
40+
var userJid = ReflectionUtils.getArg(param.args, Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.Jid"), 0);
4041
var currentUserJid = new FMessageWpp.UserJid(userJid);
4142
var key = ReflectionUtils.getArg(param.args, FMessageWpp.Key.TYPE, 0);
4243
var fmessage = new FMessageWpp.Key(key).getFMessage();

app/src/main/java/com/wmods/wppenhacer/xposed/features/privacy/HideSeen.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import com.wmods.wppenhacer.xposed.core.db.MessageHistory;
99
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
1010
import com.wmods.wppenhacer.xposed.features.customization.HideSeenView;
11-
import com.wmods.wppenhacer.xposed.utils.DebugUtils;
1211
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
1312

1413
import org.luckypray.dexkit.query.enums.StringMatchType;
@@ -53,6 +52,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
5352
return;
5453
}
5554
var lid = (String) XposedHelpers.getObjectField(sendReadReceiptJob, "jid");
55+
logDebug(lid);
5656
FMessageWpp.UserJid userJid = null;
5757
try {
5858
userJid = new FMessageWpp.UserJid(lid);
@@ -109,7 +109,7 @@ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
109109
return;
110110
}
111111
}
112-
var userJid = ReflectionUtils.getArg(param.args, classLoader.loadClass("com.whatsapp.jid.Jid"), 0);
112+
var userJid = ReflectionUtils.getArg(param.args, Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "jid.Jid"), 0);
113113
if (userJid == null) return;
114114
var msgTypeIdx = ReflectionUtils.findIndexOfType(((Method) param.method).getParameterTypes(), String.class);
115115
if (!Objects.equals("read", param.args[msgTypeIdx])) return;

0 commit comments

Comments
 (0)