zoukankan      html  css  js  c++  java
  • java随手记

    javaagent可以hook字节码处理

    java -javaagent:jebloader.jar -jar xxx.jar

    结合javassist,可以动态替换方法内容

    import java.io.ByteArrayInputStream;
    import java.io.PrintStream;
    import java.lang.instrument.ClassFileTransformer;
    import java.lang.instrument.IllegalClassFormatException;
    import java.lang.instrument.Instrumentation;
    import java.security.ProtectionDomain;
    import javassist.ClassPool;
    import javassist.CtClass;
    import javassist.CtMethod;
    
    public class Loader
    {
      public static void premain(String agentOps, Instrumentation inst)
      {
        inst.addTransformer(new ClassFileTransformer()
        {
          public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer)
            throws IllegalClassFormatException
          {
            className = className.replace("/", ".");
            if (className.equals("com.pnfsoftware.jeb.client.Licensing")) {
              try
              {
                ClassPool pool = ClassPool.getDefault();
                CtClass ctClass = pool.makeClass(new ByteArrayInputStream(classfileBuffer));
                CtMethod a = ctClass.getDeclaredMethod("getExpirationTimestamp", null);
                System.out.println("loader��������100%~");
                a.setBody("return 2000000000;");
                return ctClass.toBytecode();
              }
              catch (Exception e)
              {
                e.printStackTrace();
              }
            } else if (className.equals("com.pnfsoftware.jeb.client.AbstractClientContext")) {
              try
              {
                ClassPool pool = ClassPool.getDefault();
                CtClass ctClass = pool.makeClass(new ByteArrayInputStream(classfileBuffer));
                CtMethod a = ctClass.getDeclaredMethod("startFloatingClient", null);
                System.out.println("loader��������50%~");
                a.setBody("return;");
                return ctClass.toBytecode();
              }
              catch (Exception e)
              {
                e.printStackTrace();
              }
            }
            return new byte[0];
          }
        });
      }
    }

     其他相关文档
    https://bbs.pediy.com/thread-222503.htm

    https://jinyu00.github.io/jeb%E7%A0%B4%E8%A7%A3/2017-10-27-%E7%A0%B4%E8%A7%A3-jeb-2-3-7-demo.html

  • 相关阅读:
    JMeter使用BeanShell断言
    Django启动时找不到mysqlclient处理 django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. Did you install mysqlclient?
    Yapi本地搭建及错误解决
    Selenium设置页面超时时间-快速终止页面加载
    Vue全套精品课笔记
    剑指offer 不用加减乘除做加法
    C++标准库函数
    剑指offer 左旋转字符串
    剑指offer 翻转单词顺序列
    剑指offer 扑克牌顺子
  • 原文地址:https://www.cnblogs.com/yondy/p/7790057.html
Copyright © 2011-2022 走看看