javaweb-codereview 学习记录-5
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的更多相关文章
- javaWeb后端学习记录
java后端学习重点: 1.java语言特性: 基础知识,集合,多线程,并发,JVM,NIO,网络编程,设计模式. (★★★★★) jdk源码中有大量的数据结构与java语言细节.jdk源码着重看c ...
- java后端学习记录2019
学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...
- Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客
==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- JavaWeb基础学习体系与学习思路
对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
随机推荐
- Web_telnet 通过JAVA实现网页上面的命令行远程工具 以及对于流的理解
前言 这几天研究了一下如何在web页面上通过telnet 连接一个远程的机器,通过命令行进行控制,让然,B/S架构的项目,如果直接通过 浏览器是无法和远程机器进行通信的,我们就得借助后端来帮助实现这样 ...
- 公子奇带你一步一步了解Java8中Lambda表达式
在上一篇<公子奇带你一步一步了解Java8中行为参数化>中,我们演示到最后将匿名实现简写为 (Police police) -> "浙江".equals(poli ...
- 【一起学源码-微服务】Nexflix Eureka 源码五:EurekaClient启动要经历哪些艰难险阻?
前言 在源码分析三.四都有提及到EurekaClient启动的一些过程.因为EurekaServer在集群模式下 自己本身就是一个client,所以之前初始化eurekaServerContext就有 ...
- highlight.js代码风格引入方法
<link href="https://cdn.bootcss.com/highlight.js/9.15.10/styles/darcula.min.css" rel=&q ...
- Python第一天哇
iDLE的清除方法ctrl+: 当然,你首先要把网上百度到那个文件按照步骤加上去啦 我百度的=-=:https://www.cnblogs.com/stuqx/p/7291933.html Pyth ...
- AQS原理及应用
To use this class as the basis of a synchronizer, redefine the * following methods, as applicable, b ...
- 【UEFI】---记录一次debug过程中的调试经验
最近在调试一次SMBIOS的动态更新以及I2c设备的配置读取时,遇到了很多问题,特此总结: 1. 第一个是调试一个I2c设备的时候,遇到了一个很奇怪的问题,也由此问题总结了下SMBUS模块的知识,如下 ...
- win10 指纹无法登记
搞了好久指纹登记不了,一度认为是电脑有问题.后来终于找到答案: 那就是先删除PNI密码再登记指纹! 经过重装驱动屡试无果,最后突发奇想,把PIN码删除掉再登记指纹,果然可以了. ----------- ...
- Mybatis中jdbcType的类型
具体支持的类型参见:org.apache.ibatis.type.JdbcType ARRAY, BIT, TINYINT, SMALLINT, INTEGER, BIGINT, FLOAT, REA ...
- go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)
目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...