Fake Location黑名单处理 Xposed代码示例

仅供技术交流 禁止用于各类非法用途!!!

Hook

分析可以看上一篇文章

这里就不重复App内需要Hook的地方了

主要说一下怎么Hook这个App向系统注入的dex

通过分析可知 这个dex位于assets/3DFly.lis

在运行时会解压到 /data/fl/libfl.so 然后注入系统

这就需要Hook Android这个进程

通过Hook ClassLoader的loadClass方法来获取一个可以操作libfl.so的ClassLoader

因为App可能会多次注入 所以需要每次都创建一个线程来钩住

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
XposedHelpers.findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {
if (param.hasThrowable()){
return;
}

Class<?> clsloader = (Class<?>) param.getResult();

//XposedBridge.log("FFLBL: Injected "+ clsloader.getClassLoader().toString());

if(clsloader.getClassLoader().toString().contains("/data/fl/libfl.so")) {
XposedBridge.log("FFLBL: Android Init");
new Thread(new Runnable() {
@Override
public void run() {
try {
XposedBridge.log("FFLBL: Android Injected");
XposedHelpers.findAndHookMethod("؛.ׯ", clsloader.getClassLoader(), "Ϳ", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
ArrayList <String> buildin = (ArrayList <String>) param.getResult();
if (buildin.contains(PKG.pkgName)) {
buildin.remove(PKG.pkgName);
buildin.add(PKG.replaceName);
XposedBridge.log("FFLBL: Replaced " + PKG.pkgName +" to " + PKG.replaceName);
}
param.setResult(buildin);
}
});

XposedHelpers.findAndHookMethod("؛.ލ", clsloader.getClassLoader(), "ؠ", java.util.List.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
List<String> input = (List<String>) param.args[0];
if (input.contains(PKG.pkgName)) {
input.remove(PKG.pkgName);
input.add(PKG.replaceName);
XposedBridge.log("FFLBL: Replaced " + PKG.pkgName +" to " + PKG.replaceName);

}
param.args[0] = input;
}
});

XposedHelpers.findAndHookMethod("com.lerist.inject.utils.Ϳ", clsloader.getClassLoader(), "setSafeApps", java.util.List.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
List<String> input = (List<String>) param.args[0];
if (input.contains(PKG.pkgName)) {
input.remove(PKG.pkgName);
input.add(PKG.replaceName);
XposedBridge.log("FFLBL: Replaced " + PKG.pkgName +" to " + PKG.replaceName);
}
param.args[0] = input;
}
});
} catch (Exception e){
XposedBridge.log("FFLBL: "+e);
}
}
}).start();
}
}
});

我在这里自定义了一个PKG类
其中pkgName为要解除黑名单的包名 replaceName为要在黑名单列表后添加的包名(因为部分地方存在List数量的判断 不排除以后校验数量的可能性)

成品

Bitbucket

知道你们懒

123云盘 提取码:ZTPy


Fake Location黑名单处理 Xposed代码示例
https://www.tonyha7.com/2024/12/07/FakeLoc-2/
作者
th7
发布于
2024年12月7日
许可协议