安卓实现内存漫游
例如对 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_白熊编辑
,原因: 格式