OpenRASP Documents (Old)
  • 简介
  • 安装部署
    • 兼容性说明
    • 安装管理后台
    • 快速接入
      • PHP 服务器
      • Tomcat 服务器
      • JBoss 服务器
      • Wildfly 服务器
      • Resin 服务器
      • Jetty 服务器
      • Spring Boot 框架
      • WebLogic 服务器
      • WebSphere 服务器
      • 宝兰德BES服务器
      • 东方通TongWeb服务器
      • 中创InforSuiteAS服务器
      • 普元PAS服务器
    • 安装测试用例
    • 安装灰盒扫描工具
      • IAST 高级配置选项
    • SIEM 系统集成
      • Splunk
      • Logstash
    • 大规模部署
    • 卸载软件
  • 服务配置
    • 日志说明
    • 管理后台
    • 单机版本
    • 其他配置
  • 功能说明
    • 攻击检测能力说明
    • CVE 漏洞覆盖说明
    • 安全基线检查
    • 应用加固支持
    • 应用异常监控
    • 类库信息查询
    • HTML 响应修改
  • 插件开发
    • 开发插件
    • 接口说明
      • RASP 类接口
      • Context 类接口
    • 参数说明
    • 单元测试
    • 在线调试
    • 官方插件定制
  • 二次开发
    • 架构说明
      • Java 版本
      • PHP 版本
      • 管理后台
      • IAST 扫描器
      • Hook 函数列表
    • 从源代码编译
      • Java 版本
      • PHP 版本
      • 管理后台
    • 云控后台接口
    • 代码调试
    • 添加新的Hook点
    • 添加新的插件API
    • 提交你的代码
  • 性能测试
  • 版本变更
  • 关于我们
Powered by GitBook
On this page
  • Java版本
  • PHP 版本
Export as PDF
  1. 二次开发

添加新的Hook点

Java版本

添加hook点

根据自己的hook点在com.baidu.openrasp.hook包中添加一个继承自AbstractClassHook的类,并实现getType和isClassMatched两个方法进行hook点的匹配,并在hookMethod方法中的内部类的onMethodEnte方法和onMethodExit方法进行hook点前后的逻辑插入,具体代码如下:

package com.baidu.openrasp.hook;


import com.baidu.openrasp.HookHandler;
import javassist.CannotCompileException;
import javassist.CtClass;
import javassist.NotFoundException;

import java.io.IOException;

/**
 * 自定义hook点继承自AbstractClassHook
 */
public class MyHook extends AbstractClassHook {
    /**
     * 返回自定义的hook点类型名称
     */
    @Override
    public String getType() {
        return "string_replace";
    }

    @Override
    protected void hookMethod(CtClass ctClass) throws IOException, CannotCompileException, NotFoundException {
        /*
         * 获取要插入函数开始的代码
         * 参数 "$0,$1,$2" 表示获取带插入函数的 this,第一个参数以及第二个参数
         * 然后用获取的参数调用HookHandler.checkStringReplaceEnter这个静态方法
         * 最后三个参数代表HookHandler.checkStringReplaceEnter方法的参数类型
         */
        String srcBefore = getInvokeStaticSrc(HookHandler.class, "checkStringReplaceEnter",
                "$0,$1,$2", String.class, String.class, String.class);
        // 在String.replace函数开始的地方,插入刚才获取的代码片段,第三个个参数为函数签名信息
        insertBefore(ctClass, "replace", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", srcBefore);
        /*
         * 获取要插入函数结束的代码
         * 参数 "$_" 代表获取待插入函数的返回值
         * 最后用获取的内容调用HookHandler.checkStringReplaceExit这个静态方法
         */
        String srcAfter = getInvokeStaticSrc(HookHandler.class, "checkStringReplaceExit", "$_", String.class);
        /*
         * 在String.replace函数结束的地方,插入刚才获取的代码片段,第三个个参数为函数签名信息
         * 最后一个参数为true代表在异常退出的地方异常会插入响应的代码段
         */
        insertAfter(ctClass, "replace", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", srcAfter, true);
    }

    /**
     * 匹配需要hook的类名
     */
    @Override
    public boolean isClassMatched(String className) {
        return "java.lang.String".equals(className);//该hook点hook的是java.lang.String类
    }


}

将如上实现的hook点加入com.baidu.openrasp.transformer.CustomClassTransformer的构造方法中,实现字节码的转换,代码如下:

public CustomClassTransformer() {
    hooks = new HashSet<AbstractClassHook>();

    addHook(new MyHook()); // 将hook点加入transformer
}

添加检测类型

在 com.baidu.openrasp.plugin.checker.CheckParameter 中添加相应的检测类型

public enum Type {
        // 添加相应的检测类型,checker使用JsChecker代表该hook点的参数使用js插件检测
        // 除了JsChecker之外还可以根据com.baidu.openrasp.plugin.checker包下面的其他checker进行自定义checker
        // 第一个参数是检测类型名称,第二个是检测使用的checker
        REPLACE("replace", new JsChecker()),
        
        String name;
        Checker checker;
        Type(String name, Checker checker) {
            this.name = name;
            this.checker = checker;
        }
        @Override
        public String toString() {
            return name;
        }
    }

构造参数并进入checker

编写hook点中调用的 HookHandler.checkStringReplaceEnter 和 HookHandler.checkStringReplaceExit 方法,来实现具体的检测逻辑,检测逻辑中可以调用js插件,示例如下:

public static void checkStringReplaceEnter(String str,String regex,String replacement){
     // 如下是构造参数并进入checker的操作
     // 构造参数
     HashMap<String, Object> param = new HashMap<String, Object>();
     param.put("str",str);
     param.put("regex", regex);
     param.put("replacement", replacement);

     // 进入第三步中设置的checker,第一个参数是检测类型名称,第二个参数是检测参数map
     doCheck(CheckParameter.Type.REPLACE, param);
}

参考资料

PHP 版本

新增hook点

假设我们要新增hook_class下的hook_function方法,其对应的检测类型为hook_type,则新增HOOK过程如下:

  • 在hook文件夹下新建新增hook点对应文件,建议命名方式为openrasp_hook_class.cc,同时将其添加至config.m4及config.w32

  • 引入openrasp_hook.h,根据业务需求,选择合适的HOOK方式:前置HOOK(PRE_HOOK_FUNCTION_EX),后置HOOK(POST_HOOK_FUNCTION_EX)以及前后同时HOOK(HOOK_FUNCTION_EX),根据选择的HOOK方式合理定义前置处理函数及后置处理函数,形如:

#include "openrasp_hook.h"
HOOK_FUNCTION_EX(hook_function, hook_class, hook_type);
void pre_hook_class_hook_function_hook_type(OPENRASP_INTERNAL_FUNCTION_PARAMETERS)
{
	//do something
	...
}
void post_hook_class_hook_function_hook_type(OPENRASP_INTERNAL_FUNCTION_PARAMETERS)
{
	//do something
	...
}
Previous代码调试Next添加新的插件API

Last updated 11 days ago

Javassist 框架参考文档:

javassist