设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4468|回复: 33
打印 上一主题 下一主题

[随意闲聊] 【宝可梦语奏】关于成功制作外挂而被踢

[复制链接]

Lv4.逐梦者

梦石
2
星屑
6687
在线时间
501 小时
注册时间
2018-3-23
帖子
533

R考场第七期银奖

跳转到指定楼层
1
发表于 2020-1-16 12:18:07 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

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

x
本帖最后由 MCCF 于 2020-1-16 12:28 编辑

众所周知,宝可梦语奏是用RMXP制作的一代神奇作品。

然而我貌似在通普市时金币不足,以至于无法购买足够的超级球以供收服。

于是就有了此神奇的东西:

RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # 金币修改器 - Pokemon Universe
  4. #    by MCCF
  5. #------------------------------------------------------------------------------
  6. # [说明]
  7. #    - Pokemon Universe(精灵宝可梦:宇宙)的金币修改器
  8. #------------------------------------------------------------------------------
  9. # [使用方法]
  10. #    - 复制到Main之前
  11. #    - 将存档(Game.rxdata)移动到游戏根目录,运行游戏,修改完成后自动关闭。
  12. #------------------------------------------------------------------------------
  13. # [注意]
  14. #    - 一般适用于懂得脚本的人。
  15. #    - 有可能有BUG,欢迎反馈。
  16. #------------------------------------------------------------------------------
  17. #  通用配置模块  
  18. #==============================================================================
  19. module Pokemon_Universe_Money
  20.  
  21.   #要修改的金币值
  22.   MONEY_VALUE = 20000000
  23.  
  24.   # 是否启用修改器
  25.   CHANGE_MONEY = true
  26.  
  27.   #存档文件名
  28.   FILENAME = "Game.rxdata"
  29.  
  30. end
  31. #------------------------------------------------------------------------------
  32. #  配置模块结束  
  33. #==============================================================================
  34. class PokeBattle_Trainer
  35.   attr_accessor :money
  36. end
  37.  
  38. class PokeBattle_Pokemon
  39.  
  40. end
  41.  
  42. class PBMove
  43.  
  44. end
  45.  
  46. class PokemonSystem
  47.  
  48. end
  49.  
  50. class PokemonMapFactory
  51.  
  52. end
  53.  
  54. class PokemonGlobalMetadata
  55.  
  56. end
  57.  
  58. class BugContestState
  59.  
  60. end
  61.  
  62. class PurifyChamber
  63.  
  64. end
  65.  
  66. class PurifyChamberSet
  67.  
  68. end
  69.  
  70. class SafariState
  71.  
  72. end
  73.  
  74. class PCItemStorage
  75.  
  76. end
  77.  
  78. class PokemonMapMetadata
  79.  
  80. end
  81.  
  82. class PokemonBag
  83.  
  84. end
  85.  
  86. class PokemonStorage
  87.  
  88. end
  89.  
  90. class PokemonBox
  91.  
  92. end
  93.  
  94. #==============================================================================
  95. # ■ Scene_Load
  96. #------------------------------------------------------------------------------
  97. #  处理读档画面的类。
  98. #==============================================================================
  99.  
  100. class Scene_Load < Scene_File
  101.   #--------------------------------------------------------------------------
  102.   # ● 读取存档数据
  103.   #     file : 读取用文件对像 (已经打开)
  104.   #--------------------------------------------------------------------------
  105.   def read_save_data(file)
  106.  
  107. end
  108. end
  109.  
  110. #==============================================================================
  111. # ■ Scene_Title
  112. #------------------------------------------------------------------------------
  113. #  处理标题画面的类。
  114. #==============================================================================
  115.  
  116. class Scene_Title
  117.   #--------------------------------------------------------------------------
  118.   # ● 主处理
  119.   #--------------------------------------------------------------------------
  120.   alias money_main main
  121.   def main
  122.     change_money if Pokemon_Universe_Money::CHANGE_MONEY
  123.     money_main
  124.   end
  125.   #--------------------------------------------------------------------------
  126.   # ● 处理金币修改
  127.   #--------------------------------------------------------------------------
  128.   def change_money
  129.     i = 0
  130.     n = 0
  131.     s = []
  132.     fr=File.open(Pokemon_Universe_Money::FILENAME, "rb")
  133.  
  134.     s[0]=Marshal.load(fr)
  135.     s[0].money = Pokemon_Universe_Money::MONEY_VALUE
  136.     begin
  137.       while n+=1
  138.         s[n]=Marshal.load(fr)
  139.       end
  140.     rescue
  141.  
  142.     end
  143.  
  144.     fw=File.open(Pokemon_Universe_Money::FILENAME, "wb")
  145.     while i<n
  146.       Marshal.dump(s[i],fw)
  147.       i+=1
  148.     end
  149.  
  150.     exit
  151.   end
  152. end
  153.  
  154.  
  155. #==============================================================================
  156. # ■ Scene_File
  157. #------------------------------------------------------------------------------
  158. #  存档画面及读档画面的超级类。
  159. #==============================================================================
  160.  
  161. class Scene_File
  162.   #--------------------------------------------------------------------------
  163.   # ● 生成文件名
  164.   #     file_index : 文件名的索引 (0~3)
  165.   #--------------------------------------------------------------------------
  166.   def make_filename(file_index)
  167.     return "Game.rxdata"
  168.   end
  169. end


把存档文档放在该工程目录下,运行工程自动退出。

然后我把一张2000万金币的图片放到粉丝群上,于是被群主(此游戏作者)踢了,终身不得加入。

此程序甚至还可以输出存档的全部内容

但是我并没有将代码放上去……嗯(仅仅是想提醒群主注意这个漏洞)




半年之后无意间发现了这个工程,于是将其发布到此,后来根据朋友的说法,那位群主大概是由于自尊的问题将自己的账号而采取如此措施。现在不清楚后来发生的情况,但是在想这种心理是否是每个游戏制作者,必然的或者说至少是普遍的一种情况。

(顺便也想探讨一下,Ruby这种过于开放的语言(类中定义的方法及变量与对象中的实际数据完全不必要一致)是否会引发一些游戏数据安全上的问题?)
祝好。

Lv3.寻梦者

梦石
0
星屑
4481
在线时间
1053 小时
注册时间
2013-3-28
帖子
390

开拓者

15
发表于 2020-2-1 16:24:27 | 只看该作者
小鬼毕竟是口袋改版圈的,不是RM圈,自然是不太希望有人在群里讨论太深入的问题,这可以理解。而且国外的RM口袋圈子面向的主要用户并非RMer而是正儿八经的宝可梦玩家,因此有不加密的习惯,作为一个RMer知道这个福利闷声发大财就好了,对于一般的宝可梦玩家来说这并不是什么漏洞(这应该是楼主和小鬼的主要矛盾点)。这就好比在元气骑士官方群里面分享破解版,作者不高兴是很自然的是,不必扯到什么尊严问题。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39049
在线时间
5727 小时
注册时间
2006-11-10
帖子
6626
14
发表于 2020-1-17 11:43:39 | 只看该作者
本帖最后由 灯笼菜刀王 于 2020-1-17 12:13 编辑

我觉得, 一个贼在光天化日之下公开某个保险柜的撬法, 尤其是在主人面前, 被打屎都算轻的吧?

既然人家加密了就表示不希望被破解, 那公开发布破解方法自然就被视为挑衅了

嘛,破解我也做过, 这种行为和贼一样, 哪怕你有正当的理由(劫富济贫 =.=?)也不能公开, 偷偷摸摸才是道
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

13
发表于 2020-1-17 11:38:36 | 只看该作者
一般来说,作者都是讨厌别人修改他的东西的。
这个作者呢,一看你发图,就把你踢了呢,是比较急。
但是呢。群啊,贴吧啊,就是这样的地方吧,管理不开心了,就发动权限。
你要是提供技术支持,我相信他会喜欢你的。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4881
在线时间
425 小时
注册时间
2019-10-22
帖子
666
12
发表于 2020-1-17 01:25:24 | 只看该作者
配图与楼主和楼主提及作者无关
只是一位好友的默认加密游戏被人修改后玩  来找我改进加密的方式





作者的内心是怎样的我想不需要解释了
反倒是很好奇楼主到底是出于一种怎样的心态?
文字中多次使用成功 神奇等字眼去描述自己写的脚本
又牵扯到自尊等 用阴阳怪气的语气去描述作者?
再在文末加上探讨漏洞一系列去转换话题 或许就觉得可以给自己justify?


如果你觉得我这篇回帖没有尊重你或者喷了你
做人吧 让别人尊重自己应该要学先会尊重别人

至于你所说的"漏洞" 难道不是RM本身的缺陷?
guoxiaomi 版主的回复也对此问题说明得够明白了
如果你真认为自己技术那么牛 这么一点逻辑简单的意识都没有吗?
















回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12649
在线时间
910 小时
注册时间
2014-10-24
帖子
322
11
发表于 2020-1-16 19:35:18 | 只看该作者
按我最近看到的例子就是,你帮他挖鼻孔,就算最后鼻子通了,被挖的时候也很难受,这样的感觉。

点评

这个比喻不恰当 我觉得楼主的行为更像是 告诉别人脸上有鼻屎 但是说话语气方式完全不得体 最终还狡辩自己只是好心提醒  发表于 2020-1-17 01:33
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
6687
在线时间
501 小时
注册时间
2018-3-23
帖子
533

R考场第七期银奖

10
 楼主| 发表于 2020-1-16 19:06:21 | 只看该作者
本帖最后由 MCCF 于 2020-1-16 19:49 编辑

再就第二个问题谈一谈。
看样子大部分意见是“修改必须知道改的东西叫什么”

然而RM足够开放:

RUBY 代码复制
  1. class PokeBattle_Trainer
  2.   attr_accessor :money
  3. end
  4.  
  5. class PokeBattle_Pokemon
  6.  
  7. end
  8.  
  9. class PBMove
  10.  
  11. end
  12.  
  13. class PokemonSystem
  14.  
  15. end
  16.  
  17. class PokemonMapFactory
  18.  
  19. end
  20.  
  21. class PokemonGlobalMetadata
  22.  
  23. end
  24.  
  25. class BugContestState
  26.  
  27. end
  28.  
  29. class PurifyChamber
  30.  
  31. end
  32.  
  33. class PurifyChamberSet
  34.  
  35. end
  36.  
  37. class SafariState
  38.  
  39. end
  40.  
  41. class PCItemStorage
  42.  
  43. end
  44.  
  45. class PokemonMapMetadata
  46.  
  47. end
  48.  
  49. class PokemonBag
  50.  
  51. end
  52.  
  53. class PokemonStorage
  54.  
  55. end
  56.  
  57. class PokemonBox
  58.  
  59. end


即使类都定义成这样,内部的所有数据还是可以输出:



这是使用代码:
RUBY 代码复制
  1. fr=File.open(Pokemon_Universe_Money::FILENAME, "rb")
  2. s=Marshal.load(fr)
  3. p s
实现的。

发现其中有个变量叫@money,正好和游戏中看到的钱数一样(此处是已经修改的,具体实现时可用诸如正则的方式取得),岂不是就可以进行修改了?所以这里是比较缺乏安全性的。




尤其是,即使完全不知道存档的内部结构,完全不知道上面所列出的五花八门的类名,也可以通过报错得到:

RUBY 代码复制
  1. def change_money
  2.   n = 0
  3.   fr=File.open(Pokemon_Universe_Money::FILENAME, "rb")
  4.   while n+=1
  5.     p Marshal.load(fr)
  6.   end
  7.   exit
  8. end


注意,这段代码没有使用异常处理,因此可以预料,在完全未定义任何类的情况下会报错:



是否注意到,此处已经提示出应有的类名,于是直接在前面打上:

RUBY 代码复制
  1. class PokeBattle_Trainer
  2.  
  3. end


然后又会提示出下一个,这样逐步类推,直到最后正常结束,也就取得了存档的所有信息。那么就是彻底的用RGSS自己破解RGSS。
祝好。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
6687
在线时间
501 小时
注册时间
2018-3-23
帖子
533

R考场第七期银奖

9
 楼主| 发表于 2020-1-16 18:53:10 | 只看该作者
瑟瑟发抖……

声明一下,本人并没有公开脚本内容。仅是放了图片。
后来考虑了一下,当时这种行为确实欠考虑,但并不是故意贬低

大致上的过程是(已被踢无法截图):

1. 在做的时候在群中发布一张内部对象数据的图片(XP的p指令输出的键值对,很长一条),并且提出”此处可能存在漏洞“。
2. 完成后发出成果(上面所述),清楚的记得一位管理员说”小鬼看见会不开心的“,于是明确表明”希望修复这一问题“。
3. 过了一会儿去看,果然被群主踢出。

祝好。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
24004
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

8
发表于 2020-1-16 17:18:17 | 只看该作者
修改游戏并且公开发布方法我觉得永封不过分,毕竟作弊就是原罪。

自己定义一个存档格式并不难,但是因为RM的脚本很难加密,碰到想破解的人无论怎么做都是没用的。

RM这一天生的缺陷使得这游戏的加密变成了“防君子不防小人”。

本身做个游戏就已经很累了,要求作者放弃默认系统,花费更多的精力采用复杂的加密方案并不合适。

评分

参与人数 2+2 收起 理由
坏数据 + 1 我很赞同 精品文章 认可答案
SixRC + 1

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 1 反对 0

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
10151
在线时间
4436 小时
注册时间
2005-10-22
帖子
6970

开拓者贵宾

7
发表于 2020-1-16 17:00:33 | 只看该作者
少年们,你们应当直面现实,RM的加密是幻觉。石器的一段代码可以瞬间将大部分的RM游戏变成石器的一个DLC
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-5 03:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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