1.关于URLConnection

应用程序利用url与远程通信的所有类的超类

jdk1.8中支持的协议包括以上这些,gopher在jdk8中取消了。

java中默认对(http|https)做了一些事情,比如:

默认启用了透明NTLM认证
默认跟随跳转

httpURLconnection可能jdk7低版本可能在win机器上导致ntlmrelay攻击https://zhuanlan.zhihu.com/p/64889695

使用URLconnection的子类可能只适合http|https,对ssrf也有一定的限制

HttpURLConnection
HttpClient
Request
okhttp

2.关于java agent

Java中Instrumentation(Java Agent API)JVMTI(JVM Tool Interface)功能,允许JVM在加载某个class文件之前对其字节码进行修改,同时也支持对已加载的class(类字节码)进行重新加载(Retransform),rsap和iast都基于这个功能实现动态修改java字节码来插入检测代码

java agent的两种运行模式:

1.直接在命令添加运行参数 -javaagent(Instrumentation API实现方式)或-agentpath/  -agentlib(JVMTI的实现方式)

2.attach方式,直接将agent加到对应的java进程

helloWorld.java

public class helloWorld {
public static void main(String[] args){
System.out.println("hello world");
}
}

比如就上面一段简单的代码,编译后取修改器字节码让其输出hello world,想一下hello world在编译后存储在class文件中,那么此时已经编译成字节码,要输出的字符串肯定也是以字节码存储着,那么此时可以直接替换获取编译好的字节码进行修改

testagent.java

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.lang.instrument.Instrumentation;
import java.security.ProtectionDomain;
import java.util.Arrays; public class testagent { private static byte[] relaceBytes(String classname,byte[] classbuffer)
{
String bufferStr = Arrays.toString(classbuffer).replace("[","").replace("]","");
System.out.println("classname:"+classname);
System.out.println("byes:"+ bufferStr); byte[] findBytes = "hello world".getBytes();
String findStr = Arrays.toString(findBytes).replace("[","").replace("]","");
System.out.println("world"+findStr);
byte[] replaceBytes = "hello agent".getBytes();
String replaceStr = Arrays.toString(replaceBytes).replace("[","").replace("]","");
System.out.println("agent"+replaceStr);
bufferStr = bufferStr.replace(findStr,replaceStr); System.out.println(bufferStr); String[] bytearr = bufferStr.split("\\s*,\\s*"); byte[] bytes = new byte[bytearr.length]; for(int i=0;i < bytearr.length;i++)
{
bytes[i] = Byte.parseByte((bytearr[i])); } System.out.println("new byte :"+Arrays.toString(bytes)); return bytes; }
public static void premain(String args,final 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("helloWorld")){
return relaceBytes(className,classfileBuffer); }
return classfileBuffer;
}
},true); }
}

这里的classfileBuffer就是要修改字节码的class文件,这里替换字节的函数可以自定义,只要返回一个字节数组即可

测试的时候testagent.java编译后要包含MANIFEST.MF,声明premain-class

然后使用jar命令打包

jar -cvfm agent.jar MANIFEST.MF *.class

之后再到helloWorld.class的目录运行agent即可

java -javaagent:agent.jar helloWorld

这里一般修改字节码用ASM库

Instrumentation

java提供的监测jvm程序的api,利用Instrumentation我们可以实现

1.动态添加Transformer(addTransformer),上面的例子就是

2.动态修改classpath(appendToBootstrapClassLoaderSearch、appendToSystemClassLoaderSearch)

3.动态获取所有JVM已经加载的类(getAllLoadedClasses)

4.动态获取某个类加载器已经实例化的所有类(getInitiatedClasses)

5.直接修改已加载的类的字节码

6.动态设置JNI前缀(setNativeMethodPrefix)

7.重加载指定类字节码(retransformClasses)

ClassFileTransformer

转换类文件的代理接口,拿到Instrumentation后可以调用addTransformer方法添加自定义的类文件转换器,上面的例子实际上就自定义了一个Transformer,此时transform(类名,类加载器,类字节码等)方法就包含了我们要修改的目标类的一些信息,修改完再返回字节码,jvm对字节码进行验证后将决定是否加载。

这里简单记录一下,后面有机会再深入学习。

最新文章

  1. [LeetCode] H-Index 求H指数
  2. 在Json解析过程中,我为什么用object1.optInt ,和 object1.optString
  3. java常量池存放在哪里
  4. Linux系统安装及初始化(ubuntu14.04)
  5. Window对象简介
  6. 【BZOJ1007】【HNOI2008】水平可见直线(斜率排序+单调栈)
  7. 在Mac OS X 10.8中配置Apache + PHP + MySQL
  8. Xcode 性能优化
  9. XML文件读取工具类
  10. The Guide To Understanding mysqlreport
  11. jQuery实现轮播图效果
  12. Latex之CJK中文书签乱码[转]
  13. css中var函数
  14. 对于js原型和原型链继承的简单理解(第一种,原型链继承)
  15. Javascript实现继承
  16. Mina源码阅读笔记(三)-Mina的连接IoAccpetor
  17. 方法总结:如何实现html页面自动刷新
  18. sczd
  19. http网站上传文件大小问题【没测试过】
  20. Laravel 的计划任务

热门文章

  1. Go处理PDF
  2. 急速搭建 Serverless AI 应用:为你写诗
  3. dockerfile部署tomcat+jdk
  4. 【题解】CF986E Prince&#39;s Problem(树上差分+数论性质)
  5. asp.net core 3.x 通用主机原理及使用
  6. 前端加密MD5
  7. 通俗易懂理清mybatis中SqlSessionSql、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系
  8. OBS Studio 完全开源免费录屏软件
  9. .net core 开车记:Data Protection Key 过期问题与登录页面访问慢
  10. 《图解机器学习-杉山将著》读书笔记---CH5