安卓实现内存漫游
例如对 findAndHookMethod 方法跟踪时,两种重载均会在findMethodExact方法内将方法信息存储在methodCache内,findAndHookConstructor也是同理。

所以,只需要遍历内存中的全部DexClassLoader,尝试loadClass方法,获取到类后即可依靠反射获取字段内容,打印攻击者hook的参数并上报给服务器进行记录。
同时对hookAllMethods进行跟踪,最后会在hookMethod内将方法内容put进sHookedMethodCallbacks,用frida进行打印,代码如下。
在获取到Xp的类加载器后,就可以通过反射干扰攻击者的判断,例如引入蜜罐、通过disableHooks使hook失效等。除此之外xp的特征较多,单从检测来看方法很多,但是通过对xp魔改或使用sandhook即可绕过常规检测。
frida从hook原理来讲是通过inlinehook完成,所以开一条线程对关键函数头进行轮询检测很有必要,其余常规检测可以参考 antifridaAndroid
emanriquez / antifridaAndroid
在主动调用的对抗来讲,它是基于Hook实现的,所以检测了hook自然也就能顺带pass掉,单独特征来讲常用的角度是从堆栈出发,主动调用如下图,没有一条完整的调用链,无论从堆栈的深度还是名称,都能进行判断。


public void getXpMethods() throws throws Exception {
//遍历获取全部DexClassLoader
ArrayList<Object> choose = choose(DexClassLoader.class);
DexClassLoader loader = null;
Class<?> XposedHelpers = null;
//不为空尝试加载关键类
if (choose!=null){
for (Object obj:choose){
loader = (DexClassLoader) obj;
try {
XposedHelpers = loader.loadClass("de.robv.android.xposed.XposedHelpers");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Field field = XposedHelpers.getDeclaredField("methodCache");
field.setAccessible(true);
HashMap<String,Object> MethodList = (HashMap<String, Object>) field.get(null);
Log.i("MethodList ", MethodList.keySet().toString());
}
public void getXpMethods() throws throws Exception {
//遍历获取全部DexClassLoader
ArrayList<Object> choose = choose(DexClassLoader.class);
DexClassLoader loader = null;
Class<?> XposedHelpers = null;
//不为空尝试加载关键类
if (choose!=null){
for (Object obj:choose){
loader = (DexClassLoader) obj;
try {
XposedHelpers = loader.loadClass("de.robv.android.xposed.XposedHelpers");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Field field = XposedHelpers.getDeclaredField("methodCache");
field.setAccessible(true);
HashMap<String,Object> MethodList = (HashMap<String, Object>) field.get(null);
Log.i("MethodList ", MethodList.keySet().toString());
}
function antiList(){
Java.perform(function(){
var XposedBridge;
Java.enumerateClassLoaders({
"onMatch": function(loader) {
try {
XposedBridge = loader.loadClass("de.robv.android.xposed.XposedBridge");
}
catch(err) {
}
},
"onComplete": function() {
}
});
if(XposedBridge!=null){
var file = XposedBridge.getDeclaredField("sHookedMethodCallbacks");
file.setAccessible(true);
console.log(file.get(null));
}
});
}
传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2022-10-24 10:29
被wx_白熊编辑
,原因: 格式