Skip to content

Chaos; Child 汉化补丁 神秘编码探索

Published: at 17:47

今天闲来无事,群里245哥提到 CCLCC 的汉化出了,遂去贴吧寻找资源。资源没找到,但却发现了 CC 汉化补丁中留下的解密游戏Misc题于是浪费了一个下午的时间来摸这个(错乱)

补丁的下载链接是 https://pan.baidu.com/s/1c389nt2,待解密的内容是补丁中的 txtchscode.zip

ToC

Zip

txtchscode.zip 中有 code.jpgdata.jpg 两个文件,对二者分别进行 binwalk 又可以得到两个隐藏的 zip。这里命名为 code.zipdata.zip

code.zip 解压可以得到两个 Java 文件,对 data.zip 解压则可以得到如下文所示的文本:

待解密文本

22010202222012110122201
222502263029340278002984
31067065058056053032033020

data.zip 中给出的 data 是一个由三行数字构成的文本。

加密程序

code.java 中一共有两个文件,一个是主文件,另一个并没有太大意义,因此省略。

package chaoschild;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.util.Scanner;
public class ChaosChild {
/**
*
* @param linkedList
* @param fileName
* @author 天光逸
*/
//read the file by line
public static void readFileByLines(ChaosChild linkedList, String fileName) {
String key = null;
String password = null;
String link=null;
File file = new File(fileName);
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 0;
// Read one line for one time until it reads null for the end of the file
while ((tempString = reader.readLine()) != null) {// to find if it reads to the end of the file
line = line % 3;
switch (line) {
case 0:
key = tempString;
break;
case 1:
password = tempString;
break;
case 2:
link = tempString;
Node node = new Node(key, password, link);
linkedList.addNode(node);
break;
}
line++;
}
reader.close();
} catch (IOException e) {
}
}
private Node head = null;// Head Node
private Node tail = null;// Tail node(null node) as Temporary nodes which used for substitution
//find key
public static Node findlink(String link, ChaosChild myList) {
Node tmp = null;
for (tmp = myList.getHead(); tmp != null; tmp = tmp.next) {
if (link.equals(tmp.link))
return tmp;
}
return tmp;
}
/**
*
* initial a linked list(set head)
* @param node
*/
public void initList(Node node) {
head = node;
head.next = tail;
}
/**
*
* add node
* @param node
*/
//sort all cars by purchase date
public void addNode(Node node) {
Node temp = head;
if (head == null) {
initList(node);
} else {// Replace head node
node.next = head;
head = node;
}
}
/**
*
* Traverse the list and delete node
* @param node
* @param myList
*/
public void deleteNode(Node node, ChaosChild myList) {
if (myList == null) {
return;
}
Node tmp = null;
for (tmp = myList.head; tmp != null; tmp = tmp.next) {
if (tmp.next != null && node.getlink().equals(tmp.next.getlink())) {
if (tmp.next.next != null) {
tmp.next = tmp.next.next;
} else {
tmp.next = null;
}
}
}
}
public Node getHead() {
return head;
}
/**
*
*
* @param myList
*/
/**
*
* @param args
* @throws java.text.ParseException
* @throws java.io.IOException
*/
//Achieve the four main funtions and save the file to data.txt
public static void main(String[] args) throws ParseException, IOException {
String filename="C:\\Users\\lenovo\\Desktop\\data.txt";
ChaosChild linkedList = new ChaosChild();
readFileByLines(linkedList, filename);
System.out.println("Welcome to this game. My name is MK0034209038. Please remember you have known my name.");
while (true) {
System.out.print("Please enter one of those :(input 1 2 3 4)\n1、Input data\n2、Display the data\n3、Hint \n4、Exit\n");
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if (i == 1) {
System.out.println("You are not administrator");
// Scanner scanner = new Scanner(System.in);
} else if (i == 2) {
printlist(linkedList);
} else if (i == 3) {
System.out.println("Where is made by Morse code and please check the picture again.");
System.out.println("For more hints please enter 3 again");
int b = scanner.nextInt();
if(b == 3){
System.out.println("Well, the next hint is my name is made by 3 kinds of code");
}else{
System.out.println("OK,think about what the hell are those numbers meaning");
}
} else if (i == 4) {
BufferedWriter out;
try {
out = new BufferedWriter(new FileWriter(filename));
Node tmp = null;
long sum = 0;
for (tmp = linkedList.getHead(); tmp != null; tmp = tmp.next) {
out.write(tmp.key);
out.newLine();
out.write(String.valueOf(tmp.password));
out.newLine();
out.write(String.valueOf(tmp.link));
out.newLine();
}
out.close();
} catch (IOException e) {
}
return;
}
}
}
public static void printlist(ChaosChild myList) {
Node tmp = null;
long sum = 0;
for (tmp = myList.getHead(); tmp != null; tmp = tmp.next) {
System.out.print("Where:"+tmp.key + " " +"password:" +tmp.password + " " + "link:"+tmp.link + "\n");
}
}
}

简单观察程序,data 中的三行对应分别是 keypasswordlink。其中 key 又被称作 where

Hint

Where is made by Morse code and please check the picture again.
Well, the next hint is my name is made by 3 kinds of code
OK,think about what the hell are those numbers meaning

提示告诉我们,Where 是由 Morse 电码表示的,并且 Name 是由三种编码构成。

Where

code 的图片告诉我们 2=00=。因此需要将 2 替换为 00 替换为空,再经过 Morse 解码得到结果为 ITEHYBT

Link 的文本是 31067065058056053032033020,看上去就很像 Hex 的文本每两个被看上去就很像空格的 0 隔开。依然遵循先前的 0= 规则:

解码得到结果 1geXVS23,看上去就很像百度网盘的样子,加上 https://pan.baidu.com/s/ 前缀,果然是:

Hint 2

https://tieba.baidu.com/p/4983552973
https://tieba.baidu.com/p/4983552973

根据贴吧的讨论,NameMK0034209038 是由作者的名字 天光逸 经过三种不同的编码方式转换而来。

Name

Name 编码后的文本为 MK0034209038,原文为 天光逸。这里需要沿用 0= 的规则,将 Name 分为三部分:MK03429038

之前我四个一组分成了 MK0034209038,结果发现并非如此(

Part 3

最好解的就是这第三部分。这部分的文本是 9038,对应的是 \u9038

Part 1

下一个攻克的是第一部分。根据仓颉键盘描述,M 代表K 代表,合起来就是天字。

根据这个原理解码 WhereITEHYBT 文本,发现 ITE 代表,但 HYBT 打不出来,倒是 HEBT 能打出字来。

Part 2

这部分的内容是 0342,是中文电码编码后的字。

http://chinesecommercialcode.net/search/index/cn
http://chinesecommercialcode.net/search/index/cn

Password

有了上文 Part2 的解码方法,对 Password 字段进行解码。

Password 的文本是 222502263029340278002984,初步经过 0= 划分后得到五组:

2225
2263
2934
2780
2984

再应用 2=0,得到:

0005
0063
0934
0780
0984

再查询中文电码,得到字符:

0005 = 三
0063 = 五
0934 = 四
0780 = 唉
0984 = 坩

等待,坩是什么?

Hint3

Password(终)

尝试不变换 29842,查询 2984,得到汉字。于是最终的 Password 文本就是:

0005 = 三
0063 = 五
0934 = 四
0780 = 唉
2984 = 死

将其读出后作为提取码输入,得到:

游戏结束ww

结语

宫代

「……!」

我呆在原地,言语尽失。

在这明媚的阳光下,在跑过去用不上数秒的地方。

——『她』就站在那里。

尾上

「…………」

毫无疑问,那正是我以为今生不会再次相见的她。

她用一副不知是该笑、是该哭、还是该生气……看似很迷茫的表情,一直在注视着我。

还有一个没见过的年纪相仿的女孩子站在她的身旁。

为什么……?

宫代

(为什么,会在这里……?)

我无法移开目光,也无法挪动半步。

我们明明近在咫尺,却又隔着无法逾越的距离,只能注视着对方。

宫代

「…………」

就算在听见警察提醒我『必须快点走了』的声音后,我也未能对此作答。

回过神来时,我已握紧了双拳。

少女

「世莉架……?」

尾上

「诶? 怎么了?」

听到了她那让我心生怜爱的声音。

轻风,承载着她的声音吹拂而来。

少女

「一下子这是怎么了? 那是谁?认识的人吗?」

尾上

「…………」

宫代

「…………」

在我和她之间回荡着的是什么样的情感,连我自己也不是很清楚。

只是——她那熟悉的双瞳中所浮现的泪水,清晰地烙印在了我的双目中。

尾上

「——不。是不认识的人」

接着,无声的泪水便洒落而下。

她——在笑着。

身旁的女孩子大概是她的挚友吧,为了不让那名女孩子察觉——她擦拭了眼泪,露出了笑容。

宫代

「…………」

她转过身,背对着我走去。

停止的时间又再次流动,我的脸上也浮现出了笑容。

宫代

「嗯……我也不认识你……」

阳光刺痛了双眼。

我抬头仰望着天空。

为了不让偷偷渗出的泪水落下。

这是开心的泪水。

我相信是这样。也必须这样相信。

——所有的一切,全部,这样就好。

宫代

「对不起,我们走吧」

我向警察这样说道,迈出了脚步。

已经看不见,『她』那远去的身影了。

今生不会再见……。

我们会在绝无交汇的路上走下去……。

——我们就这样,一起走完,彼此的人生

Chaos; Child TE,文本版权归科学社及相关译者所有。


Previous Post
镣铐与舞蹈——个性与共性之迷思
Next Post
IPv4透明代理+IPv6 Passthrough——树莓派单臂软路由折腾记