Spy Lady of Azure Sea(沧海的Lady・Spy)Bug汇报、Bug修改及解密方法

平面生物sdkfz的头像
平面生物sdkfzLV 6424
帖子内容已隐藏

当前等级不足,帖子内容需要达到 LV1 后查看

DISCUSSION

评论区

3
平面生物sdkfz的头像
平面生物sdkfzLV 6424

问题来了:

之前提到了,这个游戏对数据进行了加密!以上操作目前完全无法进行!玩家苦啊!为了玩游戏,还要替开发者修bug!

来看看怎么解密吧!

首先我们要明确一点,作为单机环境下仍然能运行的游戏,它是不可能云端解密的,也就是说,解密过程完全发生在本地。我们用VScode打开相应的游戏文件夹,点最左边的放大镜,搜索decrypt,有两位数的结果。

这时我们会发现,rmmz_managers.js文件占了大部分搜索结果,点开发现有一坨很难看的代码,而它下面正是:

DataManager.decrypt = function(file) {

const decryptedBytes = CryptoJS.AES.decrypt(file, "%8nG3()-=b%4/?#@!c5zA");

const decryptedData = decryptedBytes.toString(CryptoJS.enc.Utf8);

return decryptedData;

};

DataManager.loadDataFile = function(name, src) {

const xhr = new XMLHttpRequest();

const url = "data/" + src;

window[name] = null;

xhr.open("GET", url);

xhr.overrideMimeType("application/json");

xhr.onload = () => this.onXhrLoad(xhr, name, src, url);

xhr.onerror = () => this.onXhrError(name, src, url);

xhr.send();

};

DataManager.onXhrLoad = function(xhr, name, src, url) {

if (xhr.status < 400) {

window[name] = JSON.parse(this.decrypt(xhr.responseText));

this.onLoad(window[name]);

} else {

this.onXhrError(name, src, url);

}

};

看到没有,密钥找到了!制作组没有把解密代码整合进exe,而是防君子不防小人,放在了js文件里。

现在我们进行一下修改:

DataManager.decrypt = function(file,name) {//增加了name参数,传入数据名称

const decryptedBytes = CryptoJS.AES.decrypt(file, "%8nG3()-=b%4/?#@!c5zA");

const decryptedData = decryptedBytes.toString(CryptoJS.enc.Utf8);

var dataname = name.toString('utf8');//转换字符串

var fs = require('fs');

fs.appendFile(dataname.slice(5,dataname.length)+".json",decryptedData, 'utf8',

function(err) {

if (err) throw err;

console.log("Data is appended to file successfully.")

}

);//去除开头的$data并添加后缀

return decryptedData;

};

DataManager.loadDataFile = function(name, src) {

const xhr = new XMLHttpRequest();

const url = "data/" + src;

window[name] = null;

xhr.open("GET", url);

xhr.overrideMimeType("application/json");

xhr.onload = () => this.onXhrLoad(xhr, name, src, url);

xhr.onerror = () => this.onXhrError(name, src, url);

xhr.send();

};

DataManager.onXhrLoad = function(xhr, name, src, url) {

if (xhr.status < 400) {

window[name] = JSON.parse(this.decrypt(xhr.responseText,name));//把数据名称也传进去

this.onLoad(window[name]);

} else {

this.onXhrError(name, src, url);

}

};

但是现在还不到运行的时候,因为地图数据是在游戏运行过程中才会加载的,现在我们需要让地图文件也加载进去:

找到两个DataManager._databaseFiles,修改如下:

DataManager._databaseFiles = [

{ name: "$dataActors", src: "Actors.json" },

{ name: "$dataClasses", src: "Classes.json" },

{ name: "$dataSkills", src: "Skills.json" },

{ name: "$dataItems", src: "Items.json" },

{ name: "$dataWeapons", src: "Weapons.json" },

{ name: "$dataArmors", src: "Armors.json" },

{ name: "$dataEnemies", src: "Enemies.json" },

{ name: "$dataTroops", src: "Troops.json" },

{ name: "$dataStates", src: "States.json" },

{ name: "$dataAnimations", src: "Animations.json" },

{ name: "$dataTilesets", src: "Tilesets.json" },

{ name: "$dataCommonEvents", src: "CommonEvents.json" },

{ name: "$dataSystem", src: "System.json" },

{ name: "$dataMapInfos", src: "MapInfos.json" },

{ name: "$dataMap001", src: "Map001.json" },

{ name: "$dataMap002", src: "Map002.json" },

{ name: "$dataMap003", src: "Map003.json" },

{ name: "$dataMap004", src: "Map004.json" },

{ name: "$dataMap005", src: "Map005.json" },

{ name: "$dataMap006", src: "Map006.json" },

{ name: "$dataMap007", src: "Map007.json" },

{ name: "$dataMap008", src: "Map008.json" },

{ name: "$dataMap009", src: "Map009.json" },

{ name: "$dataMap010", src: "Map010.json" },

{ name: "$dataMap011", src: "Map011.json" },

{ name: "$dataMap012", src: "Map012.json" },

{ name: "$dataMap013", src: "Map013.json" },

{ name: "$dataMap014", src: "Map014.json" },

{ name: "$dataMap015", src: "Map015.json" },

{ name: "$dataMap016", src: "Map016.json" },

{ name: "$dataMap017", src: "Map017.json" },

{ name: "$dataMap018", src: "Map018.json" },

{ name: "$dataMap019", src: "Map019.json" },

{ name: "$dataMap020", src: "Map020.json" },

{ name: "$dataMap021", src: "Map021.json" },

{ name: "$dataMap022", src: "Map022.json" },

{ name: "$dataMap023", src: "Map023.json" },

{ name: "$dataMap024", src: "Map024.json" },

{ name: "$dataMap025", src: "Map025.json" },

{ name: "$dataMap026", src: "Map026.json" },

{ name: "$dataMap027", src: "Map027.json" },

{ name: "$dataMap028", src: "Map028.json" },

{ name: "$dataMap029", src: "Map029.json" },

{ name: "$dataMap030", src: "Map030.json" }

];

现在再运行,稍等一会就会有44个json文件出现在游戏目录下了。为了能让游戏读取到明文文件,还需要再进行最后一次修改。

DataManager.onXhrLoad = function(xhr, name, src, url) {

if (xhr.status < 400) {

window[name] = JSON.parse(xhr.responseText);

this.onLoad(window[name]);

} else {

this.onXhrError(name, src, url);

}

};

现在把明文文件丢进data文件夹,覆盖掉原有的文件,就可以进行bug修复了。

虽然我觉得下面的话有点不道德,但我还是想说,开发者如果不想被白嫖,可以把加密的精力用在防破解上,而不是把游戏数据加密了,导致玩家不好自己修bug,既没防住白嫖,还给花了钱的玩家喂了一嘴屎。

海盗船的头像
海盗船LV 2968

我看不懂,但是前来支持

fg123za的头像
fg123zaLV 5399

支持

返回 黄油修理!