• 内存马查杀copagent研究


    项目简介

    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模块的注入流程

    1. //解析参数
    2. try {
    3. Options options = new Options();
    4. options.addOption("h", "help", false, "print options information");
    5. options.addOption("v", "version", false, "print the version of copagent");
    6. options.addOption("p", "pid", true, "attach jvm process pid");
    7. options.addOption("c", "class", true, "class name regex to dump");
    8. CommandLineParser parser = new DefaultParser();
    9. CommandLine cmdLine = parser.parse(options, args);
    10. if (cmdLine.hasOption("version")) {
    11. AnsiLog.info("Version : " + version_info.get("Project-Version") + "\nBuild Time: " + version_info.get("Build-Time") + "\n");
    12. System.exit(0);
    13. } else if (cmdLine.hasOption("help")) {
    14. new HelpFormatter().printHelp("java -jar copagent.jar", options, true);
    15. System.exit(0);
    16. }
    17. if(cmdLine.hasOption("class")){
    18. filterClassName = cmdLine.getOptionValue("class");
    19. }
    20. if (cmdLine.hasOption("pid")) {
    21. String input_pid = cmdLine.getOptionValue("pid");
    22. pid = Long.parseLong(input_pid);
    23. jvm_pid = Long.toString(pid);
    24. }
    25. else {
    26. AnsiLog.info( AnsiLog.red("Version") + " : " + AnsiLog.yellow(version_info.get("Project-Version")));
    27. AnsiLog.info(AnsiLog.red("Build Time")+ " : " + AnsiLog.yellow(version_info.get("Build-Time")));
    28. // select jvm process pid
    29. try {
    30. pid = ProcessUtils.select(false, -1, null);
    31. } catch (InputMismatchException e) {
    32. AnsiLog.warn("Please input an integer to select pid.");
    33. System.exit(1);
    34. }
    35. if (pid < 0) {
    36. AnsiLog.error("Please select an available pid.");
    37. System.exit(1);
    38. }
    39. jvm_pid = Long.toString(pid);
    40. }
    41. } catch (Throwable e) {
    42. AnsiLog.error("Failed to parse options\n" + e.getMessage());
    43. System.exit(0);
    44. }
    45. // 释放agent.jar流程
    46. if(! agent_work_directory.exists()){
    47. if(! PathUtils.createDirectory(agent_work_directory)){
    48. AnsiLog.warn("Create directory {} failed, use {}", agent_work_directory.getAbsolutePath(), PathUtils.getTempDirectory().getAbsolutePath());
    49. agent_work_directory = PathUtils.getTempDirectory();
    50. }
    51. }
    52. attach_jar_path = new File(agent_work_directory, "agent.jar").getAbsolutePath();
    53. //从自身jar包资源,释放agent.jar
    54. if(! new File(attach_jar_path).exists()){
    55. PathUtils.copyResources("/agent.jar", new File(attach_jar_path));
    56. if(! new File(attach_jar_path).exists()){
    57. AnsiLog.error("Create agent.jar file [{}] failed !", attach_jar_path);
    58. System.exit(1);
    59. }
    60. }
    61. /*
    62. * java <opts> -jar cop.jar <pid> </path/to/agent.jar> <dumpClassName>
    63. * */
    64. List<String> opts = new ArrayList<String>();
    65. opts.add("-jar");
    66. opts.add(current_jar_path);
    67. opts.add(jvm_pid);
    68. opts.add(attach_jar_path);
    69. opts.add(filterClassName);
    70. // real start cop.jar process
    71. ProcessUtils.startProcess(pid, opts);
    72. }

    启动进程参数列表如下:

    其中-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进程,上述步骤

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

    注入代码 如下

    1. public static void attach(String jvm_pid, String agent_jar_path, String filterClass) throws Exception{
    2. VirtualMachine virtualMachine = null;
    3. VirtualMachineDescriptor virtualMachineDescriptor = null;
    4. for (VirtualMachineDescriptor descriptor : VirtualMachine.list()) {
    5. String pid = descriptor.id();
    6. if (pid.equals(jvm_pid)) {
    7. virtualMachineDescriptor = descriptor;
    8. break;
    9. }
    10. }
    11. try{
    12. if (null == virtualMachineDescriptor) {
    13. virtualMachine = VirtualMachine.attach(jvm_pid);
    14. } else {
    15. virtualMachine = VirtualMachine.attach(virtualMachineDescriptor);
    16. }
    17. Properties targetSystemProperties = virtualMachine.getSystemProperties();
    18. String targetJavaVersion = JavaVersionUtils.javaVersionStr(targetSystemProperties);
    19. String currentJavaVersion = JavaVersionUtils.javaVersionStr();
    20. if (targetJavaVersion != null && currentJavaVersion != null) {
    21. if (!targetJavaVersion.equals(currentJavaVersion)) {
    22. AnsiLog.warn("Current VM java version: {} do not match target VM java version: {}, attach may fail.", currentJavaVersion, targetJavaVersion);
    23. 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"));
    24. }
    25. }
    26. virtualMachine.loadAgent(agent_jar_path, filterClass);
    27. }catch (Throwable t){
    28. t.printStackTrace();
    29. } finally {
    30. if (null != virtualMachine) {
    31. virtualMachine.detach();
    32. }
    33. }
    34. }

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

    VirtualMachine.attach()

    virtualMachine.loadAgent(agent_jar_path, filterClass);

  • 相关阅读:
    计算机考研数据结构题库
    回顾封装、继承和多态的概念,并给出相关示例
    最优化:建模、算法与理论(优化建模——2)
    全国计算机四级之网络工程师知识点(二)
    Python:每日一题之四平方和
    git使用进阶(二)
    Spring Cloud
    (附源码)php柘城县农产品销售网站 毕业设计 020832
    基于C++实现的游客信息管理系统
    iOS runtime
  • 原文地址:https://blog.csdn.net/SHELLCODE_8BIT/article/details/126806552