Skip to content

Commit ea4bf3d

Browse files
committed
Improve Anti ViewOnce
1 parent 95bf2c1 commit ea4bf3d

File tree

2 files changed

+12
-66
lines changed

2 files changed

+12
-66
lines changed

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

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -544,38 +544,23 @@ public synchronized static Method[] loadViewOnceMethod(ClassLoader classLoader)
544544
for (MethodData m : listMethods) {
545545
var mInstance = m.getMethodInstance(classLoader);
546546
if (mInstance.getDeclaringClass().isInterface() && mInstance.getDeclaringClass().getMethods().length == 2) {
547-
ClassDataList listClasses = dexkit.findClass(new FindClass().matcher(new ClassMatcher().addInterface(mInstance.getDeclaringClass().getName())));
547+
ClassDataList listClasses = dexkit.findClass(FindClass.create().matcher(ClassMatcher.create().addInterface(mInstance.getDeclaringClass().getName())));
548548
for (ClassData c : listClasses) {
549549
Class<?> clazz = c.getInstance(classLoader);
550-
var resultMethod = Arrays.stream(clazz.getDeclaredMethods()).filter(m1 -> m1.getParameterCount() == 0 && m1.getReturnType().equals(int.class)).findFirst().orElse(null);
551-
if (resultMethod == null) continue;
552-
list.add(resultMethod);
550+
for (Method m2 : clazz.getDeclaredMethods()) {
551+
if (m2.getParameterCount() != 1 || m2.getParameterTypes()[0] != int.class || m2.getReturnType() != void.class)
552+
continue;
553+
list.add(m2);
554+
}
553555
}
556+
if (list.isEmpty()) throw new Exception("ViewOnce method not found");
554557
return list.toArray(new Method[0]);
555558
}
556559
}
557560
throw new Exception("ViewOnce method not found");
558561

559562
}
560563

561-
public synchronized static Class loadViewOnceClass(ClassLoader loader) throws Exception {
562-
var clazz = findFirstClassUsingStrings(loader, StringMatchType.Contains, "conversation/row/viewOnce/no file");
563-
if (clazz == null) throw new Exception("ViewOnce class not found");
564-
return clazz;
565-
}
566-
567-
public synchronized static Method loadViewOnceStoreMethod(ClassLoader loader) throws Exception {
568-
var method = findFirstMethodUsingStrings(loader, StringMatchType.Contains, "INSERT_VIEW_ONCE_SQL");
569-
if (method == null) throw new Exception("ViewOnce class not found");
570-
return method;
571-
}
572-
573-
public synchronized static Method loadViewOnceChangeMethod(ClassLoader loader) throws Exception {
574-
var method = findFirstMethodUsingStrings(loader, StringMatchType.Contains, "com.whatsapp.messaging.ViewOnceViewerActivity");
575-
if (method == null) throw new Exception("ViewOnce class not found");
576-
return method;
577-
}
578-
579564

580565
/**
581566
* @noinspection SimplifyOptionalCallChains

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

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,15 @@
11
package com.wmods.wppenhacer.xposed.features.privacy;
22

33

4-
import android.view.View;
5-
64
import androidx.annotation.NonNull;
75

86
import com.wmods.wppenhacer.xposed.core.Feature;
97
import com.wmods.wppenhacer.xposed.core.components.FMessageWpp;
108
import com.wmods.wppenhacer.xposed.core.devkit.Unobfuscator;
11-
import com.wmods.wppenhacer.xposed.utils.ReflectionUtils;
129

1310
import de.robv.android.xposed.XC_MethodHook;
14-
import de.robv.android.xposed.XC_MethodReplacement;
1511
import de.robv.android.xposed.XSharedPreferences;
1612
import de.robv.android.xposed.XposedBridge;
17-
import de.robv.android.xposed.XposedHelpers;
1813

1914
public class ViewOnce extends Feature {
2015
private boolean isFromMe;
@@ -28,54 +23,20 @@ public void doHook() throws Exception {
2823
if (!prefs.getBoolean("viewonce", false)) return;
2924

3025
var methods = Unobfuscator.loadViewOnceMethod(classLoader);
31-
var classViewOnce = Unobfuscator.loadViewOnceClass(classLoader);
32-
logDebug(classViewOnce);
33-
var viewOnceStoreMethod = Unobfuscator.loadViewOnceStoreMethod(classLoader);
34-
logDebug(Unobfuscator.getMethodDescriptor(viewOnceStoreMethod));
35-
var viewOnceChangeMethod = Unobfuscator.loadViewOnceChangeMethod(classLoader);
36-
37-
XposedBridge.hookMethod(viewOnceStoreMethod, new XC_MethodHook() {
38-
@Override
39-
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
40-
isFromMe = false;
41-
var messageObject = param.args[0];
42-
if (messageObject == null) return;
43-
isFromMe = new FMessageWpp(messageObject).getKey().isFromMe;
44-
}
45-
});
4626

4727
for (var method : methods) {
4828
logDebug(Unobfuscator.getMethodDescriptor(method));
4929
XposedBridge.hookMethod(method, new XC_MethodHook() {
5030
@Override
51-
protected void afterHookedMethod(MethodHookParam param) {
52-
int returnValue = (int) param.getResult();
53-
if (returnValue != 2) {
54-
if (ReflectionUtils.isCalledFromClass(classViewOnce)) {
55-
param.setResult(0);
56-
} else if (!isFromMe && (ReflectionUtils.isCalledFromClass(viewOnceStoreMethod.getDeclaringClass()))) {
57-
param.setResult(0);
58-
}
31+
protected void beforeHookedMethod(MethodHookParam param) {
32+
int returnValue = (int) param.args[0];
33+
var fMessage = new FMessageWpp(param.thisObject);
34+
if (returnValue == 1 && !fMessage.getKey().isFromMe) {
35+
param.args[0] = 0;
5936
}
6037
}
6138
});
6239
}
63-
// This prevents view audio once from being set to previewed
64-
XposedBridge.hookMethod(viewOnceChangeMethod,
65-
new XC_MethodHook() {
66-
private Unhook unhook;
67-
68-
@Override
69-
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
70-
unhook = XposedHelpers.findAndHookMethod(View.class, "postDelayed", Runnable.class, long.class, XC_MethodReplacement.returnConstant(false));
71-
}
72-
73-
@Override
74-
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
75-
unhook.unhook();
76-
}
77-
});
78-
7940
}
8041

8142
@NonNull

0 commit comments

Comments
 (0)