Skip to content

Commit f10464a

Browse files
committed
Refactor TagMessage and DeleteStatus, update supported versions
- Improve class resolver for `StatusDeleteDialogFragment` in DeleteStatus. - Refactor TagMessage to correctly identify the view and prevent NPEs. - Update supported versions for WhatsApp and WhatsApp Business to 2.25.24.xx. - Add `findFirstClassUsingName` method to Unobfuscator. - Improve `loadBroadcastTagMethod` in Unobfuscator to find methods using additional criteria. Signed-off-by: Dev4Mod <[email protected]>
1 parent 3688f00 commit f10464a

File tree

5 files changed

+49
-7
lines changed

5 files changed

+49
-7
lines changed

app/src/main/java/com/wmods/wppenhacer/App.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ public void onCreate() {
5757
var mode = Integer.parseInt(sharedPreferences.getString("thememode", "0"));
5858
setThemeMode(mode);
5959
changeLanguage(this);
60+
// criar um banco de dados
6061
}
6162

6263
public static void setThemeMode(int mode) {

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import android.view.View;
1515
import android.view.ViewGroup;
1616
import android.widget.FrameLayout;
17+
import android.widget.ImageView;
1718
import android.widget.TextView;
1819

1920
import androidx.annotation.Nullable;
@@ -55,6 +56,7 @@
5556
import java.util.TimerTask;
5657
import java.util.stream.Collectors;
5758

59+
import de.robv.android.xposed.XposedBridge;
5860
import de.robv.android.xposed.XposedHelpers;
5961

6062
public class Unobfuscator {
@@ -125,6 +127,7 @@ public synchronized static Class<?> findFirstClassUsingStrings(ClassLoader class
125127
return result.get(0).getInstance(classLoader);
126128
}
127129

130+
128131
public synchronized static Class<?>[] findAllClassUsingStrings(ClassLoader classLoader, StringMatchType type, String... strings) throws Exception {
129132
var matcher = new ClassMatcher();
130133
for (String string : strings) {
@@ -135,6 +138,7 @@ public synchronized static Class<?>[] findAllClassUsingStrings(ClassLoader class
135138
return result.stream().map(classData -> convertRealClass(classData, classLoader)).filter(Objects::nonNull).toArray(Class[]::new);
136139
}
137140

141+
138142
public synchronized static Class<?> findFirstClassUsingStringsFilter(ClassLoader classLoader, String packageFilter, StringMatchType type, String... strings) throws Exception {
139143
var matcher = new ClassMatcher();
140144
for (String string : strings) {
@@ -145,6 +149,12 @@ public synchronized static Class<?> findFirstClassUsingStringsFilter(ClassLoader
145149
return result.get(0).getInstance(classLoader);
146150
}
147151

152+
public synchronized static Class<?> findFirstClassUsingName(ClassLoader classLoader, StringMatchType type, String name) throws Exception {
153+
var result = dexkit.findClass(FindClass.create().matcher(ClassMatcher.create().className(name, type)));
154+
if (result.isEmpty()) return null;
155+
return result.get(0).getInstance(classLoader);
156+
}
157+
148158
public synchronized static String getMethodDescriptor(Method method) {
149159
if (method == null) return null;
150160
return method.getDeclaringClass().getName() + "->" + method.getName() + "(" + Arrays.stream(method.getParameterTypes()).map(Class::getName).collect(Collectors.joining(",")) + ")";
@@ -285,10 +295,22 @@ public synchronized static Field loadBroadcastTagField(ClassLoader classLoader)
285295
public synchronized static Method loadBroadcastTagMethod(ClassLoader classLoader) throws Exception {
286296
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> {
287297
var field = loadBroadcastTagField(classLoader);
298+
XposedBridge.log(DexSignUtil.getFieldDescriptor(field));
288299
var clazzData = dexkit.findClass(FindClass.create().matcher(ClassMatcher.create().addUsingString("ConversationRow/setUpUserNameInGroupView")));
289300
if (clazzData.isEmpty())
290301
throw new Exception("BroadcastTag: ConversationRow Class not found");
291302
var method = dexkit.findMethod(FindMethod.create().searchInClass(clazzData).matcher(MethodMatcher.create().addUsingField(DexSignUtil.getFieldDescriptor(field))));
303+
if (method.isEmpty()) {
304+
var findViewId = View.class.getDeclaredMethod("findViewById", int.class);
305+
var setImageResource = ImageView.class.getDeclaredMethod("setImageResource", int.class);
306+
method = dexkit.findMethod(
307+
FindMethod.create().matcher(
308+
MethodMatcher.create().addUsingField(DexSignUtil.getFieldDescriptor(field))
309+
.addInvoke(DexSignUtil.getMethodDescriptor(findViewId))
310+
.addInvoke(DexSignUtil.getMethodDescriptor(setImageResource))
311+
)
312+
);
313+
}
292314
if (method.isEmpty())
293315
throw new Exception("BroadcastTag: ConversationRow Method not found");
294316
return method.get(0).getMethodInstance(classLoader);
@@ -317,7 +339,8 @@ public synchronized static Method loadHideViewSendReadJob(ClassLoader classLoade
317339
public synchronized static Method loadHideViewInChatMethod(ClassLoader classLoader) throws Exception {
318340
return UnobfuscatorCache.getInstance().getMethod(classLoader, () -> {
319341
Method method = findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "ReadReceipts/acknowledgeMessageIfNeeded");
320-
if (method == null) method = findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "ReadReceipts/sendDeliveryReceiptIfNotRetry");
342+
if (method == null)
343+
method = findFirstMethodUsingStrings(classLoader, StringMatchType.Contains, "ReadReceipts/sendDeliveryReceiptIfNotRetry");
321344
if (method == null) throw new Exception("HideViewInChat method not found");
322345
return method;
323346
});
@@ -1399,7 +1422,8 @@ public synchronized static Constructor loadStartPrefsConfig(ClassLoader loader)
13991422

14001423
public synchronized static Method loadCheckOnlineMethod(ClassLoader loader) throws Exception {
14011424
var method = findFirstMethodUsingStrings(loader, StringMatchType.Contains, "MessageHandler/handleConnectionThreadReady connectionready");
1402-
if (method == null) method = findFirstMethodUsingStrings(loader, StringMatchType.Contains, "app/xmpp/recv/handle_available");
1425+
if (method == null)
1426+
method = findFirstMethodUsingStrings(loader, StringMatchType.Contains, "app/xmpp/recv/handle_available");
14031427
if (method == null) throw new RuntimeException("CheckOnline method not found");
14041428
return method;
14051429
}

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

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

18+
import org.luckypray.dexkit.query.enums.StringMatchType;
19+
1820
import java.lang.reflect.Field;
1921

2022
import de.robv.android.xposed.XSharedPreferences;
@@ -31,7 +33,7 @@ public void doHook() throws Throwable {
3133

3234
var fragmentloader = Unobfuscator.loadFragmentLoader(classLoader);
3335
var showDialogStatus = Unobfuscator.loadShowDialogStatusMethod(classLoader);
34-
Class<?> StatusDeleteDialogFragmentClass = classLoader.loadClass("com.whatsapp.status.StatusDeleteDialogFragment");
36+
Class<?> StatusDeleteDialogFragmentClass = Unobfuscator.findFirstClassUsingName(classLoader, StringMatchType.EndsWith, "StatusDeleteDialogFragment");
3537
Field fieldBundle = ReflectionUtils.getFieldByType(fragmentloader, Bundle.class);
3638

3739
var item = new MenuStatus.MenuItemStatus() {

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
import java.lang.reflect.Method;
1515

1616
import de.robv.android.xposed.XC_MethodHook;
17+
import de.robv.android.xposed.XC_MethodReplacement;
1718
import de.robv.android.xposed.XSharedPreferences;
1819
import de.robv.android.xposed.XposedBridge;
20+
import de.robv.android.xposed.XposedHelpers;
1921

2022
public class TagMessage extends Feature {
2123
public TagMessage(ClassLoader loader, XSharedPreferences preferences) {
@@ -53,30 +55,37 @@ private void hookBroadcastView() throws Exception {
5355

5456
XposedBridge.hookMethod(method1, new XC_MethodHook() {
5557
private FMessageWpp.Key keyObj;
58+
private Unhook hooked;
5659

5760
@Override
5861
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
5962
keyObj = null;
60-
var fmessage = new FMessageWpp(param.args[0]);
63+
var fmessageObj = ReflectionUtils.getArg(param.args, FMessageWpp.TYPE, 0);
64+
var fmessage = new FMessageWpp(fmessageObj);
6165
var key = fmessage.getKey();
6266
if (!key.isFromMe && fmessage.isBroadcast()) {
63-
var view = (ViewGroup) param.thisObject;
64-
var res = view.findViewById((int) param.args[1]);
67+
var id = ReflectionUtils.getArg(param.args, Integer.class, 0);
68+
var view = (ViewGroup) (param.thisObject instanceof ViewGroup ? param.thisObject : param.args[0]);
69+
var res = view.findViewById(id);
6570
if (res == null) {
6671
var dateWrapper = (ViewGroup) view.findViewById(Utils.getID("date_wrapper", "id"));
6772
var broadcast = new ImageView(view.getContext());
68-
broadcast.setId((int) param.args[1]);
73+
broadcast.setId(id);
6974
dateWrapper.addView(broadcast, 0);
7075
}
7176
key.setIsFromMe(true);
7277
keyObj = key;
78+
hooked = XposedHelpers.findAndHookMethod(key.remoteJid.getClass(), "getType", XC_MethodReplacement.returnConstant(0));
7379
}
7480
}
7581

7682
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
7783
if (keyObj != null) {
7884
keyObj.setIsFromMe(false);
7985
}
86+
if (hooked != null) {
87+
hooked.unhook();
88+
}
8089
}
8190

8291
});

app/src/main/res/values/arrays.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,18 @@
123123
<item>2.25.19.xx</item>
124124
<item>2.25.20.xx</item>
125125
<item>2.25.21.xx</item>
126+
<item>2.25.22.xx</item>
127+
<item>2.25.23.xx</item>
128+
<item>2.25.24.xx</item>
126129
</string-array>
127130
<string-array name="supported_versions_business">
128131
<item>2.25.18.xx</item>
129132
<item>2.25.19.xx</item>
130133
<item>2.25.20.xx</item>
131134
<item>2.25.21.xx</item>
135+
<item>2.25.22.xx</item>
136+
<item>2.25.23.xx</item>
137+
<item>2.25.24.xx</item>
132138
</string-array>
133139
<string-array name="image_picker">
134140
<item>image/*</item>

0 commit comments

Comments
 (0)