ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Agent Java内存马 分析 检测

2022-06-29 11:36:31  阅读:151  来源: 互联网

标签:java Agent 修改 内存 jvm Java 加载


在jdk 1.5之后引入的java.lang.instrument包提供了检测java程序的api,用于监控、收集性能信息、诊断问题等。通过 java.lang.instrument 实现的工具我们称之为 Java Agent ,Java Agent 能够在不影响正常编译的情况下来修改字节码,即动态修改已加载或者未加载的类,包括类的属性、方法等。

Java agent 一般来说又两种使用方法:

  1. premain方法:
    这种方法会在jvm启动前加载,需要-javaagent参数,这两种情况我们基本都无法控制,因为jvm一般来说已经启动
  2. agentmain方法:
    相对于上面的只能在启动前开启,agentmain可以在jvm已经启动时候插入,可以想象我们如果能控制这一步骤就能改动运行的java程序,如果我们直接它的运行代码中插入恶意代码一般的监控软件很难检测到也很难排查

接下来我们分析agentmain方法的一种实现:https://github.com/rebeyond/memShell
整个agentmain方法的利用链如下:

(1) 想办法获得jvm的pid(就是java进程)
(2) 通过VirtualMachine virtualMachine = VirtualMachine.attach(pid) 获得一个attach到jvm上的实例
(3) 之后通过virtualMachine.loadAgent(jarName) 让jvm执行一个我们指定的jar包(当我们将代码注入成功之后最后在结尾使用virtualMachine.detach 将痕迹清理)
(4) 之后就是我们的agent的功能了,这地方一般就可以自由发挥了。一般来说需要使用Java的instrumentation来注册修改方法,然后调用javassist去修改字节码,修改字节码的技术有很多,一般来说使用javassist这个比较简单一些
(5) 在agentment中调用Instrumentation.getAllLoadedClasses()获得全部的已加载的类,然后遍历所有类找到我们想要修改的类,使用Instrumentation. addTransformer(new TransformerDemo(), true);添加我们编写的transformer
(6) 之后使用Instrumentation.retransformClasses(我们想要修改的class)来触发我们的transformer
(7) 最后在transfromer中使用javassist等方法去修改字节码,至于要添加什么代码就看自己的想法了,注入完成之后可以直接删除所有的文件

检测步骤与注入步骤基本相同:

1.Attach检测Agent到JVM进程
2.获取JVM中已经加载的Class列表
3.根据指纹特征将可疑的Class反编译为Java源码
4.根据源码检测出Webshell

标签:java,Agent,修改,内存,jvm,Java,加载
来源: https://www.cnblogs.com/ash-33/p/16422674.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有