3DMGAME 3DM首页 新闻中心 前瞻 | 评测 游戏库 热门 | 最新 攻略中心 攻略 | 秘籍 下载中心 游戏 | 汉化 购买正版 侠客前传 | 刺客信条 论坛

注册 登录

QQ登录

只需一步,快速开始

查看: 3984|回复: 16

[MOD] 使用Byteman对游戏进行字节码注入

[复制链接]

4

主题

329

帖子

959

积分

超级玩家

Rank: 5Rank: 5

贡献度
158
金元
3268
积分
959
精华
0
注册时间
2007-12-25
发表于 2018-2-2 14:21 | 显示全部楼层 |阅读模式
本帖最后由 kingdjh 于 2018-2-3 10:24 编辑

使用Byteman可以实现不对游戏本来文件做任何修改的情况下实现本来需要修改文件才能实现的功能
达到一次编写,更新后也能用

需要用到的工具:
   0. jdk8
下载好jd-gui和byteman,把byteman的所在目录加到环境变量的Path中

然后用jd-gui打开游戏目录下的jar包,反编译出Java源码

接着发挥你的奇思妙想找到要注入的地方(需要一定的编程知识)
例如我想改变初始金钱,先到选择角色这里,然后看看哪里注入方便,最后决定在设置初始卡组(setDeck)的地方注入

到游戏目录下编写注入脚本
  1. # 脚本开始,给注入规则起个名字
  2. RULE 初始金钱
  3. # 注入的类名
  4. CLASS com.megacrit.cardcrawl.screens.CharSelectInfo
  5. # 注入的方法
  6. METHOD setDeck()
  7. # 注入的时机
  8. AT EXIT
  9. # 注入的条件
  10. IF TRUE
  11. # 注入的内容
  12. DO $this.gold = 200
  13. # 脚本结束
  14. ENDRULE
复制代码
保存为st.btm,再在游戏目录下,编写个st.bat文件
  1. @echo off

  2. rem 以下信息可以在config.json里找到
  3. rem jar包名
  4. set jar=desktop-1.0.jar
  5. rem 主类名
  6. set class=com.megacrit.cardcrawl.desktop.DesktopLauncher
  7. rem 脚本名
  8. set script=st.btm

  9. echo 检查脚本
  10. call stcheck.bat %jar% %script% | find "no errors" && goto run || goto error

  11. :run
  12. echo 脚本无错误
  13. echo 正在运行游戏...
  14. %BYTEMAN_HOME%\bin\bmjava.bat -l %script% -cp %jar% %class%
  15. goto end

  16. :error
  17. cls
  18. call stcheck.bat %jar% %script%
  19. echo 脚本有错误
  20. pause

  21. :end
复制代码
再编写个检查脚本是否正确的stcheck.bat文件
  1. @echo off

  2. rem 默认jar包名
  3. set jar=desktop-1.0.jar
  4. rem 默认脚本名
  5. set script=st.btm

  6. if not "%~1" == "" set jar=%~1
  7. if not "%~2" == "" set script=%~2

  8. %BYTEMAN_HOME%\bin\bmcheck.bat -cp %jar% %script%
复制代码
都弄好后双击st.bat启动游戏,选择完角色后看看初始金钱

上述的脚本文件打包


上面是byteman在游戏启动前注入,接下来介绍byteman在游戏开始后注入
先编写好注入脚本,建议把注入脚本放到%BYTEMAN_HOME%\bin目录下,使用方便
然后打开win + R,输入cmd打开cmd
在cmd输入
  1. cd /d "%BYTEMAN_HOME%\bin"
复制代码
跳到byteman目录下,再输入
  1. "%JAVA_HOME%\bin\jps"
复制代码
查看游戏的pid,一般是没有名字的那个

我这里是14680,然后注入byteman,在cmd里输入
  1. bminstall.bat 14680
复制代码
14680是刚才通过jps得到的游戏pid,然后装载脚本
  1. bmsubmit.bat -l b.btm
复制代码
或者卸载脚本
  1. bmsubmit.bat -u b.btm
复制代码


小提示,通过修改游戏目录下的config.json可以实现steam启动游戏的时候自动注入byteman
  1. {
  2.   "classPath": [
  3.     "desktop-1.0.jar"
  4.   ],
  5.   "mainClass": "com.megacrit.cardcrawl.desktop.DesktopLauncher",
  6.   "vmArgs": [
  7.     "-Xmx1G",
  8.     "-Dsun.java2d.dpiaware=true",
  9.     "-javaagent:D:\\Tools\\byteman\\byteman-download-4.0.0\\lib\\byteman.jar=script:st.btm"
  10.   ]
  11. }
复制代码
把D:\Tools\byteman\byteman-download-4.0.0替换成你们的byteman路径,记得\要换成\\
把st.btm换成你们的注入脚本名

最后希望大家把自己写的好玩的脚本发到论坛上来,分享乐趣!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

35

主题

910

帖子

918

积分

超级玩家

Rank: 5Rank: 5

贡献度
56
金元
6940
积分
918
精华
0
注册时间
2010-7-1

妹子认证(已下架)3DMer

QQ
发表于 2018-2-2 18:04 | 显示全部楼层
本帖最后由 ld007137377 于 2018-2-2 18:20 编辑

环境配置正确无误但是脚本运行错误!
已解决 解决方法
http://blog.csdn.net/manerfan/article/details/48492809
回复 支持 反对

使用道具 举报

35

主题

910

帖子

918

积分

超级玩家

Rank: 5Rank: 5

贡献度
56
金元
6940
积分
918
精华
0
注册时间
2010-7-1

妹子认证(已下架)3DMer

QQ
发表于 2018-2-2 18:11 | 显示全部楼层
本帖最后由 ld007137377 于 2018-2-2 18:19 编辑

感谢分享!!
回复 支持 反对

使用道具 举报

35

主题

910

帖子

918

积分

超级玩家

Rank: 5Rank: 5

贡献度
56
金元
6940
积分
918
精华
0
注册时间
2010-7-1

妹子认证(已下架)3DMer

QQ
发表于 2018-2-2 18:58 | 显示全部楼层
      this.gold -= goldAmount;
      if (this.gold < 0) {
        this.gold = 0;
      }
      for (AbstractRelic r : this.relics) {
        r.onLoseGold();
      }
    }
    else
    {
      logger.info("NEGATIVE MONEY???");
    }
  }
  
  public void gainGold(int amount)
  {
    amount *= 5;
杀怪给予5倍金币代码,怎么弄成脚本a啊

回复 支持 反对

使用道具 举报

4

主题

329

帖子

959

积分

超级玩家

Rank: 5Rank: 5

贡献度
158
金元
3268
积分
959
精华
0
注册时间
2007-12-25
 楼主| 发表于 2018-2-2 19:43 | 显示全部楼层
ld007137377 发表于 2018-2-2 18:58
this.gold -= goldAmount;
      if (this.gold < 0) {
        this.gold = 0;
  1. CLASS com.megacrit.cardcrawl.characters.AbstractPlayer
  2. METHOD gainGold(int)
  3. AT ENTRY
  4. IF TRUE
  5. DO $1 = $1 * 5
  6. ENDRULE
复制代码


回复 支持 反对

使用道具 举报

35

主题

910

帖子

918

积分

超级玩家

Rank: 5Rank: 5

贡献度
56
金元
6940
积分
918
精华
0
注册时间
2010-7-1

妹子认证(已下架)3DMer

QQ
发表于 2018-2-2 20:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

35

主题

910

帖子

918

积分

超级玩家

Rank: 5Rank: 5

贡献度
56
金元
6940
积分
918
精华
0
注册时间
2010-7-1

妹子认证(已下架)3DMer

QQ
发表于 2018-2-4 17:17 | 显示全部楼层

初始卡牌全升级代码有没有啊。
回复 支持 反对

使用道具 举报

35

主题

910

帖子

918

积分

超级玩家

Rank: 5Rank: 5

贡献度
56
金元
6940
积分
918
精华
0
注册时间
2010-7-1

妹子认证(已下架)3DMer

QQ
发表于 2018-2-5 23:05 | 显示全部楼层
RULE 首件1Boss物品
CLASS com.megacrit.cardcrawl.dungeons.AbstractDungeon
METHOD initializeRelicList()
AT EXIT
BIND relic:String = "Calling Bell";
     bossRelics:ArrayList = com.megacrit.cardcrawl.dungeons.AbstractDungeon.bossRelicPool;
     isHas:Boolean = bossRelics.indexOf(relic) != -1
IF isHas
DO bossRelics.remove(relic);
   bossRelics.add(0, relic)
ENDRULE


大大这个是初始遗物必给铃铛的脚本
怎么改铃铛给的三个遗物为

Molten Egg(熔岩蛋)
Toxic Egg(毒蛋)
Frozen Egg(冰冻蛋)



回复 支持 反对

使用道具 举报

0

主题

7

帖子

7

积分

新手玩家

Rank: 1

贡献度
0
金元
70
积分
7
精华
0
注册时间
2017-12-19
发表于 2018-2-6 09:42 | 显示全部楼层
你得改铃铛的代码   这个代码应该在遗物那边  不在初始这边吧
回复 支持 反对

使用道具 举报

0

主题

602

帖子

698

积分

超级玩家

Rank: 5Rank: 5

贡献度
6
金元
6738
积分
698
精华
0
注册时间
2014-6-1
发表于 2018-2-6 13:37 | 显示全部楼层
技术贴支持下
回复 支持 反对

使用道具 举报

4

主题

329

帖子

959

积分

超级玩家

Rank: 5Rank: 5

贡献度
158
金元
3268
积分
959
精华
0
注册时间
2007-12-25
 楼主| 发表于 2018-2-7 20:02 | 显示全部楼层
ld007137377 发表于 2018-2-5 23:05
RULE 首件1Boss物品
CLASS com.megacrit.cardcrawl.dungeons.AbstractDungeon
METHOD initializeRelicList( ...

我大概看了下,需要改CallingBell里的update()
不过作者不允许设置随机事件里出现你那三件遗物,所以你硬是要加的话只能直接调用instantObtain,然后记得把相应的ArrayList里的项remove掉

回复 支持 反对

使用道具 举报

35

主题

910

帖子

918

积分

超级玩家

Rank: 5Rank: 5

贡献度
56
金元
6940
积分
918
精华
0
注册时间
2010-7-1

妹子认证(已下架)3DMer

QQ
发表于 2018-2-7 20:36 | 显示全部楼层
kingdjh 发表于 2018-2-7 20:02
我大概看了下,需要改CallingBell里的update()
不过作者不允许设置随机事件里出现你那三件遗物,所以你硬 ...

感谢~~哈!
回复 支持 反对

使用道具 举报

2

主题

62

帖子

122

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1215
积分
122
精华
0
注册时间
2016-5-31
发表于 2018-2-16 12:25 | 显示全部楼层
大佬新年好,我想问一下,这样改是不对吗,要怎么修改
RULE tianjia
CLASS com.megacrit.cardcrawl.core.EnergyManager
METHOD EnergyManager(int)
AT EXIT
IF TRUE
DO $this.energyMaster = 4
ENDRULE
想把初始费用改为4,并且不影响后面遗物的增加,如果我改为注入同class下的prep(),AT ENTRY的话可以做到,但之后加费用的遗物就没用了
还有如果我想注入语句到某个函数的while或for循环里应该怎么写
望大佬解答,十分感谢!
回复 支持 反对

使用道具 举报

4

主题

329

帖子

959

积分

超级玩家

Rank: 5Rank: 5

贡献度
158
金元
3268
积分
959
精华
0
注册时间
2007-12-25
 楼主| 发表于 2018-2-16 20:28 | 显示全部楼层
ac3345678 发表于 2018-2-16 12:25
大佬新年好,我想问一下,这样改是不对吗,要怎么修改
RULE tianjia
CLASS com.megacrit.cardcrawl.core.En ...

你的改法是对的,不过byteman里构造函数是<init>(参数)而不是类名了,而且DO里可以直接写成$1 = 4就好了
至于你说的注入具体位置,byteman提供注入到某一行的功能(AT LINE number),不过这个功能我也没用过,需要循环我都是直接注入自己写的jar的

回复 支持 反对

使用道具 举报

2

主题

62

帖子

122

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1215
积分
122
精华
0
注册时间
2016-5-31
发表于 2018-2-16 22:12 | 显示全部楼层
kingdjh 发表于 2018-2-16 20:28
你的改法是对的,不过byteman里构造函数是(参数)而不是类名了,而且DO里可以直接写成$1 = 4就好了
至于你 ...

哦哦哦,原来是这样,谢谢大佬
回复 支持 反对

使用道具 举报

1

主题

356

帖子

408

积分

高级玩家

Rank: 4

贡献度
0
金元
4080
积分
408
精华
0
注册时间
2016-11-19
发表于 2018-2-16 23:12 | 显示全部楼层
支持!!!!
回复 支持 反对

使用道具 举报

17

主题

754

帖子

646

积分

超级玩家

Rank: 5Rank: 5

贡献度
17
金元
5780
积分
646
精华
0
注册时间
2010-9-12
发表于 2018-12-2 13:05 | 显示全部楼层
想问下楼主怎么加环境变量,第一步就看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|咖绿茵|求知网|3DMGAME ( 京ICP备14006952号 沪公网安备31011202006753号

GMT+8, 2019-9-23 06:30 , Processed in 0.122298 second(s), 15 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表