记录某轻小说网站字符混淆解码过程

记录某轻小说网站字符混淆解码过程

最近经常在哔哩轻小说上看书,想做一个爬虫制作成 Epub 文件,在 Apple Books 上阅读,网站html源码整体很好解析,但是文本内容针对特定字符做了替换,需要找到js代码中的字符对照表,才能解密。

js定位

通过阅读网页 html 可以发现文章内容为 id=acontent 的 div 中,所以找一下对这段操作的代码,可以定位到 themes/zhmb/css/jsreadtools.js 中的这段程序:

代码截屏

使用 jsjiami.com 解密后确定这段代码为加密源码

1
['jsjiami.com.v4']["filter"]["constructor"](((['jsjiami.v4'] + [])["constructor"]['fromCharCode']['apply'](null, ... ['split'](/[a-zA-Z]{1,}/))))('jsjiami.com.v4');

利用Claude尝试阅读加密js源码

Claude 2 支持最高 10mb 大小的单个文件上下文,这里我们尝试用它来分析一下这部分代码在做什么:

Claude 2分析

原理分析

通过 utf-8 将操作的 js 代码转换为一串数字,然后每隔两个字符中添加一个字母,这一段字符串就是需要解密的程序。

字符表提取程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def decrypt_string(encrypted_string):
decrypted = ""
num_str = ""

for char in encrypted_string:
if char.isalpha():
if num_str:
num = int(num_str)
if num <= 128:
decrypted += chr(num)
else:
decrypted += str(num)
num_str = ""
else:
num_str += char

return decrypted

decrypted_string = decrypt_string(encode_text)
decoded_string = decrypted_string.encode('utf-8').decode('unicode-escape')

解码后这段程序长这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var h=document.getElementById('acontent').innerHTML;
h=h.replace(new RegExp('8220',"gi"),"12300")
.replace(new RegExp('8221',"gi"),"12301")
.replace(new RegExp('8216',"gi"),"12302")
.replace(new RegExp('8217',"gi"),"12303")
.replace(new RegExp("59404", "gi"), "的")
.replace(new RegExp("59405", "gi"), "一")
.replace(new RegExp("59406", "gi"), "是")
.replace(new RegExp("59398", "gi"), "了")
.replace(new RegExp("59399", "gi"), "我")
.replace(new RegExp("59400", "gi"), "不")
.replace(new RegExp("59407", "gi"), "人")
.replace(new RegExp("59408", "gi"), "在")
...

这里注意下字符的编码,找到字符对照表:

1
2
3
4
5
6
7
8
9
10
11
12
13
['“', '「']
['”', '」']
['‘', '『']
['’', '』']
['\ue80c', '的']
['\ue80d', '一']
['\ue80e', '是']
['\ue806', '了']
['\ue807', '我']
['\ue808', '不']
['\ue80f', '人']
['\ue810', '在']
...

最后每个字符分别检查替换即可。

总结

从难度角度出发,获取解码方式不算难,重点是如何在网页源文件中找到操作的代码。

作者

Khan

发布于

2023-08-20

更新于

2023-12-26

许可协议

评论

关注我的B站主页