项目简介

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. linux tc打造ip流量限制
  2. Java web 强制301跳转
  3. 当maven说“直到MyRepo的更新间隔过去时,才会重新尝试解析”,该间隔在哪里指定?
  4. MyISAM和InnoDB的索引在实现上的不同
  5. PyQt5 图形界面 - Qt Designer设置简体中文方法演示,Qt Designer字体设置,Qt Designer工具单独安装包获取,Qt Designer简体中文语言包获取
  6. 在Kaggle上赢得大数据竞赛的技巧和窍门
  7. 计算机图画大赛作品六年级,打字能手显本领,电脑绘画展风采——记陆埠二小举行电脑绘画和电脑打字比赛...
  8. 手工代付系统/api代付系统/代付系统源码
  9. JavaScript高级程序设计学习笔记--事件
  10. c语言flappy bird代码,Flappy bird源代码(略吊)
  11. vim 显示/取消行号
  12. 微型计算机中call指令,微机原理 第四章 微型计算机指令系统.ppt
  13. 深度学习---卷积神经网络+tensorflow实现
  14. python中abs函数是什么意思_python abs函数怎么用
  15. mASK调制在AWGN信道下的可达信息速率的积分计算法
  16. 【农业物联网】智慧农业模型应用多案例分享
  17. java pdf 背景图,Java 设置PDF文档背景——单色背景、图片背景
  18. 51nod1462 树据结构
  19. VRTK插件详解四:部分自带案例分析
  20. Potree使用指南

热门文章

  1. deepin安装xfce4
  2. vm服务器共享文件夹,超简单与实用的两种vmware虚拟机与主机共享文件的方法 | 古意人...
  3. win10提示“无法枚举容器中的对象 访问被拒绝”如何解决
  4. 实是球事APP竞彩推荐 周三 003 亚冠:[3]济州联队 VS 江苏苏宁[2]
  5. Ubuntu16.04安装OSSEC详细步骤
  6. 【2019.09.19】数独(Sudoku)游戏之我见(软工实践第三次作业)
  7. 怎样把PDF文件放到公众号里
  8. js 中call()与apply()区别与常见用途
  9. Java并发工具类(4):Exchanger相关介绍
  10. 【Python模块学习】pandas模块简介