赞 | 121 |
VIP | 13 |
好人卡 | 16 |
积分 | 194 |
经验 | 38692 |
最后登录 | 2024-11-7 |
在线时间 | 3087 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 19368
- 在线时间
- 3087 小时
- 注册时间
- 2013-1-11
- 帖子
- 1289
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 张咚咚 于 2024-11-6 20:52 编辑
本脚本作用是将ruby的脚本转成YARV字节码,加载字节码即可运行游戏(一定程度上防解密出原脚本)
本帖受https://rpg.blue/thread-484281-1-1.html帖子启发搞的一个VA的版本。
ruby1.9.2自带一个RubyVM::InstructionSequence将脚本编译为YARV字节码执行,
但是RM一定程度上进行了阉割,所以只有编译,没有加载,所以只要实现iseq_load就可以了,
在找方法的时候发现RGSS有的方法还不是完整体,于是将阉割的方法又再次补全...
找了几天终于完成下面是最终产物
脚本部分,放到脚本列表第一行执行。
发布时将iseq.to_a的内容序列化保存,使用ISEQ_LOAD加载执行即可。(注意备份好原脚本)
仅支持 RGSS301.dll
- LoadLibrary = Win32API.new('kernel32', 'LoadLibraryA', 'p', 'i')
- RGSSDLL = LoadLibrary.call("System/RGSS300.dll")
- DLL = 'load.dll'
- Win32API.new(DLL, "Initialize", 'l', 'v').call(RGSSDLL)
- ISEQ_LOAD = Win32API.new(DLL, "rb_iseq_load", 'iii', 'i')
- // 脚本转字节码
- code = $RGSS_SCRIPTS[1..-1].map{|v| v[3].force_encoding('UTF-8') }.join("\n")
- iseq = RubyVM::InstructionSequence.new(code)
- arr = iseq.to_a # YARV 字节码
- // 加载字节码
- ptr = ISEQ_LOAD.call(arr.object_id << 1, 0, 4)
- DL::CPtr[ptr].to_value.eval
- msgbox 11 # 此行不会被执行
复制代码
要注意的是有些语法加载字节码执行和原版执行有差异。
arr = ["1"]
for i in arr
p i # 正常输出为"1",转成字节码后加载后,此处输出则是变成了类似一个地址的整数(数字具体是什么没进行研究,可以使用 arr.each 等方法替代 for x in [...] 语法)
end
目前仅发现一处差异问题,该问题是ruby 1.9.2的问题。
YARV.7z
(1.33 MB, 下载次数: 2)
|
评分
-
查看全部评分
|