使用 ASM 重写 Java 本机方法

2024-01-07

我试图通过使用重写类的字节码来做到这一点ASM 4.0 http://download.forge.objectweb.org/asm/asm4-guide.pdf来替换所有的native方法与非native stubs.

到目前为止我有这个:

class ClassAdapter extends ClassVisitor {

    public ClassAdapter(ClassVisitor cv) {
        super(Opcodes.ASM4, cv);
    }

    @Override
    public MethodVisitor visitMethod(int access, String base, String desc, String signature, String[] exceptions) {
        return cv.visitMethod(access & ~Opcodes.ACC_NATIVE, base, desc, signature, exceptions);
    }

}

这是由执行的

private static byte[] instrument(byte[] originalBytes, ClassLoader loader) {
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
    ClassAdapter adapter = new ClassAdapter(cw);

    ClassReader cr = new ClassReader(originalBytes);
    cr.accept(adapter, ClassReader.SKIP_FRAMES);

    return cw.toByteArray();
}

这看起来很简单:我剥离ACC_NATIVE关闭该方法中的visitMethod()并保持其他一切不变。但是,当我这样做时java.lang.Object,它死了

Exception in thread "main" 
Exception: java.lang.StackOverflowError thrown from the UncaughtExceptionHandler in thread "main"

StackOverflow 发生在仪器仪表时间,不是在runtime,我认为这很不寻常。但是,如果我删除& ~Opcodes.ACC_NATIVE修饰符,java.lang.Object被重写(在本例中未更改)并完美执行。

显然我没有做正确的事情,并且更换了native方法与非native方法并不像剥离那么简单native方法上的修饰符,但我不知道从哪里开始。这ASM Docs http://download.forge.objectweb.org/asm/asm4-guide.pdf不要谈论与native方法都没有。有 ASM 工作经验的人知道我需要做什么才能获得native方法重写可以工作吗?

EDIT

抱歉,那条简短、无用的消息就是e.printStackTrace()正在给我,但是使用e.getStackTrace()我设法得到一些有用的东西:

java.util.concurrent.ConcurrentHashMap.hash(ConcurrentHashMap.java:332)
java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1124)
java.util.Collections$SetFromMap.add(Collections.java:3903)
sandbox.classloader.MyClassLoader.instrument(Unknown Source)
sandbox.classloader.MyClassLoader.loadClass(Unknown Source)
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClass(ClassLoader.java:791)
java.lang.ClassLoader.defineClass(ClassLoader.java:634)
sandbox.classloader.MyClassLoader.findClass(Unknown Source)
sandbox.classloader.MyClassLoader.loadClass(Unknown Source)
sandbox.Tester.main(Unknown Source)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)

所以在我看来,错误实际上是在执行时发生的(例如,我错误地认为它是在检测时发生的),并且是调用的结果hashCode()。既然如此,hashCode()我(可能错误地)剥夺了它的本机方法之一native修饰符。所以很明显它是calling the native- 删除导致问题的方法。

看起来是什么really奇怪的是堆栈跟踪只有 16 帧深;鉴于这是一个StackOverflowError.


  • 用存根替换本机代码并不那么简单,但也离那不远了

  • 如果你看ClassVisitor#visitMethod(int access、字符串名称、字符串 desc、字符串签名、字符串[] 异常) http://asm.ow2.org/asm33/javadoc/user/org/objectweb/asm/ClassVisitor.html#visitMethod%28int,%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String%5B%5D%29你会看到它返回一个MethodVisitor

  • 方法访问者 http://asm.ow2.org/asm33/javadoc/user/org/objectweb/asm/MethodVisitor.html你现在必须利用它。如果你想制作抽象存根,你应该至少添加对methodVisitor.visitEnd()

  • 如果你想制作空存根,你必须添加visitCode并在必要时返回一个值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ASM 重写 Java 本机方法 的相关文章

随机推荐

  • 将附加 JPanel 添加到 JPanel

    伙计们 这是一个相当基本的问题 基本上我有这样的代码 public SuperPanel setLayout new BorderLayout add panel1 BorderLayout NORTH add panel2 BorderL
  • 文本小部件内的 Tkinter 检查按钮和滚动

    使用中找到的代码这个 stackoverflow 帖子 https stackoverflow com questions 5860675 variable size list of checkboxes in standard tkint
  • 是否可以刷新视图中的ViewBag值?

    我正在尝试做一个动态下拉列表 我从数据库中获取下拉列表的选项并将它们放入对象列表中 根据复选框值 我从列表中删除对象并将该列表设置为 ViewBag 值 public ActionResult ThematicManagement stri
  • 使用 >450K 实例训练 Dlib 对象检测

    dlib 是否能够使用大规模数据集来训练目标检测器 我有超过 450K 的面部图像来训练面部检测器 是否可以使用 Dlib 或者我需要转向另一个替代方案 您可以使用多少数据取决于您的计算机中有多少 RAM 因此 也许您可 以根据每个图像的大
  • Mongodb,$sum 有条件

    文件 name abc length 25 area 10 name abc length 5 聚合查询后的输出 count 2 summarizedLength 30 summarizedArea null id name abc The
  • 字典更新序列元素#0的长度为3; 2 为必填项

    我想向对象添加线条account bank statement line通过其他对象但我收到以下错误 字典更新序列元素 0 的长度为 3 需要 2 这是我的代码 def action account line create self cr
  • System.TypeLoadException Microsoft.VisualBasic ASP.NET Core 2

    Microsoft VisualBasic 程序集与 ASP NET Core2 不兼容吗 我有一个 C 类库 它提供了一种读取 CSV 文件的方法 我选择使用 Microsoft VisualBasic FileIO TextFieldP
  • 如何在另一个微调器打开时一键打开一个微调器

    我有几个spinners在表格上 当我单击其中任何一个时 它会打开并显示选项 当我点击其他任何一个spinner它关闭了打开的spinner但随后我需要再次单击所需的spinner以便打开它 我想捕获第二个微调器的第一次单击 以便我可以关闭
  • 用于查找不属于超链接的文本的正则表达式

    我试图找到一个可用于解析 HTML 块以查找某些特定文本的单个正则表达式 但前提是该文本不是现有超链接的一部分 我想把非链接变成链接 这很容易 但是用单个表达式识别非链接似乎比较麻烦 在以下示例中 This problem is a res
  • 使用 --code-coverage 运行时,Mockery 失败并显示“无法加载模拟...类已存在”

    我正在尝试模拟 phpunit 的类 Php 单元失败并出现错误Could not load mock class already exists 这是我正在运行的唯一测试 因此该类不可能已经被模拟 任何建议将不胜感激 这是错误情况 name
  • Win32 C++ 控制台清屏而不闪烁

    我见过一些主机游戏 屏幕会自行刷新 清除 而不会出现烦人的闪烁 我已经尝试了很多解决方案 这是我目前得到的 while true if screenChanged if something needs to be drawn on new
  • intel oneAPI 基础安装中 ifort 的调用过程是怎样的?

    我正在尝试使用 intel 的数学内核库及其 fortran 编译器 该编译器内置于 oneAPI 基础套件中 然而 命令 ifort 不起作用 因为终端抱怨系统中找不到它 我已经使用命令 source intel oneapi setva
  • fit() 按预期工作,但在评估()期间模型偶然执行

    我注意到一个问题 在评估 期间 我没有看到基于fit 结果的预期结果 我在网上发现了很多讨论 人们都有类似的问题 例如 this https github com keras team keras issues 6977开放问题讨论了 dr
  • C# 中的范围划分

    将范围值分组 例如范围在 0 到 100 之间 我有四个组 A B C D 如果我想将范围分为四组 喜欢 0 25D组 C组26 50 51 75 B组 A组76 100 如何使用 C 进行此类分组 并将范围保存在列表中 那么如何判断某个数
  • Wordpress Mobile - 更改部分 URL 而不是重定向到首页?

    我被要求在一个客户网站上做一些维护工作 但我并没有参与构建 该网站是使用 Wordpress 构建的 移动设备上的任何用户都将被重定向到该网站的更适合移动设备的版本 问题是 如果移动用户单击原始网站 主页 内页等 的任何链接 无论是什么链接
  • “注册 COM 互操作”与“使程序集 COM 可见”

    这两个选项之间的真正区别是什么 我所知道的是 注册 COM 互操作此选项在程序集上执行 regasm 并将程序集注册为注册表中的 COM 组件 也可能不是 以及所有类似 COM 的注册表项 这一步会生成TLB文件吗 还做了什么 有时我看到编
  • 病态的正则表达式会爆炸(时间和内存)?

    什么是病态的正则表达式会破坏许多解析器 在时间和内存上 以及哪些解析器 正则表达式越基本 越标准 非恶意用户无意中想出它的可能性就越大 请随意发布实际时间和内存数据以及解析器版本 我似乎记得 PERL 中过多的后向断言或 编辑 回溯据说可以
  • OpenCV VideoWriter 大小问题

    我正在尝试读取视频文件 处理它 并将处理后的帧写入作为输出视频文件 但是 我收到以下错误 OpenCV Error Assertion failed img cols width img rows height channels 3 in
  • 访问 NSNotification 中传递的对象?

    我有一个正在发布 NSDictionary 的 NSNotification NSDictionary dict NSDictionary dictionaryWithObjectsAndKeys anItemID ItemID NSStr
  • 使用 ASM 重写 Java 本机方法

    我试图通过使用重写类的字节码来做到这一点ASM 4 0 http download forge objectweb org asm asm4 guide pdf来替换所有的native方法与非native stubs 到目前为止我有这个 c