Arthas学习实践

发布时间 2023-08-02 21:31:22作者: Geraltz'Rivia

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 -p 可以重放某次调用

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启动参数,可修改参数