有人知道游戏Nyakori's rabbit doll用的是什么加密吗?
本帖最后由 EATB 于 2022/7/9 15:55 编辑有人知道游戏Nyakori's rabbit doll用的是什么加密吗?或者怎么解密这个游戏的图片文件吗?或者找到是用什么方法加密的也行(具体的)
steam的一个游戏,这个游戏的引擎是RPG maker MV/MZ,
但是对图片和声音资源的加密和普通的RPG maker游戏的加密又不一样
普通的RPG maker加密的文件一般都是rpgmvp或者.png_的后缀,但是这个游戏的资源文件是没有后缀的
这是游戏本体的链接,Steam上没有购买且Steam没有启动是无法打开的
链接:https://pan.baidu.com/s/1y4pfmsd8DiG0xjCGIvgvMQ
提取码:aexq
密码:bbs.itzmx.com@EATB 这个游戏的目录结构和文件和普通的RPG游戏都不太一样,比较明显的是greenworks,https://github.com/greenheartgames/greenworks// Copyright (c) 2015 Greenheart Games Pty. Ltd. All rights reserved.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
// The source code can be found in https://github.com/greenheartgames/greenworks
var fs = require('fs');
var greenworks;
if (process.platform == 'darwin') {
if (process.arch == 'x64')
greenworks = require('./lib/greenworks-osx64');
else if (process.arch == 'ia32')
greenworks = require('./lib/greenworks-osx32');
} else if (process.platform == 'win32') {
if (process.arch == 'x64')
greenworks = require('./lib/greenworks-win64');
else if (process.arch == 'ia32')
greenworks = require('./lib/greenworks-win32');
} else if (process.platform == 'linux') {
if (process.arch == 'x64')
greenworks = require('./lib/greenworks-linux64');
else if (process.arch == 'ia32')
greenworks = require('./lib/greenworks-linux32');
}
function error_process(err, error_callback) {
if (err && error_callback)
error_callback(err);
}
greenworks.ugcGetItems = function(options, ugc_matching_type, ugc_query_type,
success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = ugc_query_type;
ugc_query_type = ugc_matching_type;
ugc_matching_type = options;
options = {
'app_id': greenworks.getAppId(),
'page_num': 1
}
}
greenworks._ugcGetItems(options, ugc_matching_type, ugc_query_type,
success_callback, error_callback);
}
greenworks.ugcGetUserItems = function(options, ugc_matching_type,
ugc_list_sort_order, ugc_list, success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = ugc_list;
ugc_list = ugc_list_sort_order;
ugc_list_sort_order = ugc_matching_type;
ugc_matching_type = options;
options = {
'app_id': greenworks.getAppId(),
'page_num': 1
}
}
greenworks._ugcGetUserItems(options, ugc_matching_type, ugc_list_sort_order,
ugc_list, success_callback, error_callback);
}
greenworks.ugcSynchronizeItems = function (options, sync_dir, success_callback,
error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = sync_dir;
sync_dir = options;
options = {
'app_id': greenworks.getAppId(),
'page_num': 1
}
}
greenworks._ugcSynchronizeItems(options, sync_dir, success_callback,
error_callback);
}
greenworks.publishWorkshopFile = function(options, file_path, image_path, title,
description, success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = description;
description = title;
title = image_path;
image_path = file_path;
file_path = options;
options = {
'app_id': greenworks.getAppId(),
'tags': []
}
}
greenworks._publishWorkshopFile(options, file_path, image_path, title,
description, success_callback, error_callback);
}
greenworks.updatePublishedWorkshopFile = function(options,
published_file_handle, file_path, image_path, title, description,
success_callback, error_callback) {
if (typeof options !== 'object') {
error_callback = success_callback;
success_callback = description;
description = title;
title = image_path;
image_path = file_path;
file_path = published_file_handle;
published_file_handle = options;
options = {
'tags': [] // No tags are set
}
}
greenworks._updatePublishedWorkshopFile(options, published_file_handle,
file_path, image_path, title, description, success_callback,
error_callback);
}
// An utility function for publish related APIs.
// It processes remains steps after saving files to Steam Cloud.
function file_share_process(file_name, image_name, next_process_func,
error_callback, progress_callback) {
if (progress_callback)
progress_callback("Completed on saving files on Steam Cloud.");
greenworks.fileShare(file_name, function() {
greenworks.fileShare(image_name, function() {
next_process_func();
}, function(err) { error_process(err, error_callback); });
}, function(err) { error_process(err, error_callback); });
}
// Publishing user generated content(ugc) to Steam contains following steps:
// 1. Save file and image to Steam Cloud.
// 2. Share the file and image.
// 3. publish the file to workshop.
greenworks.ugcPublish = function(file_name, title, description, image_name,
success_callback, error_callback, progress_callback) {
var publish_file_process = function() {
if (progress_callback)
progress_callback("Completed on sharing files.");
greenworks.publishWorkshopFile(file_name, image_name, title, description,
function(publish_file_id) { success_callback(publish_file_id); },
function(err) { error_process(err, error_callback); });
};
greenworks.saveFilesToCloud(, function() {
file_share_process(file_name, image_name, publish_file_process,
error_callback, progress_callback);
}, function(err) { error_process(err, error_callback); });
}
// Update publish ugc steps:
// 1. Save new file and image to Steam Cloud.
// 2. Share file and images.
// 3. Update published file.
greenworks.ugcPublishUpdate = function(published_file_id, file_name, title,
description, image_name, success_callback, error_callback,
progress_callback) {
var update_published_file_process = function() {
if (progress_callback)
progress_callback("Completed on sharing files.");
greenworks.updatePublishedWorkshopFile(published_file_id,
file_name, image_name, title, description,
function() { success_callback(); },
function(err) { error_process(err, error_callback); });
};
greenworks.saveFilesToCloud(, function() {
file_share_process(file_name, image_name, update_published_file_process,
error_callback, progress_callback);
}, function(err) { error_process(err, error_callback); });
}
// Greenworks Utils APIs implmentation.
greenworks.Utils.move = function(source_dir, target_dir, success_callback,
error_callback) {
fs.rename(source_dir, target_dir, function(err) {
if (err) {
if (error_callback) error_callback(err);
return;
}
if (success_callback)
success_callback();
});
}
greenworks.init = function() {
if (this.initAPI()) return true;
if (!this.isSteamRunning())
throw new Error("Steam initialization failed. Steam is not running.");
var appId;
try {
appId = fs.readFileSync('steam_appid.txt', 'utf8');
} catch (e) {
throw new Error("Steam initialization failed. Steam is running," +
"but steam_appid.txt is missing. Expected to find it in: " +
require('path').resolve('steam_appid.txt'));
}
if (!/^\d+ *\r?\n?$/.test(appId)) {
throw new Error("Steam initialization failed. " +
"steam_appid.txt appears to be invalid; " +
"it should contain a numeric ID: " + appId);
}
throw new Error("Steam initialization failed, but Steam is running, " +
"and steam_appid.txt is present and valid." +
"Maybe that's not really YOUR app ID? " + appId.trim());
}
var EventEmitter = require('events').EventEmitter;
greenworks.__proto__ = EventEmitter.prototype;
EventEmitter.call(greenworks);
greenworks._steam_events.on = function () {
greenworks.emit.apply(greenworks, arguments);
};
process.versions['greenworks'] = greenworks._version;
module.exports = greenworks;
这个游戏的CG大概是用MD5来加密的,在plugins文件夹找到了个叫md5.js的文件
听说md5加密是无解的,如果是无解的游戏又是怎么显示被md5加密的cg文件呢?
var md5 = md5 || {};
(function($){
var rotateLeft = function(lValue, iShiftBits) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
var addUnsigned = function(lX, lY) {
var lX4, lY4, lX8, lY8, lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
if (lX4 | lY4) {
if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
} else {
return (lResult ^ lX8 ^ lY8);
}
}
var F = function(x, y, z) {
return (x & y) | ((~ x) & z);
}
var G = function(x, y, z) {
return (x & z) | (y & (~ z));
}
var H = function(x, y, z) {
return (x ^ y ^ z);
}
var I = function(x, y, z) {
return (y ^ (x | (~ z)));
}
var FF = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var GG = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var HH = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var II = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var convertToWordArray = function(string) {
var lWordCount;
var lMessageLength = string.length;
var lNumberOfWordsTempOne = lMessageLength + 8;
var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64;
var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16;
var lWordArray = Array(lNumberOfWords - 1);
var lBytePosition = 0;
var lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray = (lWordArray | (string.charCodeAt(lByteCount) << lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray = lWordArray | (0x80 << lBytePosition);
lWordArray = lMessageLength << 3;
lWordArray = lMessageLength >>> 29;
return lWordArray;
};
var wordToHex = function(lValue) {
var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount;
for (lCount = 0; lCount <= 3; lCount++) {
lByte = (lValue >>> (lCount * 8)) & 255;
WordToHexValueTemp = "0" + lByte.toString(16);
WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2);
}
return WordToHexValue;
};
var uTF8Encode = function(string) {
string = string.replace(/\x0d\x0a/g, "\x0a");
var output = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
output += String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
output += String.fromCharCode((c >> 6) | 192);
output += String.fromCharCode((c & 63) | 128);
} else {
output += String.fromCharCode((c >> 12) | 224);
output += String.fromCharCode(((c >> 6) & 63) | 128);
output += String.fromCharCode((c & 63) | 128);
}
}
return output;
};
$.compute = function(string) {
var x = Array();
var k, AA, BB, CC, DD, a, b, c, d;
var S11=7, S12=12, S13=17, S14=22;
var S21=5, S22=9 , S23=14, S24=20;
var S31=4, S32=11, S33=16, S34=23;
var S41=6, S42=10, S43=15, S44=21;
string = uTF8Encode(string);
x = convertToWordArray(string);
a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
for (k = 0; k < x.length; k += 16) {
AA = a; BB = b; CC = c; DD = d;
a = FF(a, b, c, d, x,S11, 0xD76AA478);
d = FF(d, a, b, c, x,S12, 0xE8C7B756);
c = FF(c, d, a, b, x,S13, 0x242070DB);
b = FF(b, c, d, a, x,S14, 0xC1BDCEEE);
a = FF(a, b, c, d, x,S11, 0xF57C0FAF);
d = FF(d, a, b, c, x,S12, 0x4787C62A);
c = FF(c, d, a, b, x,S13, 0xA8304613);
b = FF(b, c, d, a, x,S14, 0xFD469501);
a = FF(a, b, c, d, x,S11, 0x698098D8);
d = FF(d, a, b, c, x,S12, 0x8B44F7AF);
c = FF(c, d, a, b, x, S13, 0xFFFF5BB1);
b = FF(b, c, d, a, x, S14, 0x895CD7BE);
a = FF(a, b, c, d, x, S11, 0x6B901122);
d = FF(d, a, b, c, x, S12, 0xFD987193);
c = FF(c, d, a, b, x, S13, 0xA679438E);
b = FF(b, c, d, a, x, S14, 0x49B40821);
a = GG(a, b, c, d, x,S21, 0xF61E2562);
d = GG(d, a, b, c, x,S22, 0xC040B340);
c = GG(c, d, a, b, x, S23, 0x265E5A51);
b = GG(b, c, d, a, x,S24, 0xE9B6C7AA);
a = GG(a, b, c, d, x,S21, 0xD62F105D);
d = GG(d, a, b, c, x, S22, 0x2441453);
c = GG(c, d, a, b, x, S23, 0xD8A1E681);
b = GG(b, c, d, a, x,S24, 0xE7D3FBC8);
a = GG(a, b, c, d, x,S21, 0x21E1CDE6);
d = GG(d, a, b, c, x, S22, 0xC33707D6);
c = GG(c, d, a, b, x,S23, 0xF4D50D87);
b = GG(b, c, d, a, x,S24, 0x455A14ED);
a = GG(a, b, c, d, x, S21, 0xA9E3E905);
d = GG(d, a, b, c, x,S22, 0xFCEFA3F8);
c = GG(c, d, a, b, x,S23, 0x676F02D9);
b = GG(b, c, d, a, x, S24, 0x8D2A4C8A);
a = HH(a, b, c, d, x,S31, 0xFFFA3942);
d = HH(d, a, b, c, x,S32, 0x8771F681);
c = HH(c, d, a, b, x, S33, 0x6D9D6122);
b = HH(b, c, d, a, x, S34, 0xFDE5380C);
a = HH(a, b, c, d, x,S31, 0xA4BEEA44);
d = HH(d, a, b, c, x,S32, 0x4BDECFA9);
c = HH(c, d, a, b, x,S33, 0xF6BB4B60);
b = HH(b, c, d, a, x, S34, 0xBEBFBC70);
a = HH(a, b, c, d, x, S31, 0x289B7EC6);
d = HH(d, a, b, c, x,S32, 0xEAA127FA);
c = HH(c, d, a, b, x,S33, 0xD4EF3085);
b = HH(b, c, d, a, x,S34, 0x4881D05);
a = HH(a, b, c, d, x,S31, 0xD9D4D039);
d = HH(d, a, b, c, x, S32, 0xE6DB99E5);
c = HH(c, d, a, b, x, S33, 0x1FA27CF8);
b = HH(b, c, d, a, x,S34, 0xC4AC5665);
a = II(a, b, c, d, x,S41, 0xF4292244);
d = II(d, a, b, c, x,S42, 0x432AFF97);
c = II(c, d, a, b, x, S43, 0xAB9423A7);
b = II(b, c, d, a, x,S44, 0xFC93A039);
a = II(a, b, c, d, x, S41, 0x655B59C3);
d = II(d, a, b, c, x,S42, 0x8F0CCC92);
c = II(c, d, a, b, x, S43, 0xFFEFF47D);
b = II(b, c, d, a, x,S44, 0x85845DD1);
a = II(a, b, c, d, x,S41, 0x6FA87E4F);
d = II(d, a, b, c, x, S42, 0xFE2CE6E0);
c = II(c, d, a, b, x,S43, 0xA3014314);
b = II(b, c, d, a, x, S44, 0x4E0811A1);
a = II(a, b, c, d, x,S41, 0xF7537E82);
d = II(d, a, b, c, x, S42, 0xBD3AF235);
c = II(c, d, a, b, x,S43, 0x2AD7D2BB);
b = II(b, c, d, a, x,S44, 0xEB86D391);
a = addUnsigned(a, AA);
b = addUnsigned(b, BB);
c = addUnsigned(c, CC);
d = addUnsigned(d, DD);
}
var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
return tempValue.toLowerCase();
}
})(md5);
这是图片文件
https://att.itzmx.com/data/attachment/forum/202203/20/172346qf5ipj4zbjepfei1.png 这个游戏的图标可能都是加密的,游戏运行的时候会在“C:\Users\用户名\AppData\Local”生成一个文件夹,里面大概是缓存文件
在这个路径找到了已解密的游戏图标和未解密的md5文件
C:\Users\用户名\AppData\Local\Nyakori's Rabbit Doll\User Data\Default\Web Applications\_crx_kcglhcegbdionpbancnfbnbjjgjnolbm
游戏目录下的package.json就有写游戏图标
https://rpg.blue/thread-477772-1-1.html
找到了一点线索,
部分资源是【预载入到本地硬盘】的,部分资源是【预载入内存】的。
立绘,se,me,bgm这种不会卡MV场景加载的都会预载到硬盘
也就是说cg文件可能会被解密到硬盘中,但是目前发现此游戏创建的文件只有c盘的“C:\Users\用户名\AppData\Local\Nyakori's Rabbit Doll”
图:webgl告诉我你的显卡可以用S3TC的压缩格式。
如果MV要使用这些压缩纹理来节省图片内存占用的话,有什么方法可以让MV使用压缩纹理么。
这句说明cg文件不一定是普通的图片格式,也可能会以其他形式显示成图片
因为MV的资源管理模式几乎就是用到再加载,其实就是边玩边加载图片,这样图片稍微加载慢一点就出LOADING了,玩玩就LOADING,很烦。但为什么其他网游没这个问题,因为他们在游戏启动的时候一次性把资源全都预加载上来了。
这句已经印证游戏的资源文件会被提前加载好,这也就是为什么一开始游戏会有加载图,而且Game.exe对CPU和GPU的利用率提高 帮顶,感谢游戏推荐。 ICP13013206-7 发表于 2022/7/11 05:32
帮顶,感谢游戏推荐。
你是不是搞错了什么? 看起来还不错,感谢游戏推荐 这是这个游戏的index.html,里面只加载了一个插件(mrd.min.bin),这说明此游戏的资源文件价值极有可能是靠插件(mrd.min.bin)加载的,这个插件的大小为6.1MB
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="user-scalable=no">
<meta itemprop="name" content="喵可莉的兔玩偶"/>
<meta itemprop="image" content="icon/share.png" />
<meta name="description" itemprop="description" content="RPGMaker MV. WebGL Mode." />
<meta name="keywords" content="喵可莉,喵可莉的兔玩偶" />
<link rel="icon" href="icon/icon.png" type="image/png">
<link rel="apple-touch-icon" href="icon/icon.png">
<link rel="stylesheet" type="text/css" href="fonts/gamefont.css">
<title></title>
</head>
<body style="background-color: black">
<script type="text/javascript">
window.is_nwjc = true;
var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer';
xhr.open('GET', 'js/mrd.min.bin');
xhr.onload = function() {
if(xhr.status < 400)
{
nw.Window.get().evalNWBin(null, xhr.response);
}
window._setIntervalt = setInterval(function() {
if(window.onIndexCheckOK)
{
clearInterval(window._setIntervalt);
SceneManager.run(Scene_Boot);
}
}, 100);
};
xhr.send();
</script>
</body>
</html>
这个是普通RPG游戏的的index.html文件的内容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="user-scalable=no">
<link rel="icon" href="icon/icon.png" type="image/png">
<link rel="apple-touch-icon" href="icon/icon.png">
<link rel="stylesheet" type="text/css" href="fonts/gamefont.css">
<title>XXXX ver1.00</title>
</head>
<body style="background-color: black">
<script type="text/javascript" src="js/libs/pixi.js"></script>
<script type="text/javascript" src="js/libs/pixi-tilemap.js"></script>
<script type="text/javascript" src="js/libs/pixi-picture.js"></script>
<script type="text/javascript" src="js/libs/fpsmeter.js"></script>
<script type="text/javascript" src="js/libs/lz-string.js"></script>
<script type="text/javascript" src="js/libs/iphone-inline-video.browser.js"></script>
<script type="text/javascript" src="js/rpg_core.js"></script>
<script type="text/javascript" src="js/rpg_managers.js"></script>
<script type="text/javascript" src="js/rpg_objects.js"></script>
<script type="text/javascript" src="js/rpg_scenes.js"></script>
<script type="text/javascript" src="js/rpg_sprites.js"></script>
<script type="text/javascript" src="js/rpg_windows.js"></script>
<script type="text/javascript" src="js/plugins.js"></script>
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>
通过对比,这个游戏的index.html文件的head部分多出了这部分代码
<meta itemprop="name" content="喵可莉的兔玩偶"/>
<meta itemprop="image" content="icon/share.png" />
<meta name="description" itemprop="description" content="RPGMaker MV. WebGL Mode." />
<meta name="keywords" content="喵可莉,喵可莉的兔玩偶" />
body部分被替换为
<script type="text/javascript">
window.is_nwjc = true;
var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer';
xhr.open('GET', 'js/mrd.min.bin');
xhr.onload = function() {
if(xhr.status < 400)
{
nw.Window.get().evalNWBin(null, xhr.response);
}
window._setIntervalt = setInterval(function() {
if(window.onIndexCheckOK)
{
clearInterval(window._setIntervalt);
SceneManager.run(Scene_Boot);
}
}, 100);
};
xhr.send();
</script>
body部分被完全用于加载插件(mrd.min.bin),没有看到用于加载其他插件的代码,所以其他的插件及有可能是被插件(mrd.min.bin)加载的
head部分不太清楚是感什么的,但是肯定和WebGL有关
如果把插件(mrd.min.bin)删除,或者把body被替换的部分删除,打开game.exe就会一片黑
打开game.exe就会一片黑的原因就是什么都没有加载 如果index.html文件被修改,打开game.exe就自动退出,并不是闪退,因为游戏退出的动画就是进程被关闭的样子
这说明index.html文件有保护,无法修改 把js文件夹内除了mrd.min.bin以外的文件都删除后,游戏仍然能正常运行及游玩 如果把普通RPG Maker MV游戏的plugins文件夹删除,就会提示ERROR Failed to load: xxx.js
如果删除js文件夹内的lib文件夹,打开game.exe就会一片黑
如果把js文件夹根目录下的任何.js问价删除,打开game.exe都会一片黑
但是Nyakori's rabbit doll的js文件夹内的除了mrd.min.bin文件删除后,仍然能正常启动及游玩
这说明Nyakori's rabbit doll的mrd.min.bin文件内已经包含了所有需要的js,所有把js文件夹下的任何js删除都可以正常启动及游玩
这一切都说明搞定mrd.min.bin文件是关键 Nyakori's rabbit doll的mrd.min.bin文件内已经包含了所有需要的js
这句话可能不太对,因为js文件夹内除了mrd.min.bin的文件大小为13.5MB,但是mrd.min.bin文件只有6.1MB 现在最大的问题是如何查看和编辑mrd.min.bin文件 本帖最后由 EATB 于 2022/8/22 20:42 编辑
用hex workshop打开mrd.min.bin后的截图,能直接解读的是“DO_NOT_EXPORT_JSZIP"和DO_NOT_EXPORT_CODEPAGE
被警告不要提取JSZIP,由这个信息可知,这个文件大概就是一个JSZIP
百度到”jszip 是一个 JavaScript 库,可直接在浏览器上创建 zip 压缩档“
这样就知道这实际上是一种压缩包
以及50 49 58 49处的PIXI字样,这已经说明这个文件已经整合了游戏需要的插件
https://blog.csdn.net/static_coder/article/details/86293076
https://github.com/egret-labs/egret-game-library
看到了一堆网址,我怀疑这个文件其实没有加密? 一对比,就发现了相似之处,是非常的相似
这已经可以确定index.html中的代码就是解压mrd.min.bin
然后执行mrd.min.bin中的代码,让mrd.min.bin中的代码解密被加密的图片资源再运行游戏
在加了允许读取本地文件的浏览器打开index.html,无法运行游戏
出现两个错误,看起来是mrd.min.bin无法加载,想不出说明解决方法
还是只能解包mrd.min.bin
Access to XMLHttpRequest at 'file:///D:/Test/Nyakori's%20Rabbit%20Doll/js/mrd.min.bin' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, edge, https, chrome-untrusted.
Failed to load resource: net::ERR_FAILED
在游戏内开启了控制台,获取了以下信息
<html>
<head>
<meta charset="UTF-8">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="user-scalable=no">
<meta itemprop="name" content="喵可莉的兔玩偶">
<meta itemprop="image" content="icon/share.png">
<meta name="description" itemprop="description" content="RPGMaker MV. WebGL Mode.">
<meta name="keywords" content="喵可莉,喵可莉的兔玩偶">
<link rel="icon" href="icon/icon.png" type="image/png">
<link rel="apple-touch-icon" href="icon/icon.png">
<link rel="stylesheet" type="text/css" href="fonts/gamefont.css">
<title>
喵可莉的兔玩偶
</title>
<style>
#__vconsole {
--VC-BG-0: #ededed;
--VC-BG-1: #f7f7f7;
--VC-BG-2: #fff;
--VC-BG-3: #f7f7f7;
--VC-BG-4: #4c4c4c;
--VC-BG-5: #fff;
--VC-FG-0: rgba(0, 0, 0, 0.9);
--VC-FG-HALF: rgba(0, 0, 0, 0.9);
--VC-FG-1: rgba(0, 0, 0, 0.5);
--VC-FG-2: rgba(0, 0, 0, 0.3);
--VC-FG-3: rgba(0, 0, 0, 0.1);
--VC-RED: #fa5151;
--VC-ORANGE: #fa9d3b;
--VC-YELLOW: #ffc300;
--VC-GREEN: #91d300;
--VC-LIGHTGREEN: #95ec69;
--VC-BRAND: #07c160;
--VC-BLUE: #10aeff;
--VC-INDIGO: #1485ee;
--VC-PURPLE: #6467f0;
--VC-LINK: #576b95;
--VC-TEXTGREEN: #06ae56;
--VC-FG: black;
--VC-BG: white;
--VC-BG-COLOR-ACTIVE: #ececec;
--VC-WARN-BG: #fff3cc;
--VC-WARN-BORDER: #ffe799;
--VC-ERROR-BG: #fedcdc;
--VC-ERROR-BORDER: #fdb9b9;
--VC-DOM-TAG-NAME-COLOR: #881280;
--VC-DOM-ATTRIBUTE-NAME-COLOR: #994500;
--VC-DOM-ATTRIBUTE-VALUE-COLOR: #1a1aa6;
--VC-CODE-KEY-FG: #881391;
--VC-CODE-PRIVATE-KEY-FG: #cfa1d3;
--VC-CODE-FUNC-FG: #0d22aa;
--VC-CODE-NUMBER-FG: #1c00cf;
--VC-CODE-STR-FG: #c41a16;
--VC-CODE-NULL-FG: #808080;
color: var(--VC-FG-0);
font-size: 13px;
font-family: Helvetica Neue, Helvetica, Arial, sans-serif;
-webkit-user-select: auto;
/* global */
/* compoment */
}
#__vconsole .vc-max-height {
max-height: 19.23076923em;
}
#__vconsole .vc-max-height-line {
max-height: 3.38461538em;
}
#__vconsole .vc-min-height {
min-height: 3.07692308em;
}
#__vconsole dd,
#__vconsole dl,
#__vconsole pre {
margin: 0;
}
#__vconsole .vc-switch {
display: block;
position: fixed;
right: 0.76923077em;
bottom: 0.76923077em;
color: #FFF;
background-color: var(--VC-BRAND);
line-height: 1;
font-size: 1.07692308em;
padding: 0.61538462em 1.23076923em;
z-index: 10000;
border-radius: 0.30769231em;
box-shadow: 0 0 0.61538462em rgba(0, 0, 0, 0.4);
}
#__vconsole .vc-mask {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0);
z-index: 10001;
-webkit-transition: background 0.3s;
transition: background 0.3s;
-webkit-tap-highlight-color: transparent;
overflow-y: scroll;
}
#__vconsole .vc-panel {
display: none;
position: fixed;
min-height: 85%;
left: 0;
right: 0;
bottom: 0;
z-index: 10002;
background-color: var(--VC-BG-0);
-webkit-transition: -webkit-transform 0.3s;
transition: -webkit-transform 0.3s;
transition: transform 0.3s;
transition: transform 0.3s, -webkit-transform 0.3s;
-webkit-transform: translate(0, 100%);
transform: translate(0, 100%);
}
#__vconsole .vc-tabbar {
border-bottom: 1px solid var(--VC-FG-3);
overflow-x: auto;
height: 3em;
width: auto;
white-space: nowrap;
}
#__vconsole .vc-tabbar .vc-tab {
display: inline-block;
line-height: 3em;
padding: 0 1.15384615em;
border-right: 1px solid var(--VC-FG-3);
text-decoration: none;
color: var(--VC-FG-0);
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none;
}
#__vconsole .vc-tabbar .vc-tab:active {
background-color: rgba(0, 0, 0, 0.15);
}
#__vconsole .vc-tabbar .vc-tab.vc-actived {
background-color: var(--VC-BG-1);
}
#__vconsole .vc-content {
background-color: var(--VC-BG-2);
overflow-x: hidden;
overflow-y: auto;
position: absolute;
top: 3.07692308em;
left: 0;
right: 0;
bottom: 3.07692308em;
-webkit-overflow-scrolling: touch;
margin-bottom: constant(safe-area-inset-bottom);
margin-bottom: env(safe-area-inset-bottom);
}
#__vconsole .vc-content.vc-has-topbar {
top: 5.46153846em;
}
#__vconsole .vc-topbar {
background-color: var(--VC-BG-1);
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
-moz-box-orient: horizontal;
-moz-box-direction: normal;
-ms-flex-direction: row;
flex-direction: row;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
width: 100%;
}
#__vconsole .vc-topbar .vc-toptab {
display: none;
-webkit-box-flex: 1;
-webkit-flex: 1;
-moz-box-flex: 1;
-ms-flex: 1;
flex: 1;
line-height: 2.30769231em;
padding: 0 1.15384615em;
border-bottom: 1px solid var(--VC-FG-3);
text-decoration: none;
text-align: center;
color: var(--VC-FG-0);
-webkit-tap-highlight-color: transparent;
-webkit-touch-callout: none;
}
#__vconsole .vc-topbar .vc-toptab.vc-toggle {
display: block;
}
#__vconsole .vc-topbar .vc-toptab:active {
background-color: rgba(0, 0, 0, 0.15);
}
#__vconsole .vc-topbar .vc-toptab.vc-actived {
border-bottom: 1px solid var(--VC-INDIGO);
}
#__vconsole .vc-logbox {
display: none;
position: relative;
min-height: 100%;
}
#__vconsole .vc-logbox i {
font-style: normal;
}
#__vconsole .vc-logbox .vc-log {
padding-bottom: 6em;
-webkit-tap-highlight-color: transparent;
}
#__vconsole .vc-logbox .vc-log:empty:before {
content: "Empty";
color: var(--VC-FG-1);
position: absolute;
top: 45%;
left: 0;
right: 0;
bottom: 0;
font-size: 1.15384615em;
text-align: center;
}
#__vconsole .vc-logbox .vc-item {
margin: 0;
padding: 0.46153846em 0.61538462em;
overflow: hidden;
line-height: 1.3;
border-bottom: 1px solid var(--VC-FG-3);
word-break: break-word;
}
#__vconsole .vc-logbox .vc-item-info {
color: var(--VC-PURPLE);
}
#__vconsole .vc-logbox .vc-item-debug {
color: var(--VC-YELLOW);
}
#__vconsole .vc-logbox .vc-item-warn {
color: var(--VC-ORANGE);
border-color: var(--VC-WARN-BORDER);
background-color: var(--VC-WARN-BG);
}
#__vconsole .vc-logbox .vc-item-error {
color: var(--VC-RED);
border-color: var(--VC-ERROR-BORDER);
background-color: var(--VC-ERROR-BG);
}
#__vconsole .vc-logbox .vc-log.vc-log-partly .vc-item {
display: none;
}
#__vconsole .vc-logbox .vc-log.vc-log-partly-log .vc-item-log,
#__vconsole .vc-logbox .vc-log.vc-log-partly-info .vc-item-info,
#__vconsole .vc-logbox .vc-log.vc-log-partly-warn .vc-item-warn,
#__vconsole .vc-logbox .vc-log.vc-log-partly-error .vc-item-error {
display: block;
}
#__vconsole .vc-logbox .vc-item.hide {
display: none;
}
#__vconsole .vc-logbox .vc-item .vc-item-content {
margin-right: 4.61538462em;
display: inline-block;
}
#__vconsole .vc-logbox .vc-item .vc-item-repeat {
display: inline-block;
margin-right: 0.30769231em;
padding: 0 6.5px;
color: #D7E0EF;
background-color: #42597F;
border-radius: 8.66666667px;
}
#__vconsole .vc-logbox .vc-item.vc-item-error .vc-item-repeat {
color: #901818;
background-color: var(--VC-RED);
}
#__vconsole .vc-logbox .vc-item.vc-item-warn .vc-item-repeat {
color: #987D20;
background-color: #F4BD02;
}
#__vconsole .vc-logbox .vc-item .vc-item-code {
display: block;
white-space: pre-wrap;
overflow: auto;
position: relative;
}
#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input,
#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output {
padding-left: 0.92307692em;
}
#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-input:before,
#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before {
content: "›";
position: absolute;
top: -0.23076923em;
left: 0;
font-size: 1.23076923em;
color: #6A5ACD;
}
#__vconsole .vc-logbox .vc-item .vc-item-code.vc-item-code-output:before {
content: "‹";
}
#__vconsole .vc-logbox .vc-item .vc-fold {
display: block;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer {
display: block;
font-style: italic;
padding-left: 0.76923077em;
position: relative;
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:active {
background-color: var(--VC-BG-COLOR-ACTIVE);
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer:before {
content: "";
position: absolute;
top: 0.30769231em;
left: 0.15384615em;
width: 0;
height: 0;
border: transparent solid 0.30769231em;
border-left-color: var(--VC-FG-1);
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer.vc-toggle:before {
top: 0.46153846em;
left: 0;
border-top-color: var(--VC-FG-1);
border-left-color: transparent;
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner {
display: none;
margin-left: 0.76923077em;
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner.vc-toggle {
display: block;
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-inner .vc-code-key {
margin-left: 0.76923077em;
}
#__vconsole .vc-logbox .vc-item .vc-fold .vc-fold-outer .vc-code-key {
margin-left: 0;
}
#__vconsole .vc-logbox .vc-code-key {
color: var(--VC-CODE-KEY-FG);
}
#__vconsole .vc-logbox .vc-code-private-key {
color: var(--VC-CODE-PRIVATE-KEY-FG);
}
#__vconsole .vc-logbox .vc-code-function {
color: var(--VC-CODE-FUNC-FG);
font-style: italic;
}
#__vconsole .vc-logbox .vc-code-number,
#__vconsole .vc-logbox .vc-code-boolean {
color: var(--VC-CODE-NUMBER-FG);
}
#__vconsole .vc-logbox .vc-code-string {
color: var(--VC-CODE-STR-FG);
}
#__vconsole .vc-logbox .vc-code-null,
#__vconsole .vc-logbox .vc-code-undefined {
color: var(--VC-CODE-NULL-FG);
}
#__vconsole .vc-logbox .vc-cmd {
position: absolute;
height: 3.07692308em;
left: 0;
right: 0;
bottom: 41px;
border-top: 1px solid var(--VC-FG-3);
display: block!important;
}
#__vconsole .vc-logbox .vc-cmd.vc-filter {
bottom: 0;
}
#__vconsole .vc-logbox .vc-cmd .vc-cmd-input-wrap {
display: block;
height: 2.15384615em;
margin-right: 3.07692308em;
padding: 0.46153846em 0.61538462em;
}
#__vconsole .vc-logbox .vc-cmd .vc-cmd-input {
width: 100%;
border: none;
resize: none;
outline: none;
padding: 0;
font-size: 0.92307692em;
background-color: transparent;
color: var(--VC-FG-0);
}
#__vconsole .vc-logbox .vc-cmd .vc-cmd-input::-webkit-input-placeholder {
line-height: 2.15384615em;
}
#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn {
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 3.07692308em;
border: none;
background-color: var(--VC-BG-0);
color: var(--VC-FG-0);
outline: none;
-webkit-touch-callout: none;
font-size: 1em;
}
#__vconsole .vc-logbox .vc-cmd .vc-cmd-btn:active {
background-color: rgba(0, 0, 0, 0.15);
}
#__vconsole .vc-logbox .vc-cmd .vc-cmd-prompted {
position: fixed;
width: 100%;
background-color: var(--VC-BG-3);
border: 1px solid var(--VC-FG-3);
overflow-x: scroll;
display: none;
}
#__vconsole .vc-logbox .vc-cmd .vc-cmd-prompted li {
list-style: none;
line-height: 30px;
padding: 0 0.46153846em;
border-bottom: 1px solid var(--VC-FG-3);
}
#__vconsole .vc-logbox .vc-group .vc-group-preview {
-webkit-touch-callout: none;
}
#__vconsole .vc-logbox .vc-group .vc-group-preview:active {
background-color: var(--VC-BG-COLOR-ACTIVE);
}
#__vconsole .vc-logbox .vc-group .vc-group-detail {
display: none;
padding: 0 0 0.76923077em 1.53846154em;
border-bottom: 1px solid var(--VC-FG-3);
}
#__vconsole .vc-logbox .vc-group.vc-actived .vc-group-detail {
display: block;
background-color: var(--VC-BG-1);
}
#__vconsole .vc-logbox .vc-group.vc-actived .vc-table-row {
background-color: var(--VC-BG-2);
}
#__vconsole .vc-logbox .vc-group.vc-actived .vc-group-preview {
background-color: var(--VC-BG-1);
}
#__vconsole .vc-logbox .vc-table .vc-table-row {
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
-moz-box-orient: horizontal;
-moz-box-direction: normal;
-ms-flex-direction: row;
flex-direction: row;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
overflow: hidden;
border-bottom: 1px solid var(--VC-FG-3);
}
#__vconsole .vc-logbox .vc-table .vc-table-row.vc-left-border {
border-left: 1px solid var(--VC-FG-3);
}
#__vconsole .vc-logbox .vc-table .vc-table-col {
-webkit-box-flex: 1;
-webkit-flex: 1;
-moz-box-flex: 1;
-ms-flex: 1;
flex: 1;
padding: 0.23076923em 0.30769231em;
border-left: 1px solid var(--VC-FG-3);
overflow: auto;
white-space: pre-wrap;
word-break: break-word;
/*white-space: nowrap;
text-overflow: ellipsis;*/
-webkit-overflow-scrolling: touch;
}
#__vconsole .vc-logbox .vc-table .vc-table-col:first-child {
border: none;
}
#__vconsole .vc-logbox .vc-table .vc-small .vc-table-col {
padding: 0 0.30769231em;
font-size: 0.92307692em;
}
#__vconsole .vc-logbox .vc-table .vc-table-col-2 {
-webkit-box-flex: 2;
-webkit-flex: 2;
-moz-box-flex: 2;
-ms-flex: 2;
flex: 2;
}
#__vconsole .vc-logbox .vc-table .vc-table-col-3 {
-webkit-box-flex: 3;
-webkit-flex: 3;
-moz-box-flex: 3;
-ms-flex: 3;
flex: 3;
}
#__vconsole .vc-logbox .vc-table .vc-table-col-4 {
-webkit-box-flex: 4;
-webkit-flex: 4;
-moz-box-flex: 4;
-ms-flex: 4;
flex: 4;
}
#__vconsole .vc-logbox .vc-table .vc-table-col-5 {
-webkit-box-flex: 5;
-webkit-flex: 5;
-moz-box-flex: 5;
-ms-flex: 5;
flex: 5;
}
#__vconsole .vc-logbox .vc-table .vc-table-col-6 {
-webkit-box-flex: 6;
-webkit-flex: 6;
-moz-box-flex: 6;
-ms-flex: 6;
flex: 6;
}
#__vconsole .vc-logbox .vc-table .vc-table-row-error {
border-color: var(--VC-ERROR-BORDER);
background-color: var(--VC-ERROR-BG);
}
#__vconsole .vc-logbox .vc-table .vc-table-row-error .vc-table-col {
color: var(--VC-RED);
border-color: var(--VC-ERROR-BORDER);
}
#__vconsole .vc-logbox .vc-table .vc-table-col-title {
font-weight: bold;
}
#__vconsole .vc-logbox.vc-actived {
display: block;
}
#__vconsole .vc-toolbar {
border-top: 1px solid var(--VC-FG-3);
line-height: 3em;
position: absolute;
left: 0;
right: 0;
bottom: 0;
display: -webkit-box;
display: -webkit-flex;
display: -moz-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
-moz-box-orient: horizontal;
-moz-box-direction: normal;
-ms-flex-direction: row;
flex-direction: row;
}
#__vconsole .vc-toolbar .vc-tool {
display: none;
text-decoration: none;
color: var(--VC-FG-0);
width: 50%;
-webkit-box-flex: 1;
-webkit-flex: 1;
-moz-box-flex: 1;
-ms-flex: 1;
flex: 1;
text-align: center;
position: relative;
-webkit-touch-callout: none;
}
#__vconsole .vc-toolbar .vc-tool.vc-toggle,
#__vconsole .vc-toolbar .vc-tool.vc-global-tool {
display: block;
}
#__vconsole .vc-toolbar .vc-tool:active {
background-color: rgba(0, 0, 0, 0.15);
}
#__vconsole .vc-toolbar .vc-tool:after {
content: " ";
position: absolute;
top: 0.53846154em;
bottom: 0.53846154em;
right: 0;
border-left: 1px solid var(--VC-FG-3);
}
#__vconsole .vc-toolbar .vc-tool-last:after {
border: none;
}
@supports (bottom: constant(safe-area-inset-bottom)) or (bottom: env(safe-area-inset-bottom)) {
#__vconsole .vc-toolbar,
#__vconsole .vc-switch {
bottom: constant(safe-area-inset-bottom);
bottom: env(safe-area-inset-bottom);
}
}
#__vconsole.vc-toggle .vc-switch {
display: none;
}
#__vconsole.vc-toggle .vc-mask {
background: rgba(0, 0, 0, 0.6);
display: block;
}
#__vconsole.vc-toggle .vc-panel {
-webkit-transform: translate(0, 0);
transform: translate(0, 0);
}
@media (prefers-color-scheme: dark) {
#__vconsole:not() {
--VC-BG-0: #191919;
--VC-BG-1: #1f1f1f;
--VC-BG-2: #232323;
--VC-BG-3: #2f2f2f;
--VC-BG-4: #606060;
--VC-BG-5: #2c2c2c;
--VC-FG-0: rgba(255, 255, 255, 0.8);
--VC-FG-HALF: rgba(255, 255, 255, 0.6);
--VC-FG-1: rgba(255, 255, 255, 0.5);
--VC-FG-2: rgba(255, 255, 255, 0.3);
--VC-FG-3: rgba(255, 255, 255, 0.05);
--VC-RED: #fa5151;
--VC-ORANGE: #c87d2f;
--VC-YELLOW: #cc9c00;
--VC-GREEN: #74a800;
--VC-LIGHTGREEN: #28b561;
--VC-BRAND: #07c160;
--VC-BLUE: #10aeff;
--VC-INDIGO: #1196ff;
--VC-PURPLE: #8183ff;
--VC-LINK: #7d90a9;
--VC-TEXTGREEN: #259c5c;
--VC-FG: white;
--VC-BG: black;
--VC-BG-COLOR-ACTIVE: #282828;
--VC-WARN-BG: #332700;
--VC-WARN-BORDER: #664e00;
--VC-ERROR-BG: #321010;
--VC-ERROR-BORDER: #642020;
--VC-DOM-TAG-NAME-COLOR: #5DB0D7;
--VC-DOM-ATTRIBUTE-NAME-COLOR: #9BBBDC;
--VC-DOM-ATTRIBUTE-VALUE-COLOR: #f29766;
--VC-CODE-KEY-FG: #e36eec;
--VC-CODE-PRIVATE-KEY-FG: #f4c5f7;
--VC-CODE-FUNC-FG: #556af2;
--VC-CODE-NUMBER-FG: #9980ff;
--VC-CODE-STR-FG: #e93f3b;
--VC-CODE-NULL-FG: #808080;
}
}
#__vconsole {
--VC-BG-0: #191919;
--VC-BG-1: #1f1f1f;
--VC-BG-2: #232323;
--VC-BG-3: #2f2f2f;
--VC-BG-4: #606060;
--VC-BG-5: #2c2c2c;
--VC-FG-0: rgba(255, 255, 255, 0.8);
--VC-FG-HALF: rgba(255, 255, 255, 0.6);
--VC-FG-1: rgba(255, 255, 255, 0.5);
--VC-FG-2: rgba(255, 255, 255, 0.3);
--VC-FG-3: rgba(255, 255, 255, 0.05);
--VC-RED: #fa5151;
--VC-ORANGE: #c87d2f;
--VC-YELLOW: #cc9c00;
--VC-GREEN: #74a800;
--VC-LIGHTGREEN: #28b561;
--VC-BRAND: #07c160;
--VC-BLUE: #10aeff;
--VC-INDIGO: #1196ff;
--VC-PURPLE: #8183ff;
--VC-LINK: #7d90a9;
--VC-TEXTGREEN: #259c5c;
--VC-FG: white;
--VC-BG: black;
--VC-BG-COLOR-ACTIVE: #282828;
--VC-WARN-BG: #332700;
--VC-WARN-BORDER: #664e00;
--VC-ERROR-BG: #321010;
--VC-ERROR-BORDER: #642020;
--VC-DOM-TAG-NAME-COLOR: #5DB0D7;
--VC-DOM-ATTRIBUTE-NAME-COLOR: #9BBBDC;
--VC-DOM-ATTRIBUTE-VALUE-COLOR: #f29766;
--VC-CODE-KEY-FG: #e36eec;
--VC-CODE-PRIVATE-KEY-FG: #f4c5f7;
--VC-CODE-FUNC-FG: #556af2;
--VC-CODE-NUMBER-FG: #9980ff;
--VC-CODE-STR-FG: #e93f3b;
--VC-CODE-NULL-FG: #808080;
}
</style>
<style>
/* color */
.vcelm-node {
color: var(--VC-DOM-TAG-NAME-COLOR);
}
.vcelm-k {
color: var(--VC-DOM-ATTRIBUTE-NAME-COLOR);
}
.vcelm-v {
color: var(--VC-DOM-ATTRIBUTE-VALUE-COLOR);
}
/* layout */
.vcelm-l {
padding-left: 8px;
position: relative;
word-wrap: break-word;
line-height: 1;
}
/*.vcelm-l.vcelm-noc {
padding-left: 0;
}*/
.vcelm-l.vc-toggle > .vcelm-node {
display: block;
}
.vcelm-l .vcelm-node:active {
background-color: var(--VC-BG-COLOR-ACTIVE);
}
.vcelm-l.vcelm-noc .vcelm-node:active {
background-color: transparent;
}
.vcelm-t {
white-space: pre-wrap;
word-wrap: break-word;
}
/* level */
.vcelm-l .vcelm-l {
display: none;
}
.vcelm-l.vc-toggle > .vcelm-l {
margin-left: 4px;
display: block;
}
/* arrow */
.vcelm-l:before {
content: "";
display: block;
position: absolute;
top: 6px;
left: 3px;
width: 0;
height: 0;
border: transparent solid 3px;
border-left-color: var(--VC-FG-1);
}
.vcelm-l.vc-toggle:before {
display: block;
top: 6px;
left: 0;
border-top-color: var(--VC-FG-1);
border-left-color: transparent;
}
.vcelm-l.vcelm-noc:before {
display: none;
}
</style>
</head>
<body style="background-color: black; user-select: none;">
<script type="text/javascript">
window.is_nwjc = true;
var xhr = new XMLHttpRequest();
xhr.responseType = 'arraybuffer';
xhr.open('GET', 'js/mrd.min.bin');
xhr.onload = function() {
if(xhr.status < 400)
{
nw.Window.get().evalNWBin(null, xhr.response);
}
window._setIntervalt = setInterval(function() {
if(window.onIndexCheckOK)
{
clearInterval(window._setIntervalt);
SceneManager.run(Scene_Boot);
}
}, 100);
};
xhr.send();
</script>
<p id="ErrorPrinter" style="text-align: left; text-shadow: rgb(0, 0, 0) 1px 1px 3px; font-size: 20px; z-index: 99; position: absolute; margin: auto; top: 0px; left: 0px; right: 0px; bottom: 0px; width: 972px; height: 270px;"></p>
<img align="right" style="padding: 100px 30px;">
<canvas id="GameCanvas" width="1080" height="540" style="z-index: 1; position: absolute; margin: auto; top: 0px; left: 0px; right: 0px; bottom: 0px; width: 1080px; height: 540px; touch-action: none; cursor: inherit;"></canvas>
<video id="GameVideo" playsinline width="1080" height="540" style="opacity: 0; z-index: 2; position: absolute; margin: auto; top: 0px; left: 0px; right: 0px; bottom: 0px; width: 1080px; height: 540px;"></video>
<canvas id="UpperCanvas" width="1080" height="540" style="z-index: 3; position: absolute; margin: auto; top: 0px; left: 0px; right: 0px; bottom: 0px; width: 1080px; height: 540px; opacity: 0;"></canvas>
<div style="padding: 0px; min-width: 95px; height: 30px; line-height: 30px; text-align: right; text-shadow: rgba(0, 0, 0, 0.5) 1px 1px 0px; color: rgb(255, 255, 255); position: absolute; z-index: 10; left: 5px; top: 5px; right: auto; bottom: auto; margin: 0px; display: none;">
<div style="position: absolute; top: 0px; right: 0px; padding: 0px 5px; height: 40px; font-size: 24px; font-family: Consolas, "Andale Mono", monospace; z-index: 2; line-height: 40px;">
0
</div>
<div style="position: absolute; top: 0px; left: 0px; padding: 0px 5px; height: 40px; font-size: 12px; line-height: 42px; font-family: sans-serif; text-align: left; z-index: 2;">
FPS
</div>
<div style="position: relative; height: 40px; z-index: 1; width: 119px;">
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 0px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 6px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 12px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 18px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 24px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 30px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 36px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 42px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 48px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 54px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 60px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 66px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 72px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 78px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 84px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 90px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 96px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 102px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 108px; width: 5px; height: 0px;"></div>
<div style="background: rgb(153, 153, 153); opacity: 0.5; position: absolute; bottom: 0px; right: 114px; width: 5px; height: 0px;"></div>
</div>
</div>
<div id="modeTextBack" style="position: absolute; left: 5px; top: 5px; width: 119px; height: 58px; background: rgba(0, 0, 0, 0.2); z-index: 9; opacity: 0;">
<div id="modeText" style="position: absolute; left: 0px; top: 41px; width: 119px; font-size: 12px; font-family: monospace; color: white; text-align: center; text-shadow: rgba(0, 0, 0, 0.5) 1px 1px 0px;">
WebGL mode
</div>
</div>
</body>
<div id="__vconsole" class=" vc-toggle">
<div class="vc-switch">
vConsole
</div>
<div class="vc-mask" style="display: block;"></div>
<div class="vc-panel" style="display: block;">
<div class="vc-tabbar"></div>
<div class="vc-topbar"></div>
<div class="vc-content"></div>
<div class="vc-toolbar"></div>
</div>
</div>
</html> 这就是大佬么
页:
[1]