为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过ASM中的核心api获取maxLocals?

如何通过ASM中的核心api获取maxLocals?

FFIVE 2022-12-21 13:06:43
我想获取maxLocals存储数据,比如int index = mv.visitLocalVariable(name, desc, null, start, end, ++maxLocals);通过tree api,this.nextLocals = methodNode.maxLocals; 但核心 api,什么都没有。inject into out , error method around biz~.像这样:@Test    public void testCode() {        hooK hook = StatisGet.get(1L);        hook.into();        try {            //biz            hook.out();        } catch (Throwable e) {            hook.error(e);        }    }现在我能够成功地注入字节码,但是 solt 有时会出错,因为我无法获取 maxLocal。
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

假设“核心 API”指的是访问者 API,上面有方法visitMaxsMethodVisitor将使用最大堆栈和局部变量编号调用。

但是有一个问题; 此方法将在其他访问者方法之后调用。所以你不能事先使用那个数字来找到一个未使用的局部变量。

一种解决方案是使用适配器,LocalVariablesSorter如果您认为它是“核心 API”的一部分。它允许你在你需要一个空闲的局部变量时调用newLocal,它会告诉你下一个到目前为止还没有遇到的变量号。然后它会记住这个编号,如果在继续访问原始代码时遇到变量号使用冲突,它会重新编号这些变量号,以解决冲突。

在处理注入的代码时,您只需要关心在原始方法访问者(编写者)上调用访问者方法,因为LocalVariablesSorter将为原始代码调用访问者方法并进行转换。另请参阅此答案那个答案


查看完整回答
反对 回复 2022-12-21
  • 1 回答
  • 0 关注
  • 59 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信