马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 天使的遗族 于 2025-2-21 20:07 编辑
在一次解包委托中,全局搜索发现怎么都找不到一个函数,但是在游戏目录下面找到两个形迹可疑的文件
http://renpy.org和ren.ver.txt,经过验证,前者是翻译文本文件,后一个就不清楚是什么类型的文件,但是查到跟ren.ver.txt有关的操作是
[RenPy] 纯文本查看 复制代码 init -999 python:
import zlib
try:
#读取renpy版本
with renpy.open_file("ren.ver.txt") as f:
a = f.read()
#获取更新日志
exec(zlib.decompress(zlib.decompress(a)))
except Exception as e:
print(" ")
甚至注释写成读取renpy版本蒙混过关(憋笑) 但是从下面操作可知这是用zlib压缩了两次的文件,exec(zlib.decompress(zlib.decompress(a)))是执行zlib解压两次的内容,由此推断解压后的内容极大可能是utf-8编码的文本,可以作为renpy代码执行 。 于是修改代码,看zlib到底解压了什么
[RenPy] 纯文本查看 复制代码 try:
# 读取 renpy 版本文件
with renpy.open_file("ren.ver.txt") as f:
a = f.read()
# 双重解压
decompressed_data = zlib.decompress(zlib.decompress(a))
print("解压后的数据长度:", len(decompressed_data))
print("解压后的数据内容:", decompressed_data)
# 保存解压后的数据
with open('output_file.txt','wb') as f: # 使用 'wb' 以二进制方式写入
f.write(decompressed_data)
f.flush() # 确保数据写入磁盘
except Exception as e:
print("发生错误:", e)
于是在控制台中得到这些内容
以为这样还能蒙混过关,翻了半天终于找到这句
exec(__import__('base64').b64decode("BASE64CODE").decode("utf8"))这个执行的是base64解码
原来是base64编码的字符串,解码可得renpy代码
renpy传统“加密”,通常是修改rpa包的后缀,再用十六进制编辑器修改文件头,之后在loader.py代码中修改要读取的包后缀和文件头,但是unren.bat这种解包工具是放在游戏根目录,执行renpy文件夹里的loader.py来解包和反编译的,所以这种rpa“包”加密,已经过时。 如果要制作游戏加密,比如输入注册码激活,可以把相关的激活操作的rpy文件写成上述执行代码的操作,再用zlib压缩几次再用base64编码,就不易被解包后注释代码跳过激活。执行解压激活操作代码文件的代码,也这样压缩几次,这样极大提升解包和分析的难度。 虽然base64不是加密只是编码,但是如果我所有rpy里都是这样操作,还压缩了,阁下在全局搜索函数和变量时什么都找不到会怎么办? 也可以写个新操作,禁止读取不在列表内的rpa包和rpyc文件,这样别人想“注入”分析就难了。记得把这个操作的代码也用zlib压缩处理,这样别人就不知道怎么解压这个代码注释掉包和文件校验。 开始解压缩文件执行代码的rpyc文件,用传统“加密”封入很大的一个包,跟其他文件比如image混淆一起,极大提高找到zlib解压缩操作入口的难度!甚至直接可以把这个文件命名为背景图片,然后后缀是png,藏木于林!
|