Project1

标题: 如何反解析rvdata文件 [打印本页]

作者: jgl2000    时间: 2012-11-10 18:49
标题: 如何反解析rvdata文件
用普通的文本编辑器打开MapInfos.rvdata是乱码,发现网友们用load_data("Data/MapInfos.rvdata"),能解析出来数据,我想自己去实现这个load_data的过程,不知这load_data源码那里有?
请高手指点!!感谢!
作者: 沙漠点灰    时间: 2012-11-10 18:54
load_data(filename)
读取 filename 指定的数据文件,重建对象。

$data_actors = load_data("Data/Actors.rxdata")

这个函数基本上和 File.open(filename, "rb") { |f|
  obj = Marshal.load(f)
}

相同,但读取加密档案文件内部的文件时会有所不同。

翻翻Marshal吧
作者: jgl2000    时间: 2012-11-10 21:07
沙漠点灰 发表于 2012-11-10 18:54
翻翻Marshal吧

了解了一下load_data是RGSS的内部函数,RGSS是基于RUBY 的游戏脚本语言,很想知道load_data的函数内部实现
作者: 沙漠点灰    时间: 2012-11-10 21:21
jgl2000 发表于 2012-11-10 21:07
了解了一下load_data是RGSS的内部函数,RGSS是基于RUBY 的游戏脚本语言,很想知道load_data的函数内部实 ...

根据F1说的
这个函数基本上和 File.open(filename, "rb") { |f|
   obj = Marshal.load(f)
}

相同,但读取加密档案文件内部的文件时会有所不同


所以估计:
在未加密时,使用 Marshal.load,在加密时,使用另一种方式读取,究竟是什么方法,这就不是我们能知道的了,算是机密吧,可能有人破解这种方式.

至于Marshal吗,翻翻Ruby源代码吧
作者: jgl2000    时间: 2012-11-10 23:24
  1.   # Loads the data file indicated by filename and restores the object.
  2.   #
  3.   #  $data_actors = load_data("Data/Actors.rvdata2")
  4.   #
  5.   # This function is essentially the same as:
  6.   #
  7.   #  File.open(filename, "rb") { |f|
  8.   #    obj = Marshal.load(f)
  9.   #  }
  10.   #
  11.   # However, it differs in that it can load files from within encrypted archives.

  12.   def load_data(filename)
  13.     File.open(filename, "rb") { |f|
  14.       obj = Marshal.load(f)
  15.     }
  16.   end
复制代码
的确如此,很感兴趣用什么方式加密的
作者: jgl2000    时间: 2012-11-11 00:55
本帖最后由 jgl2000 于 2012-11-11 00:57 编辑
沙漠点灰 发表于 2012-11-10 21:21
根据F1说的


似乎是用这种方式加密的
  1. module PatchConfig
  2. Ext = '.rvdata'
  3.   Key = '0x$fD4^;'
  4.   Salt = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z .
  5.             A B C D E F G H I J K L M N O P Q R S T U V W X Y Z /)
  6.   Folder = 'Patch'
  7.   Name = 'patch_data'
复制代码
比如这个文件:

加密后的MapInfos.rvdata

加密前的mapinfo.rb
  1. module RPG
  2.   class MapInfo
  3.     def initialize
  4.       @name = ""
  5.       @parent_id = 0
  6.       @order = 0
  7.       @expanded = false
  8.       @scroll_x = 0
  9.       @scroll_y = 0
  10.     end
  11.     attr_accessor :name
  12.     attr_accessor :parent_id
  13.     attr_accessor :order
  14.     attr_accessor :expanded
  15.     attr_accessor :scroll_x
  16.     attr_accessor :scroll_y
  17.   end
  18. end
复制代码
现在可以通过实验来猜出,如何加密的了。
参考:http://yeyinde.vndv.com/Patcher2.txt
作者: jgl2000    时间: 2012-11-11 01:04
  1. data = ''
  2.     File.open('Test.002', 'rb') {|f| data = f.read}
  3.     name = "Patch_#{Time.now.strftime("%y_%m_%d")}" + Ext
  4.     time = Time.now.to_i
  5.     crc = Zlib.crc32(data)
  6.     gz = Zlib::GzipWriter.open(name)
  7.       gz.comment = generate_hash(crc, time)
  8.       gz.mtime = time
  9.       gz.orig_name = Name + '.tar'
  10.       gz.write(data)
  11.     gz.close
  12.     FileUtils.rm('Test.002')
  13. def generate_hash(crc, time)
  14.     salt = Salt[crc % Salt.size] + Salt[time % Salt.size]
  15.     return Key.crypt(salt)[2..-1]
  16.   end
复制代码
参考
作者: jgl2000    时间: 2012-11-11 01:05
https://gist.github.com/51513
作者: jgl2000    时间: 2012-11-11 01:05
参考这个 gist.github.com/51513
作者: jgl2000    时间: 2012-11-12 21:53
似乎是对原有数据进行压缩,然后序列化字节存储
作者: zhangbanxian    时间: 2012-11-13 08:42
jgl2000 发表于 2012-11-11 01:04
参考

- -b这个不是默认加密方法,只是一个用户自定义的打包系统(因为原版加密会增加体积),想了解加密方法谷歌rgssad,如果说非加密模式的rxdata话是不加密也不压缩的只是序列化而已(只有scripts.rxdata有一层zlib压缩)...
作者: jgl2000    时间: 2012-11-15 15:32
zhangbanxian 发表于 2012-11-13 08:42
- -b这个不是默认加密方法,只是一个用户自定义的打包系统(因为原版加密会增加体积),想了解加密方法谷 ...

很感谢你的指点




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1