加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 SixRC 于 2021-1-9 03:53 编辑
虽然本来确实不想写了
但还是来了
简介:
ruby1.8执行代码的方式是分析代码->生成语法树->执行语法树 (1.9之后也会构建语法树 但是在执行前会生成字节码 目测这样)
这个脚本可以预先提取语法树 然后加载执行 即省去了代码处理的过程 即消去了明文代码
代码依旧可以通过语法树进行还原 只要有耐心
当然 加上混淆会更好 不过暂时不想写了 手动混淆吧
正文:
仅适用于RGSS103J
ast.zip
(254.2 KB, 下载次数: 14, 售价: 1 星屑)
解压到游戏目录
提取:
dump_filename = "scripts.ast" inf = "" c = 0 for i in $RGSS_SCRIPTS c += 1 next if c == 1 df = i[2] inf += Zlib::Inflate.inflate(df) end dll = Win32API.new("kernel32","LoadLibraryA","p","l").call("RGSS103J") dump = Win32API.new("dump","dump","lp","v") Win32API.new("dump","init","l","v").call(dll) dump.call(inf.__id__*2, dump_filename) exit
dump_filename = "scripts.ast"
inf = ""
c = 0
for i in $RGSS_SCRIPTS
c += 1
next if c == 1
df = i[2]
inf += Zlib::Inflate.inflate(df)
end
dll = Win32API.new("kernel32","LoadLibraryA","p","l").call("RGSS103J")
dump = Win32API.new("dump","dump","lp","v")
Win32API.new("dump","init","l","v").call(dll)
dump.call(inf.__id__*2, dump_filename)
exit
插到所有脚本最上面
然后运行游戏就会在目录下生成提取好的语法树
这里 init 用于初始化ruby内部函数信息
dump形式为 void dump(int str, char* fn)
str是要提取的代码 fn保存文件名 可以自己根据需要改
加载与运行:
dump_filename = "scripts.ast" dll = Win32API.new("kernel32","LoadLibraryA","p","l").call("RGSS103J") load = Win32API.new("load","eval","pl","v") Win32API.new("load","init","l","v").call(dll) raw = open(dump_filename,"rb"){|i|i.sysread(File.size(dump_filename))} load.call(raw, raw.size)
dump_filename = "scripts.ast"
dll = Win32API.new("kernel32","LoadLibraryA","p","l").call("RGSS103J")
load = Win32API.new("load","eval","pl","v")
Win32API.new("load","init","l","v").call(dll)
raw = open(dump_filename,"rb"){|i|i.sysread(File.size(dump_filename))}
load.call(raw, raw.size)
这里 eval形式为 void eval(char* raw, unsigned len) 效果是构建并运行
raw为提取的二进制流 len为其长度
可以自己根据需要改
(比方marshal dump二进制流塞到data/然后默认加密打包)
发布时可以删掉 dump.dll 和所有其余代码了 不要忘记备份代码
假如提取或构建时出现错误 请提供尽可能短的可复现代码以及出错信息 便于查错
但不保证修复
通过提取语法树 消去原代码 在一定程度上可以认为ruby代码是安全的
基于此 在代码里进行各种检测游戏/加密资源的过程也可以认为是安全的
这是写这个脚本的本意 |