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

[原创]hook框架检测

2022-6-10 06:36
11746

1.xposed

安卓实现内存漫游

 

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

 

 

所以,只需要遍历内存中的全部DexClassLoader,尝试loadClass方法,获取到类后即可依靠反射获取字段内容,打印攻击者hook的参数并上报给服务器进行记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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());
 
      }

同时对hookAllMethods进行跟踪,最后会在hookMethod内将方法内容put进sHookedMethodCallbacks,用frida进行打印,代码如下。

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
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));
    }
 
});
 
    }

在获取到Xp的类加载器后,就可以通过反射干扰攻击者的判断,例如引入蜜罐、通过disableHooks使hook失效等。除此之外xp的特征较多,单从检测来看方法很多,但是通过对xp魔改或使用sandhook即可绕过常规检测。

2.frida

1
2
3
//base可以通过解析maps获取首地址
 mprotect((void *)startr,PAGE_SIZE,PROT_WRITE);
*(long*)startr = *(long*)startr+0xa;

frida从hook原理来讲是通过inlinehook完成,所以开一条线程对关键函数头进行轮询检测很有必要,其余常规检测可以参考 antifridaAndroid

 

emanriquez / antifridaAndroid

3.rpc主动调用

在主动调用的对抗来讲,它是基于Hook实现的,所以检测了hook自然也就能顺带pass掉,单独特征来讲常用的角度是从堆栈出发,主动调用如下图,没有一条完整的调用链,无论从堆栈的深度还是名称,都能进行判断。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2022-10-24 10:29 被wx_白熊编辑 ,原因: 格式
上传的附件:
收藏
点赞7
打赏
分享
最新回复 (7)
雪    币: 29
活跃值: (5110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-6-10 10:39
2
0
关于内存漫游,其实VMDebug的那个method首先只在部分9.0设备可用,另外aosp里已经删除了该方法的实现,机型覆盖十分有限
雪    币: 2247
活跃值: (3345)
能力值: ( LV13,RANK:405 )
在线值:
发帖
回帖
粉丝
奔跑的阿狸 1 2022-6-10 11:29
3
0
最好能上传一个检测hook样本呀
雪    币: 513
活跃值: (1791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
阿碧 2022-6-10 13:40
4
1
太强啦
雪    币: 57
活跃值: (287)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_白熊 2022-6-10 14:09
5
0
不吃早饭 关于内存漫游,其实VMDebug的那个method首先只在部分9.0设备可用,另外aosp里已经删除了该方法的实现,机型覆盖十分有限
9.0以上应该都可以,安卓11测试没问题,风控手段是综合评估,还是有那么一点作用
雪    币: 29
活跃值: (5110)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
不吃早饭 2022-6-10 19:03
6
0
wx_白熊 9.0以上应该都可以,安卓11测试没问题,风控手段是综合评估,还是有那么一点作用
并非都可以,一部分9.0确实没有对应实现,可以去aosp里看一下,对应的native实现已经移除
雪    币: 2063
活跃值: (3823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lhxdiao 2022-6-11 16:55
7
1
云端完成计算过程,本地只显示UI,客户端发送的所有数据都是不可信的,只要做好自身的云端逻辑就行。
雪    币: 503
活跃值: (3806)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
codeoooo 2023-7-6 20:03
8
0
tql
游客
登录 | 注册 方可回帖
返回