项目简介

copagent主要用于内存马查杀。

项目编译

1.生成agent.jar

2.将其拷贝进入cop的resources文件夹中

3.生成cop.jar

将刚才的agent.jar,拷贝到resrouces文件夹。

打包jar

模块主要功能介绍

1.cop

注入进程jvm进程

2.agent

扫描进程

模块流程详细分析

cop模块

1.启动cop.jar

1.1 释放agent.jar

1.2.再次启动cop.jar进程,进入到cop模块的注入流程

            //解析参数try {Options options = new Options();options.addOption("h", "help", false, "print options information");options.addOption("v", "version", false, "print the version of copagent");options.addOption("p", "pid", true, "attach jvm process pid");options.addOption("c", "class", true, "class name regex to dump");CommandLineParser parser = new DefaultParser();CommandLine cmdLine = parser.parse(options, args);if (cmdLine.hasOption("version")) {AnsiLog.info("Version   :  " + version_info.get("Project-Version") + "\nBuild Time:  " + version_info.get("Build-Time") + "\n");System.exit(0);} else if (cmdLine.hasOption("help")) {new HelpFormatter().printHelp("java -jar copagent.jar", options, true);System.exit(0);}if(cmdLine.hasOption("class")){filterClassName = cmdLine.getOptionValue("class");}if (cmdLine.hasOption("pid")) {String input_pid = cmdLine.getOptionValue("pid");pid = Long.parseLong(input_pid);jvm_pid = Long.toString(pid);}else {AnsiLog.info( AnsiLog.red("Version") + "    : " + AnsiLog.yellow(version_info.get("Project-Version")));AnsiLog.info(AnsiLog.red("Build Time")+ " : " + AnsiLog.yellow(version_info.get("Build-Time")));// select jvm process pidtry {pid = ProcessUtils.select(false, -1, null);} catch (InputMismatchException e) {AnsiLog.warn("Please input an integer to select pid.");System.exit(1);}if (pid < 0) {AnsiLog.error("Please select an available pid.");System.exit(1);}jvm_pid = Long.toString(pid);}} catch (Throwable e) {AnsiLog.error("Failed to parse options\n" + e.getMessage());System.exit(0);}// 释放agent.jar流程if(! agent_work_directory.exists()){if(! PathUtils.createDirectory(agent_work_directory)){AnsiLog.warn("Create directory {} failed, use {}", agent_work_directory.getAbsolutePath(), PathUtils.getTempDirectory().getAbsolutePath());agent_work_directory = PathUtils.getTempDirectory();}}attach_jar_path = new File(agent_work_directory, "agent.jar").getAbsolutePath();//从自身jar包资源,释放agent.jarif(! new File(attach_jar_path).exists()){PathUtils.copyResources("/agent.jar", new File(attach_jar_path));if(! new File(attach_jar_path).exists()){AnsiLog.error("Create agent.jar file [{}] failed !", attach_jar_path);System.exit(1);}}/** java <opts> -jar cop.jar <pid> </path/to/agent.jar> <dumpClassName>* */List<String> opts = new ArrayList<String>();opts.add("-jar");opts.add(current_jar_path);opts.add(jvm_pid);opts.add(attach_jar_path);opts.add(filterClassName);// real start cop.jar processProcessUtils.startProcess(pid, opts);}

启动进程参数列表如下:

其中-Xbootclasspath表示搜索类路径,之后会启动agent.jar包,传递pid,需要注入的agent.jar路径,不扫描的排出类,boot_flag表示开启注入功能

0 = "C:\Program Files\Java\jdk1.8.0_301\jre\..\bin\java.exe"
1 = "-Xbootclasspath/a:C:\Program Files\Java\jdk1.8.0_301\jre\..\lib\tools.jar"
2 = "-jar"
3 = "C:\Users\test\Desktop\copagent-master\cop\target\agent.jar"
4 = "12228"
5 = "C:\Users\test\Desktop\copagent-master\cop\target\.copagent\agent.jar"
6 = "[unknown]"
7 = "bootstart_flag"

3.注入agent.jar进入JVM进程,上述步骤

        if(is_boot_start || is_greater_than_jre9 ){//注入流程jvm_pid = args[0];attach_jar_path = args[1];if(args.length >= 3){filterClassName = args[2];}AnsiLog.info("Try to attach process " + jvm_pid + ", please wait a moment ...");attach(jvm_pid, attach_jar_path, filterClassName);AnsiLog.info("Attach process {} finished .", jvm_pid);AnsiLog.info("Result store in : {}", new File(agent_work_directory, "result.txt"));System.exit(0);}else{

注入代码 如下

    public static void attach(String jvm_pid, String agent_jar_path, String filterClass) throws Exception{VirtualMachine virtualMachine = null;VirtualMachineDescriptor virtualMachineDescriptor = null;for (VirtualMachineDescriptor descriptor : VirtualMachine.list()) {String pid = descriptor.id();if (pid.equals(jvm_pid)) {virtualMachineDescriptor = descriptor;break;}}try{if (null == virtualMachineDescriptor) {virtualMachine = VirtualMachine.attach(jvm_pid);} else {virtualMachine = VirtualMachine.attach(virtualMachineDescriptor);}Properties targetSystemProperties = virtualMachine.getSystemProperties();String targetJavaVersion = JavaVersionUtils.javaVersionStr(targetSystemProperties);String currentJavaVersion = JavaVersionUtils.javaVersionStr();if (targetJavaVersion != null && currentJavaVersion != null) {if (!targetJavaVersion.equals(currentJavaVersion)) {AnsiLog.warn("Current VM java version: {} do not match target VM java version: {}, attach may fail.", currentJavaVersion, targetJavaVersion);AnsiLog.warn("Target VM JAVA_HOME is {}, copagent JAVA_HOME is {}, try to set the same JAVA_HOME.", targetSystemProperties.getProperty("java.home"), System.getProperty("java.home"));}}virtualMachine.loadAgent(agent_jar_path, filterClass);}catch (Throwable t){t.printStackTrace();} finally {if (null != virtualMachine) {virtualMachine.detach();}}
}

通过下列两个API函数来完成java agent的加载

VirtualMachine.attach()

virtualMachine.loadAgent(agent_jar_path, filterClass);

内存马查杀copagent研究相关推荐

  1. Java内存马查杀GUI工具

    注意:请勿在生产环境使用,存在打崩业务的风险,目前适用于自己搭建靶机分析学习 功能: 关于Java Web内存马查杀的文章和工具已经有不少,不过大都不够完善,各有缺点:于是我做了一款GUI版本的实时内 ...

  2. 应急响应 -162天:webshell和内存马查杀

    首要任务: 获取当前WEB环境的组成架构(语言,数据库,中间件,系统等) #IIS&.NET-注入-基于时间配合日志分析 背景交代:某公司在某个时间发现网站出现篡改或异常 应急人员:通过时间节 ...

  3. 【应急响应】网站入侵篡改指南Webshell内存马查杀漏洞排查时间分析

    网站入侵篡改指南&Webshell内存马查杀&漏洞排查&时间分析 章节内容点: IIS&.NET-注入-基于时间配合日志分析 Apache&PHP-漏洞-基于漏 ...

  4. 内存马查杀工具FindShell试用

    首先使用冰蝎创建一个内存马 成功进入内存马界面 接下来尝试使用findshell查杀,项目主页为 https://github.com/4ra1n/FindShell 服务器上首先部署代码,执行 gi ...

  5. java内存马查杀工具

    java-memshell-scanner:扫描java内存马 <%@ page import="java.net.URL" %> <%@ page import ...

  6. 内存马检测与利用研究的优秀文章汇总

    出品|MS08067实验室(www.ms08067.com) 随着攻防技术演变,传统形式的jsp木马已经不能满足攻击者的需求,因此内存马(无文件落地Webshell)重回大众视野,成为RedTeam广 ...

  7. Goby 利用内存马中的一些技术细节【技术篇】

    一.前言 投稿在 Goby 社区的内存马文章已经写了两篇,在第一篇<Shell中的幽灵王者-JAVAWEB 内存马 [认知篇]>中介绍了 JavaWeb 内存马技术的历史演变.分类,从认知 ...

  8. 【网络安全】Agent内存马的自动分析与查杀

    前言 出发点是Java Agent内存马的自动分析与查杀,实际上其他内存马都可以通过这种方式查杀 本文主要的难点主要是以下三个,我会在文中逐个解答 如何dump出JVM中真正的当前的字节码 如何解决由 ...

  9. 【Web安全】JSP内存马研究

    前言 最近在研究webshell免杀的问题,到了内存马免杀部分发现传统的Filter或者Servlet查杀手段比较多,不太容易实现免杀,比如有些工具会将所有注册的Servlet和Filter拿出来,排 ...

最新文章

  1. shell中字符串截取的几种方法
  2. WCF项目的架构设计
  3. python路径分隔符_Python:当读取一个没有默认分隔符的文件(包含数百万条记录)并将其放入dataframe (pa-问答-阿里云开发者社区-阿里云...
  4. gulp 项目构建 代码压缩与混淆
  5. PHP常用的自定义函数
  6. Maven查看插件信息
  7. Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
  8. 空气投影+生物识别,支付宝的“如影计划”还有多少硬仗要打?
  9. linux命令行用户登录,Linux终端以及用户登录相关命令
  10. Arcgis重采样或者裁剪的问题
  11. Print Conductor中文版
  12. hysys动态模拟教程_泄压过程的HYSYS动态模拟.pdf
  13. java.lang.ClassCastException: Ljava.lang.Object; cannot be cast to com.entity.Advertisem异常
  14. java 实现短信验证码功能
  15. win10 tagWnd部分成员逆向(窗口隐藏,窗口保护)
  16. Win10正式版微软官方原版ISO系统镜像下载大全
  17. Arduino入门小知识点总结(2)(红外感应开关 与 继电器接法 模拟输入输出tone函数)
  18. vue项目如何打包部署到后端
  19. MySQL中专门的关系运算
  20. [剑指Offer]Q9_栈和队列(用两个栈实现队列)

热门文章

  1. 为 NuGet 指定检测的 MSBuild 路径或版本,解决 MSBuild auto-detection: using msbuild version 自动查找路径不合适的问题
  2. 我的新玩具-AppleScript(三)
  3. 2021Kali系列 -- 目录扫描(Dirbuster)
  4. 前锋HTML5三阶段月总结,【赛季总结】蒋光太
  5. 开发板和虚拟机Linux使用scp命令互传文件
  6. 微信小程序大型背景图片设置
  7. web版本 开源压测工具_Web服务压测神器wrk
  8. 再谈云原生时代的系统软件,创造一个开放、无锁定、低成本的技术体系
  9. 达人评测 i7 13700K和i513600k选哪个好
  10. 简述计算机仿真的基本步骤,计算机仿真技术考试试题(建工)