Spider

Project Url: TestPlanB/Spider
Introduction: 基于 gradle 配置的动态插桩实现,只需简单配置即可完成 ASM 插桩工作,可用于隐私号整改,代码扫描等多个用途,欢迎 pr!
More: Author   ReportBugs   
Tags:

Spider 是基于 gradle 配置的动态插桩实现,只需简单配置即可完成 ASM 插桩工作,可用于隐私号整改,代码扫描等多个用途,欢迎 pr!

Spider 目标定位在通过简单的 gradle 配置,即可实现方法插桩,无需了解底层 transform 的编写以及 ASM 的语法,即可定义自己的 hook 规则

与市面上常见的 Hook 相比,如 Aspect J ,有如下特点:

  • 定位准确,简单的 gradle 配置即可 hook 任意方法
  • 可自定义 hook 规则,无论是 ASM 新手还是老手,都可以通过编写 method visitor 的行为,去执行 hook
  • 轻量级,可直接实现源码级别接入,只需自定义本地仓库即可
  • 基于 ASM,效率 Up up up
  • 流程通俗易懂,便于学习和二次开发

原理解析

(https://juejin.cn/post/7100086790639337508)

使用说明

本地使用

该项目可以用于本地配置使用,只需拷贝 lib_spider 这个 module 到自己的项目即可,请按照以下条件使用(通用的 module 使用方法)
1.拷贝 lib_spider 这个 module 到自己的项目
2.项目的 settings.gralde 添加上 include ':lib_spider',如项目工程所示
3.gradle 执行 task uploadArchives 即可,Androidstudio 可以右上角点击大象图标直接输入执行
4.根目录的 build.gralde 添加依赖 classpath 'com.spider.plugins:classvisitor-plugin:1.1.3' 如项目所示,可以自定义版本号 sync
5.app 目录的 builde.gralde 或者其他 gradle 文件依赖 apply plugin: 'com.spider.plugins' 如项目的 app 中的 build.gradle 所示 sync
6.编写自定义规则

自定义规则编写

例子如下:hook 里面可以编写规则,无特别需求可以如下所示,我们要关注 hookMethods 里面,一个 hookMethods 有多个 hookmethod 方法可以使用。

  • 第一个参数就是定义好的模式,Spider 提供了以下模式:BeforeMethod(方法前) Default(方法本身) AfterMethod(方法执行后)以下模式:BeforeMethod(方法前) Default(方法本身) AfterMethod(方法执行后)
  • 第二个参数是我们需要 hook 的类名
  • 第三个参数是需要 hook 的方法
  • 第四个是方法签名
  • 第五个是一个 groovy 写法的闭包,可以理解为函数,里面有一个 MethodVisitor 的参数,我们可以利用这个做到自定义修改规则,不熟悉 ASM 的朋友可以利用 ASM bytecode viewer 插件(可以在 AS 里面下载),生成我们想要的字节码规则。
比如我想在 MainActivity 的 onCreate 方法开始前插入一个方法,
hookMethod hookMode.BeforeMethod, "com/example/spider/MainActivity", "onCreate", "(Landroid/os/Bundle;)V", { MethodVisitor mv ->
            println("before")
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/example/spider/LogTest", "before", "()V", false)
        }
----------------------------------
又比如我想替换 LogUtils 类里面的 test 方法为 LogTest 类里面的静态方法 test
 hookMethod hookMode.Default,  "com/example/spider/LogUtils", "test", "()V", { MethodVisitor mv ->

            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/example/spider/LogTest", "test", "()V", false)

        }

-----------------------------------
项目例子:

hook {
    //表示要处理的数据类型是什么,CLASSES 表示要处理编译后的字节码(可能是 jar 包也可能是目录),RESOURCES 表示要处理的是标准的 java 资源
    inputTypes CONTENT_CLASS
    //表示 Transform 的作用域,这里设置的 SCOPE_FULL_PROJECT 代表作用域是全工程
    scopes SCOPE_FULL_PROJECT
    //表示是否支持增量编译,false 不支持
    isIncremental false
    //是否打印扫描到的方法的信息,包含类名,方法名,方法签名
    isNeedLog true
    //表示需要被 hook 的方法
    hookMethods {
        println("hookMethodList ")
        // 一下参数意思:需要 hook 的模式 / 被 hook 类 /类中的方法 / 方法签名
        hookMethod hookMode.BeforeMethod, "com/example/spider/MainActivity", "onCreate", "(Landroid/os/Bundle;)V", { MethodVisitor mv ->
            println("before")
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/example/spider/LogTest", "before", "()V", false)
        }

        hookMethod hookMode.Default,  "com/example/spider/LogUtils", "test", "()V", { MethodVisitor mv ->

            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/example/spider/LogTest", "test", "()V", false)

        }

        hookMethod hookMode.AfterMethod, "com/example/spider/MainActivity", "onCreate", "(Landroid/os/Bundle;)V", { MethodVisitor mv ->
            println("after")
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/example/spider/LogTest", "after", "()V", false)
        }
    }
}

项目层级介绍

  • app 下是使用例子
  • lib_spider 是 Spider 的封装实现

环境准备

建议直接用最新的稳定版本 Android Studio 打开工程。目前项目已适配Android Studio Arctic Fox | 2020.3.1,目前支持 gradle6 及以下版本 低版本的 Android Studio 可能因为 Gradle 版本过高而无法正常打开项目。

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools