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对字节码进行验证后将决定是否加载。

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

javaweb-codereview 学习记录-5的更多相关文章

  1. javaWeb后端学习记录

    java后端学习重点: 1.java语言特性: 基础知识,集合,多线程,并发,JVM,NIO,网络编程,设计模式.  (★★★★★) jdk源码中有大量的数据结构与java语言细节.jdk源码着重看c ...

  2. java后端学习记录2019

    学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...

  3. Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客

    ==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...

  4. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  5. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  6. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  7. JavaWeb基础学习体系与学习思路

    对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...

  8. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  9. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  10. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. 换根DP(二次扫描)

    参考来自这里: https://blog.csdn.net/qq_41286356/article/details/94554729 题目在这里 https://ac.nowcoder.com/acm ...

  2. 洛谷$P5366\ [SNOI2017]$遗失的答案 数论+$dp$

    正解:数论$dp$ 解题报告: 传送门$QwQ$ 考虑先质因数分解.所以$G$就相当于所有系数取$min$,$L$就相当于所有系数取$max$ 这时候考虑,因为数据范围是$1e8$,$1e8$内最多有 ...

  3. 使用ASP.NET Core 3.x 构建 RESTful API - 4.3 HTTP 方法的安全性和幂等性

    什么样的HTTP方法是安全的? 如果一个方法不会该表资源的表述,那么这个方法就被认为是安全的. 例如 HTTP GET 和 HTTP HEAD 就被认为是安全的,但需要注意的是,这并不意味着执行GET ...

  4. 【C++】几个简单课本例题

    // // main.cpp // 2_1 // // Created by T.P on 2018/2/28. // Copyright © 2018年 T.P. All rights reserv ...

  5. 人生苦短,我用Python(6)

    1.分隔.合并字符串 分隔字符串是把字符串分隔为列表,而合并字符串是把列表合并为字符串,分割字符串和合并字符串可以看作是互逆操作. (1)分隔字符串 字符串对象得split()方法可以实现字符串分隔, ...

  6. 01_elementUI tree 插件 去图标

    1:elementUI饿了吗前端ui框架,结合vue开发过程中,是不是对tree组件很头疼呢?是不是想自定义图标或者去掉所有图标只留末级checkbox呢? 实现很简单添加几行css代码完美搞定!!! ...

  7. Java程序员必备基础:内部类解析

    前言 整理了一下内部类的相关知识,算是比较全,比较基础的,希望大家一起学习进步. 一.什么是内部类? 在Java中,可以将一个类的定义放在另外一个类的定义内部,这就是内部类.内部类本身就是类的一个属性 ...

  8. 欧拉-拉格朗日方程 The Euler-Lagrange Equation

    在 paper: Bounded Biharmonic Weights for Real-Time Deformation 中第一次接触到 Euler-Lagrange 方程,简单记录一下. 泛函的定 ...

  9. 如何在ArcGIS中恢复MapGIS制图表达信息

    1.输出符号信息 Map2Shp软件中提供了图示表达转换功能,提供对MapGIS图形特征可视表达信息的跨平台支持.若要使用该功能,必须在转换时,"图元参数输出方式"选定为[图元参数 ...

  10. 1、纯python编写学生信息管理系统

    1.效果图 2.python code: class studentSys(object): ''' _init_(self) 被称为类的构造函数或初始化方法, self 代表类的实例,self 在定 ...