使用Byteman对游戏进行字节码注入
本帖最后由 kingdjh 于 2018-2-3 10:24 编辑使用Byteman可以实现不对游戏本来文件做任何修改的情况下实现本来需要修改文件才能实现的功能
达到一次编写,更新后也能用
需要用到的工具:
0. jdk8
[*]jd-gui
[*]byteman
下载好jd-gui和byteman,把byteman的所在目录加到环境变量的Path中
然后用jd-gui打开游戏目录下的jar包,反编译出Java源码
接着发挥你的奇思妙想找到要注入的地方(需要一定的编程知识)
例如我想改变初始金钱,先到选择角色这里,然后看看哪里注入方便,最后决定在设置初始卡组(setDeck)的地方注入
到游戏目录下编写注入脚本
# 脚本开始,给注入规则起个名字
RULE 初始金钱
# 注入的类名
CLASS com.megacrit.cardcrawl.screens.CharSelectInfo
# 注入的方法
METHOD setDeck()
# 注入的时机
AT EXIT
# 注入的条件
IF TRUE
# 注入的内容
DO $this.gold = 200
# 脚本结束
ENDRULE保存为st.btm,再在游戏目录下,编写个st.bat文件
@echo off
rem 以下信息可以在config.json里找到
rem jar包名
set jar=desktop-1.0.jar
rem 主类名
set class=com.megacrit.cardcrawl.desktop.DesktopLauncher
rem 脚本名
set script=st.btm
echo 检查脚本
call stcheck.bat %jar% %script% | find "no errors" && goto run || goto error
:run
echo 脚本无错误
echo 正在运行游戏...
%BYTEMAN_HOME%\bin\bmjava.bat -l %script% -cp %jar% %class%
goto end
:error
cls
call stcheck.bat %jar% %script%
echo 脚本有错误
pause
:end再编写个检查脚本是否正确的stcheck.bat文件
@echo off
rem 默认jar包名
set jar=desktop-1.0.jar
rem 默认脚本名
set script=st.btm
if not "%~1" == "" set jar=%~1
if not "%~2" == "" set script=%~2
%BYTEMAN_HOME%\bin\bmcheck.bat -cp %jar% %script%都弄好后双击st.bat启动游戏,选择完角色后看看初始金钱
上述的脚本文件打包
上面是byteman在游戏启动前注入,接下来介绍byteman在游戏开始后注入
先编写好注入脚本,建议把注入脚本放到%BYTEMAN_HOME%\bin目录下,使用方便
然后打开win + R,输入cmd打开cmd
在cmd输入
cd /d "%BYTEMAN_HOME%\bin"跳到byteman目录下,再输入
"%JAVA_HOME%\bin\jps"查看游戏的pid,一般是没有名字的那个
我这里是14680,然后注入byteman,在cmd里输入
bminstall.bat 14680
14680是刚才通过jps得到的游戏pid,然后装载脚本
bmsubmit.bat -l b.btm或者卸载脚本
bmsubmit.bat -u b.btm
小提示,通过修改游戏目录下的config.json可以实现steam启动游戏的时候自动注入byteman
{
"classPath": [
"desktop-1.0.jar"
],
"mainClass": "com.megacrit.cardcrawl.desktop.DesktopLauncher",
"vmArgs": [
"-Xmx1G",
"-Dsun.java2d.dpiaware=true",
"-javaagent:D:\\Tools\\byteman\\byteman-download-4.0.0\\lib\\byteman.jar=script:st.btm"
]
}把D:\Tools\byteman\byteman-download-4.0.0替换成你们的byteman路径,记得\要换成\\
把st.btm换成你们的注入脚本名
最后希望大家把自己写的好玩的脚本发到论坛上来,分享乐趣!
比较离谱的是,btm规则里单用-是没用的,你得用+-它才识别得出来,没看文档就想到这点得亏我经验还算丰富
页:
[1]