Arthas是一款线上jvm诊断工具,能够查看java应用到资源使用信息、函数调用统计等,同时还能在不停止jvm运行的情况下,修改运行时代码,查看方法的调用、入参、返回值等。
Arthas的关键技术有两方面:java-agent机制与字节码修改(与rasp相同)
Arthas采用命令行的方式与用户交互,Arthas的安装过程可参考官方文档,在测试环境的机器需要手动安装
Arthas命令
在机器上安装完成之后,使用 ./as.sh 命令启动,arthas会自动列出机器上运行的java进程,输入Main类标记的数字,attach到对应的jvm中
sc/sm命令
sc命令查询类(search class),sm命令查询方法(search method)
比如查询某个controller类中有什么方法,可以使用-d参数查询详细的信息
watch命令
watch命令用于观察指定函数的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。
watch 命令定义了 4 个观察事件点,即 -b 函数调用前,-e 函数异常后,-s 函数返回后,-f 函数结束后
watch com.rasp.vulns1.controller.VulnController postJson "{params,target,returnObj}" -x 2 -b -s -n 2
用于观察函数入参以及返回
watch命令相当于一个断点,在方法前后观察是否符合逻辑
trace命令
trace命令可以关注一个方法的调用开销与调用链路
stack命令
有时候不知道什么方法调用的上下文,可以使用stack命令
tt命令
方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测
tt -t -n 3 -m 1 com.rasp.vulns1.controller.VulnController postJson
使用 tt -l 可以看到记录的片段
使用 tt -i
使用 tt -i
redifine与retransform
推荐使用retransform,redifine不能改变一个类的函数签名,不能添加,修改后无法恢复,需要手动redifine原来的字节码
原理就是java Instrumentation接口中,对于类的transformer的使用
可以与 jad/mc 命令结合使用
jad命令用来反编译一个类,mc命令用于编译一个类
jad --source-only com.rasp.vulns1.controller.VulnController > /tmp/VulnController.java
mc /tmp/VulnController.java -d /tmp
这里arthas有个bug,当环境变量中的java与attach的java进程不一致的时候,mc不一定能成功,可以在本地先编译好修改后的class文件,再上传上去修改
retransform /tmp/com/rasp/vulns1/controller/VulnController.class
retransform的使用参考:
retransform /tmp/Test.class
retransform -l
retransform -d 1 # delete retransform entry
retransform --deleteAll # delete all retransform entries
retransform --classPattern demo.* # triger retransform classes
retransform -c 327a647b /tmp/Test.class /tmp/Test$Inner.class
retransform --classLoaderClass 'sun.misc.Launcher$AppClassLoader' /tmp/Test.clas
jad命令
jad可以反编译字节码,rasp对字节码进行了修改,可以通过jad查看修改后的代码
这里没选择 java.*下面的类,因为机器上jdk版本与java运行时的jdk版本不一致,使用 sc -d 查看类的详细信息时,会找不到类的classloader
比如jad反编译 com.mysql.jdbc.StatementImpl ,可以看到在hook的方法处,函数有修改
dump命令
dump可以把已经加载的类的字节码dump到指定目录
其他查询信息命令
有一些命令是查询资源使用或者获取配置,环境变量等信息的命令
-
dashboard 数据大盘,显示Thread,Memory,GC等信息
-
jvm 查询jvm信息,版本,classloader,垃圾回收器,内存空间分布,OS信息,文件描述符信息等
-
memory 各个区域内存空间的大小与占比
-
sysenv 环境变量
-
sysprop 系统属性信息,可修改
-
vmoption vm启动参数,可修改参数