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

注册 登录

QQ登录

只需一步,快速开始

查看: 9179|回复: 17
打印 上一主题 下一主题

[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)的地方注入

到游戏目录下编写注入脚本
<保存为st.btm,再在游戏目录下,编写个st.bat文件
<再编写个检查脚本是否正确的stcheck.bat文件
<都弄好后双击st.bat启动游戏,选择完角色后看看初始金钱

上述的脚本文件打包


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

我这里是14680,然后注入byteman,在cmd里输入
<14680是刚才通过jps得到的游戏pid,然后装载脚本
<或者卸载脚本
<

小提示,通过修改游戏目录下的config.json可以实现steam启动游戏的时候自动注入byteman
<把D:\Tools\byteman\byteman-download-4.0.0替换成你们的byteman路径,记得\要换成\\
把st.btm换成你们的注入脚本名

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

本帖子中包含更多资源

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

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

35

主题

1113

帖子

1125

积分

游戏狂人

Rank: 6Rank: 6

贡献度
56
金元
9010
积分
1125
精华
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

主题

1113

帖子

1125

积分

游戏狂人

Rank: 6Rank: 6

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

3DMer

QQ
硬硬的板凳
发表于 2018-2-2 18:11 | 只看该作者
本帖最后由 ld007137377 于 2018-2-2 18:19 编辑

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

使用道具 举报

35

主题

1113

帖子

1125

积分

游戏狂人

Rank: 6Rank: 6

贡献度
56
金元
9010
积分
1125
精华
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
5#
 楼主| 发表于 2018-2-2 19:43 | 只看该作者
ld007137377 发表于 2018-2-2 18:58
this.gold -= goldAmount;
      if (this.gold < 0) {
        this.gold = 0;
<

回复 支持 反对

使用道具 举报

35

主题

1113

帖子

1125

积分

游戏狂人

Rank: 6Rank: 6

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

3DMer

QQ
6#
发表于 2018-2-2 20:26 | 只看该作者
回复 支持 反对

使用道具 举报

35

主题

1113

帖子

1125

积分

游戏狂人

Rank: 6Rank: 6

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

3DMer

QQ
7#
发表于 2018-2-4 17:17 | 只看该作者

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

使用道具 举报

35

主题

1113

帖子

1125

积分

游戏狂人

Rank: 6Rank: 6

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

3DMer

QQ
8#
发表于 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

主题

8

帖子

8

积分

新手玩家

Rank: 1

贡献度
0
金元
80
积分
8
精华
0
注册时间
2017-12-19
9#
发表于 2018-2-6 09:42 | 只看该作者
你得改铃铛的代码   这个代码应该在遗物那边  不在初始这边吧
回复 支持 反对

使用道具 举报

0

主题

1352

帖子

1673

积分

游戏狂人

Rank: 6Rank: 6

贡献度
7
金元
16452
积分
1673
精华
0
注册时间
2014-6-1
10#
发表于 2018-2-6 13:37 | 只看该作者
技术贴支持下
回复 支持 反对

使用道具 举报

4

主题

329

帖子

959

积分

超级玩家

Rank: 5Rank: 5

贡献度
158
金元
3268
积分
959
精华
0
注册时间
2007-12-25
11#
 楼主| 发表于 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

主题

1113

帖子

1125

积分

游戏狂人

Rank: 6Rank: 6

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

3DMer

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

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

使用道具 举报

5

主题

186

帖子

767

积分

超级玩家

Rank: 5Rank: 5

贡献度
116
金元
3033
积分
767
精华
0
注册时间
2016-5-31
13#
发表于 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
14#
 楼主| 发表于 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的

回复 支持 反对

使用道具 举报

5

主题

186

帖子

767

积分

超级玩家

Rank: 5Rank: 5

贡献度
116
金元
3033
积分
767
精华
0
注册时间
2016-5-31
15#
发表于 2018-2-16 22:12 | 只看该作者
kingdjh 发表于 2018-2-16 20:28
你的改法是对的,不过byteman里构造函数是(参数)而不是类名了,而且DO里可以直接写成$1 = 4就好了
至于你 ...

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

使用道具 举报

1

主题

475

帖子

563

积分

高级玩家

Rank: 4

贡献度
0
金元
5626
积分
563
精华
0
注册时间
2016-11-19
16#
发表于 2018-2-16 23:12 | 只看该作者
支持!!!!
回复 支持 反对

使用道具 举报

17

主题

763

帖子

659

积分

超级玩家

Rank: 5Rank: 5

贡献度
17
金元
5905
积分
659
精华
0
注册时间
2010-9-12
17#
发表于 2018-12-2 13:05 | 只看该作者
想问下楼主怎么加环境变量,第一步就看不懂
回复 支持 反对

使用道具 举报

0

主题

107

帖子

160

积分

中级玩家

Rank: 3Rank: 3

贡献度
0
金元
1603
积分
160
精华
0
注册时间
2010-12-18
18#
发表于 2021-11-3 04:07 | 只看该作者
比较离谱的是,btm规则里单用-是没用的,你得用+-它才识别得出来,没看文档就想到这点得亏我经验还算丰富
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 15:07 , Processed in 0.145076 second(s), 33 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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