首页
社区
课程
招聘
[原创]UnityHybirdCLR Hook实现
发表于: 2024-5-27 16:21 2569

[原创]UnityHybirdCLR Hook实现

2024-5-27 16:21
2569

HybirdCLR 工作原理

HybirdCLR 从原理上来说并不复杂,主要是Runtime下进行元数据的初始化和解析,同时实现了一个解释器,由于是动态的进行解析,基于元数据的Dump自然就失效了得到的偏移地址完全指向了解释器的占位入口 比如一个静态函数 :

public static void Run(){} 指向的地址的符号表为 _ZL7__N2M_vPK10MethodInfo 这是因为在动态解析的过程中 生成的methodInfo最终需要解释器来执行,一些固定的函数自然需要固定的入口来进行跳转,HybirdCLR 也是生成了非常多的符号表,对应各个类型函数的跳转;

根据原理和源码的查看,解释器也是有统一的入口,从此就可以找到一个锚点来进行Hook监控函数的执行。但是目前由于源码的限制,对于return 的参数没有很好的锚点,所以此版本对于return 是无法替换的

基于此的话 代码也就非常简单了

找到锚点,这里使用EnterFrameFromInterpreter和EnterFrameFromNative 进行Hook 来解析methodInfo 和StackObject

1
2
3
4
5
6
7
8
9
//先解析符号表
 let moduleSymbolDetails = module.enumerateSymbols();
            for (let i = 0; i < moduleSymbolDetails.length; i++) {
                let symbol = moduleSymbolDetails[i];
                if (symbol.name==="_ZN9hybridclr11interpreter16InterpFrameGroup25EnterFrameFromInterpreterEPKNS0_16InterpMethodInfoEPNS0_11StackObjectE"
                   ||symbol.name==="_ZN9hybridclr11interpreter16InterpFrameGroup20EnterFrameFromNativeEPKNS0_16InterpMethodInfoEPNS0_11StackObjectE"){
                    HybridCLR.doAttach(symbol.address);
                }
            }

一个attach搞定

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
doAttach:function (addr) {
      Interceptor.attach(addr,{
          onEnter:function (args){
              let interpMethodInfo = new InterpMethodInfo(args[1]);
              let methodInfo = interpMethodInfo.get_methodInfo();
              let methodName = methodInfo.name();
              let klass = methodInfo.getClass();
              let il2CppImage = il2cppApi.il2cpp_class_get_image(klass);
              let klassName = klass.name();
              let dll = il2CppImage.name();
              let namespaze = klass.namespaze();
              let flags = methodInfo.getFlags();
              let methodStatic = utils.get_method_static(flags);
              // console.log("is methodStatic "+methodStatic)
              let argCount = interpMethodInfo.get_argCount();
              let key;
              if (methodStatic){
                   key = dll + "_" + namespaze + "_" + klassName + "_" + methodName + "_" + argCount;
              }else {
                   key = dll + "_" + namespaze + "_" + klassName + "_" + methodName + "_" + (argCount-1);
              }
 
              let callback = observes.get(key);
              if (callback){
                  let argBase= args[2];
                  let runtimeArgs= [];
                  for (let i = 0; i < argCount; i++) {
                      let arg = argBase.add(i*Process.pointerSize);
                      runtimeArgs.push(arg);
                  }
                  callback(interpMethodInfo,runtimeArgs);
              }
          }
      })
  }

项目地址 :https://github.com/IIIImmmyyy/HybirdCLR-Hook.git
代码不到100行 简单粗暴, 但是对于return 的参数依旧没有一个好的锚点,抛砖引玉,希望各位大佬给的return的方案


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2024-5-27 16:21 被IIImmmyyy编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢 分享
2024-5-27 16:48
0
游客
登录 | 注册 方可回帖
返回
//