首页 > 其他分享 >Arthas学习实践

Arthas学习实践

时间:2023-08-02 21:33:25浏览次数:36  
标签:tmp java 实践 retransform 学习 命令 Arthas jad

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

标签:tmp,java,实践,retransform,学习,命令,Arthas,jad
From: https://www.cnblogs.com/cyyyyx/p/17601798.html

相关文章

  • parquet极简学习
    parquet极简学习摘要parquet的概念:Parquet文件是一种列式存储文件格式,广泛应用于大数据处理框架,如ApacheHadoop和ApacheSpark。它通过将数据组织成列而不是行来优化大型数据集的读写。这种列式存储格式允许进行高效压缩、更好的查询性能,并在处理大型数据集时提高I/O效率......
  • 1588学习
    1)https://www.intel.cn/content/www/cn/zh/docs/programmable/683639/16-1/adding-the-external-time-of-day-module.html2.5.3.为具有1588PTP特性的实例添加外部Time-of-Day模块  2)https://www.intel.cn/content/www/cn/zh/docs/programmable/683639/16-1/implementing-a-......
  • Java学习Day06
    第四章流程控制语句一、概述1.1、说明在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。简单来说......
  • Java学习Day07
    第六章方法一、方法1.1、概述在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法。如:小明同学在路边准备坐车来学校学习。这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可采用坐公交车或坐出租车的方式来学校,那么,这种解决某件事情的办法,我们就称为方......
  • GTD学习资料
    1理论GTD精要掘灵计划0010:被神化了的GTD,究竟能帮我们什么忙?小常识:GTD和时间管理没有半毛钱关系GetThingsDone–Part32实践GTD系列教程4:本草纲目的MLO系统实战总结GTD在滴答清单中的具体实践(模板实现)GTD经验分享:有效率的工作GettingThingsDone(GTD)Flowchart:ACompl......
  • 微信小程序学习笔记(完结)
    本笔记是小程序学习笔记,主要记录小程序の基础知识说明本笔记为观看慕课网微信小程序入门与实战-全新版、尚硅谷2021版微信小程序开发(零基础小程序开发入门到精通)这两个教学视频、并参照官方的微信开放文档记录整理而成两个教学视频主要就是是面向初学者......
  • 进程注入如何通过调用栈,使用ML分类来检测——非常值得借鉴,待实践
    4、MachineLearningtoUltimatelyDefeatAdvancedRansomwareThreatsRSA2022的这个分享主题核心讲解了进程注入如何通过调用栈,使用ML分类来检测。当然,勒索的其他本质特征例如文件加密等没有提到。但是其进程注入的检测值得重点关注。Ryukasthemostadvancedformofransomw......
  • k8s 学习笔记之 Pod——Pod 的配置
    Pod的配置先研究pod.spec.containers属性,这也是pod配置中最为关键的一项配置。[root@k8s-master01~]#kubectlexplainpod.spec.containersKIND:PodVERSION:v1RESOURCE:containers<[]Object>#数组,代表可以有多个容器FIELDS:name<string>#容器名......
  • k8s 学习笔记之 Pod——Pod 的生命周期
    Pod生命周期我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期,它主要包含下面的过程:pod创建过程运行初始化容器(initcontainer)过程运行主容器(maincontainer)容器启动后钩子(poststart)、容器终止前钩子(prestop)容器的存活性探测(livenessprobe)、就绪性探......
  • Drone自动化构建学习
    使用Drone进行自动化构建提到CI/CD,最有名的当然是jenkins,但是它好像太复杂了,不管是装在主机,还是装在docker里,都很难使用,更何况很多插件还很难下载。上手难度这么大,当然就不利于新手学习了,于是转而使用Drone,它可是相当轻量的产品了,本身就支持以容器提供服务。虽然只是简单的过程,......