Skip to content

EarzuChan/Sakiko

 
 

Repository files navigation

祥子 Sakiko - 次世代的Java Hook解决方案

注意

本项目ForkKarlatempJvmHookFramework

原开发者表示不适合正式环境使用,速度较慢

由于开发不便,暂不提供macOS平台本机库CI构建

项目名称源自于 BanG Dream! It's MyGO!!!!! 中的角色丰川祥子

还在钩,还在钩(指Hooking

概述

Sakiko是一款跨平台的JavaHook方案,旨在提供更灵活的JVM内部Hook机制。目前已支持在桌面端JVM中通过JvmTI进行Hook。

特性

  • 跨平台支持:适用于多种操作系统,方便不同平台的开发者使用。
  • 提供API与本机库:开发者可以通过提供的API和本机库进行Hook操作。

下载

  1. 前往 Actions
  2. 找到最后一个成功运行的Action
  3. 向下滚动,在Artifacts部分下载Jars和相应平台的本机库(例如windows-shared-x64)。

运行

下载后,您应该看到以下文件:

  • Jars.zip
    • api-old-0.11.4.514.jar - 旧版开发者API包
    • sakiko-old-0.11.4.514-core.jar - 旧版运行时Java库
      • sakiko-old-0.11.4.514-launcher.jar - 旧版启动器包(Java Agent)
  • 平台-架构.zip
    • libsakiko.dll / libsakiko.so - 本机库

使用Sakiko,您需要修改Java命令行,格式如下:

java -agentpath:/path/to/libsakiko.so -javaagent:/path/to/sakiko-old-0.11.4.514-launcher.jar ...

克隆与构建

请注意,在克隆并推送到您自己的远程仓库时,务必确保提交中包含CMakeLists.txt,否则CI构建将失败。

旧模块范式【已过时】

开发模块

新建一个生成JarJava Library项目,并将api-old包添加为项目依赖

将一个名为module_entries的文件放在Jar的根目录下,文件的每一行代表一个入口点类名

在您的入口类中创建一个静态方法load,通过io.github.karlatemp.jvmhook.JvmHookFramework类的静态字段INSTANCE获取预先提供的JvmHookFramework实例,进行Hook操作

示例:

public class MyModule
{
    public static void load()
    {
        // 度尽劫波兄弟在,相逢一笑泯恩仇
    }
}

安装模块

首次正确运行Java命令后,将在运行目录创建一个名为sakiko-modules的文件夹。将模块放入该文件夹。

如果希望将模块放在其他目录下,只需设置环境变量SAKIKO_MODULES为您放置模块的目录即可。

Shell脚本示例:

#!/usr/bin/env bash

SAKIKO_MODULES=/path/to/other/dir
java ...

新模块范式【待开发】

开发模块

您需要新建一个打包成JarJavaLibrary项目。

开发新版本模块需要使用Kotlin语言,以下是一个示例代码片段:

@ExposedSakikoModule
class MambaModule(hookContext: HookContext) : SakikoBaseModule(hookContext) {
    init { // 初始化
        SakikoHookAPI.configs { // 配置
            isDebug = false // 是否开启调试
        }
    }

    override fun onHook() {
        // Hook指定的单个方法
        "com.demo.Test".toClass().method {
            name = "test"
            param(StringClass)
        }.hook {
            before {
                // Do something...
            }
            after {
                // Do something...
            }
        }

        // Hook匹配的所有方法
        "com.demo.Test".toClass().method {
            name = "test"
        }.all().hook {
            before {
                // Do something...
            }
            after {
                // Do something...
            }
        }

        // Hook多个目标
        "com.demo.Test".toClass().apply {
            method {
                name = "test"
                param(StringClass)
            }.hook {
                before {
                    // Do something...
                }
                after {
                    // Do something...
                }
            }
            method {
                name = "another"
                param(IntType)
            }.hook {
                before {
                    // Do something...
                }
                after {
                    // Do something...
                }
            }
        }
    }
}

安装模块

【待计划】

如果您有关于模块安装的建议或者想法,欢迎在Issue中提出。

说明

这种范式受到未发布的新版YukiHookAPI的启发,但具体实现方式有所不同。

该新Hook模块范式旨在提供一个灵活且易于配置的方式来创建和使用Hook模块。通过设置jar元数据和实现主类中的Hook逻辑,用户可以轻松地对指定的类和方法进行Hook。

展望

  • 新的HookAPI:正在开发一套新的KotlinHookAPI以及相关配套组件,以为您提供开箱即用、灵活简易的Hook方案。
  • 废除旧范式:正在渐进式地废除旧的模块范式,以新的模块范式为主。
  • 安卓端Hook支持:未来计划引入LSPlant,以实现对安卓平台的Hook。
  • 新的Hook框架:计划为常规JVM平台开发类似LSPlant的内存修改Hook方案,尽管可能对特定的JVM版本和型号有要求,但可以打造更快更稳定更搞笑的Hook方案。

社区支持

我们希望各位大手子能够为我们提供一些支持,这真的对我们很重要:

  1. Star:给我们一个Star,让我们知道您热爱我们的项目。
  2. Issue与讨论:如果您有任何问题或者建议,请在Issue和Discussion处留言。
  3. 参与开发:我们真的很缺有能人士,目前您若想参与开发,请在Issue处留言
  4. Pull Request:如果您有更好的想法或者代码,也可以选择提交PR。当然最好您能够直接参与开发。
  5. 赞助:如果您愿意,您可以通过给我们打钱赞助我们来支持我们的开发。

About

A Hook Framework for JVM

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 62.4%
  • C++ 29.0%
  • Java 5.7%
  • Kotlin 2.6%
  • Other 0.3%