Skip to content

Commit

Permalink
fix: FileShareExtHook on NT 4288
Browse files Browse the repository at this point in the history
  • Loading branch information
cinit committed Jul 24, 2023
1 parent 0279f7b commit d170489
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 11 deletions.
59 changes: 48 additions & 11 deletions app/src/main/java/cc/ioctl/hook/msg/FileShareExtHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,17 @@
import io.github.qauxv.util.Log;
import io.github.qauxv.util.SyncUtils;
import io.github.qauxv.util.Toasts;
import io.github.qauxv.util.dexkit.DefaultFileModel;
import io.github.qauxv.util.dexkit.DexKit;
import io.github.qauxv.util.dexkit.DexKitTarget;
import io.github.qauxv.util.dexkit.FileBrowserActivity_InnerClass_onItemClick;
import java.io.File;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import kotlin.collections.ArraysKt;

@FunctionHookEntry
@UiItemAgentEntry
Expand All @@ -62,7 +68,10 @@ public class FileShareExtHook extends CommonSwitchFunctionHook {
public static final FileShareExtHook INSTANCE = new FileShareExtHook();

private FileShareExtHook() {
super(SyncUtils.PROC_MAIN);
super(SyncUtils.PROC_MAIN, new DexKitTarget[]{
FileBrowserActivity_InnerClass_onItemClick.INSTANCE,
DefaultFileModel.INSTANCE
});
}

@NonNull
Expand Down Expand Up @@ -98,11 +107,7 @@ protected boolean initOnce() throws Exception {
Class<?> kiShareActionSheet = Initiator.loadClass("com.tencent.mobileqq.widget.share.ShareActionSheet");
// args
Class<?> kFileBrowserModelBase = Initiator.loadClass("com.tencent.mobileqq.filemanager.fileviewer.model.FileBrowserModelBase");
Class<?> kDefaultFileModel = Initiator.loadClassEither(
"com.tencent.mobileqq.filemanager.fileviewer.model.DefaultFileModel",
// QQ 8.9.0(3060)
"com.tencent.mobileqq.filemanager.fileviewer.model.b"
);
Class<?> kDefaultFileModel = DexKit.requireClassFromCache(DefaultFileModel.INSTANCE);
Class<?> kIFileViewerAdapter = Initiator.loadClassEither(
"com.tencent.mobileqq.filemanager.fileviewer.IFileViewerAdapter",
// QQ 8.9.0(3060)
Expand All @@ -118,20 +123,32 @@ protected boolean initOnce() throws Exception {
fieldDefaultFileModel_IFileViewerAdapter.setAccessible(true);
fieldFileBrowserManager_FileBrowserModelBase.setAccessible(true);
Method getFilePath = kIFileViewerAdapter.getDeclaredMethod("getFilePath");
Method getShareSheetItemLists = Reflex.findSingleMethod(kFileBrowserManager, ArrayList[].class, false);
Method getShareSheetItemLists1 = Reflex.findSingleMethod(kFileBrowserManager, ArrayList[].class, false);
List<Method> getShareSheetItemLists2List = ArraysKt.filter(kDefaultFileModel.getDeclaredMethods(), it -> {
return it.getParameterTypes().length == 0 && it.getReturnType() == ArrayList[].class;
});
Method onItemClick = Initiator.loadClassEither(
"com.tencent.mobileqq.filemanager.fileviewer.FileBrowserManager$2",
// QQ 8.9.0(3060)
"com.tencent.mobileqq.filemanager.fileviewer.a$b"
).getDeclaredMethod("onItemClick", kActionSheetItem, kiShareActionSheet);
XposedBridge.hookMethod(onItemClick, mItemClickHandler);
HookUtils.hookAfterIfEnabled(this, getShareSheetItemLists, param -> {
Method mFileBrowserActivity_InnerClass_onItemClick = DexKit.loadMethodFromCache(FileBrowserActivity_InnerClass_onItemClick.INSTANCE);
if (mFileBrowserActivity_InnerClass_onItemClick != null) {
XposedBridge.hookMethod(mFileBrowserActivity_InnerClass_onItemClick, mItemClickHandler);
}
XC_MethodHook getShareSheetItemListsHook = HookUtils.afterIfEnabled(this, param -> {
ArrayList<Object>[] results = (ArrayList<Object>[]) param.getResult();
if (results == null || results.length != 2) {
Log.e("FileShareExtHook: getShareSheetItemLists result is null or length is not 2");
return;
}
Object fileBrowserModel = fieldFileBrowserManager_FileBrowserModelBase.get(param.thisObject);
Object fileBrowserModel;
if (kFileBrowserManager.isInstance(param.thisObject)) {
fileBrowserModel = fieldFileBrowserManager_FileBrowserModelBase.get(param.thisObject);
} else {
fileBrowserModel = kFileBrowserModelBase.cast(param.thisObject);
}
if (fileBrowserModel == null) {
return;
}
Expand All @@ -154,15 +171,35 @@ protected boolean initOnce() throws Exception {
Reflex.setInstanceObject(item, "argus", String.class, filePath);
row2.add(item);
});
XposedBridge.hookMethod(getShareSheetItemLists1, getShareSheetItemListsHook);
for (Method method : getShareSheetItemLists2List) {
XposedBridge.hookMethod(method, getShareSheetItemListsHook);
}
return true;
}

private final XC_MethodHook mItemClickHandler = HookUtils.afterIfEnabled(this, param -> {
Object item = param.args[0];
int id = (int) Reflex.getInstanceObject(item, "id", int.class);
if (id == R.id.ShareActionSheet_shareFileWithExtApp) {
Object fileBrowserManager = Reflex.getFirstByType(param.thisObject, kFileBrowserManager);
Context ctx = Reflex.getFirstByType(fileBrowserManager, Activity.class);
Context ctx = null;
// case 1
Object fileBrowserManager = Reflex.getFirstByTypeOrNull(param.thisObject, kFileBrowserManager);
if (fileBrowserManager != null) {
ctx = Reflex.getFirstByType(fileBrowserManager, Activity.class);
}
// case 2
Class<?> kFileBrowserActivity = Initiator.load("com.tencent.mobileqq.filebrowser.FileBrowserActivity");
if (kFileBrowserActivity != null) {
Activity activity = (Activity) Reflex.getFirstByTypeOrNull(param.thisObject, kFileBrowserActivity);
if (activity != null) {
ctx = activity;
}
}
if (ctx == null) {
Toasts.error(null, "unable to get activity");
return;
}
assert ctx != null;
String picPath = (String) Reflex.getInstanceObject(item, "argus", String.class);
if (TextUtils.isEmpty(picPath)) {
Expand Down
14 changes: 14 additions & 0 deletions app/src/main/java/io/github/qauxv/util/dexkit/DexKitTarget.kt
Original file line number Diff line number Diff line change
Expand Up @@ -749,3 +749,17 @@ data object NQZMoment_EntranceEnabled : DexKitTarget.UsingStr() {
override val declaringClass = ""
override val filter = DexKitFilter.strInClsName("com/qzone/reborn/qzmoment/util")
}

data object DefaultFileModel : DexKitTarget.UsingStr() {
override val findMethod: Boolean = false
override val traitString = arrayOf("onVideoPlayerError : file entity is null")
override val declaringClass = "com.tencent.mobileqq.filemanager.fileviewer.model.DefaultFileModel"
override val filter = DexKitFilter.strInClsName("com.tencent.mobileqq.filemanager.fileviewer.model")
}

data object FileBrowserActivity_InnerClass_onItemClick : DexKitTarget.UsingStringVector() {
override val findMethod: Boolean = true
override val traitStringVectors: Array<Array<String>> = arrayOf(arrayOf("GeneralFileBrowserActivity", "reportShareActionSheetClick"))
override val declaringClass = ""
override val filter = DexKitFilter.strInClsName("FileBrowserActivity")
}

0 comments on commit d170489

Please sign in to comment.