首页
社区
课程
招聘
[原创]hook框架检测
发表于: 2022-6-10 06:36 13259

[原创]hook框架检测

2022-6-10 06:36
13259

安卓实现内存漫游

例如对 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_白熊编辑 ,原因: 格式
上传的附件:
收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 29
活跃值: (5857)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
关于内存漫游,其实VMDebug的那个method首先只在部分9.0设备可用,另外aosp里已经删除了该方法的实现,机型覆盖十分有限
2022-6-10 10:39
0
雪    币: 3646
活跃值: (4774)
能力值: ( LV13,RANK:437 )
在线值:
发帖
回帖
粉丝
3
最好能上传一个检测hook样本呀
2022-6-10 11:29
0
雪    币: 505
活跃值: (1931)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
太强啦
2022-6-10 13:40
1
雪    币: 47
活跃值: (437)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不吃早饭 关于内存漫游,其实VMDebug的那个method首先只在部分9.0设备可用,另外aosp里已经删除了该方法的实现,机型覆盖十分有限
9.0以上应该都可以,安卓11测试没问题,风控手段是综合评估,还是有那么一点作用
2022-6-10 14:09
0
雪    币: 29
活跃值: (5857)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
wx_白熊 9.0以上应该都可以,安卓11测试没问题,风控手段是综合评估,还是有那么一点作用
并非都可以,一部分9.0确实没有对应实现,可以去aosp里看一下,对应的native实现已经移除
2022-6-10 19:03
0
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
云端完成计算过程,本地只显示UI,客户端发送的所有数据都是不可信的,只要做好自身的云端逻辑就行。
2022-6-11 16:55
1
雪    币: 626
活跃值: (3926)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
tql
2023-7-6 20:03
0
游客
登录 | 注册 方可回帖
返回
//