篠原 えみり (しのはら えみり) CV:Raica

和男主角再会的青梅竹马。
性格天神浪漫,纯真无垢,也很想得开。
从小就一直梦想这成为男主角的新娘。
一心一意,但是又很害羞,H方面基本毫无知识,不过一旦下了决心,就会很大胆。
喜欢做点心,想要开蛋糕店。
永井 智也 (ながい ともや)
平凡的男生,本作的男主角。
在班上被忘名字的次数可以算是NO.1了,各种意义上看都是存在感稀薄的少年。
实际上纤细而温柔,长相也不算很糟。
但是性格并不有趣,体育也不算出众,因此从不被女生所理睬。
偶尔会被一些人说恶心。
所属园艺部,喜欢种蔬菜。
喜欢朴素的工作,他做的菜简直可以称得上绝品。
遠藤 正文 (えんどう まさふみ)
智也的朋友。
在智也看起来他完全就不是一类人,但却总是找上门和智也聊天。
动画・特摄宅,常参加comiket,很耿直。
讨厌学习,成绩经常亮红灯。
小林 祐里 (こばやし ゆり) CV:桜華
綾辻果歩的好友,和男主角不同班。
实际上和遠藤正文是宅友,不过为了隐藏自己的宅身份,当众没和他很亲密。
长相秀美,头脑也很灵活,不过她属于那种没兴趣就不干的类型,成绩很糟糕。
爱憎分明,因此有时和班上人相处不好。
图片鉴赏:



really bad
现有的补丁问题都太多了😂,也可能是我电脑的问题 每次 勾选 伪造ui 就会打不开游戏
所以有没有兄弟重新翻一下😀,现有的补丁都是有单个字节,一遇到就会导致整个句子乱码,
研究半天原来是这个JB会社在 第二字节的秘钥 是在 第一字节秘钥 的 基础上 加上 0xd 再异或,而第一字节是直接异或秘钥,进游戏(不转区)的看文本都时候第一字节是已经解密了的,第二字节多余解密导致乱码,所以下面的脚本是反加密,即使不转区也不会出现大部分乱码,除非你句子中有单字节的字符
import♀struct
def♀find_all_occurrences(data,♀pattern):
♀♀♀♀"""查找二进制数据中所有匹配模式的起始位置"""
♀♀♀♀positions♀=♀[]
♀♀♀♀start♀=♀0
♀♀♀♀while♀True:
♀♀♀♀♀♀♀♀pos♀=♀data.find(pattern,♀start)
♀♀♀♀♀♀♀♀if♀pos♀==♀-1:
♀♀♀♀♀♀♀♀♀♀♀♀break
♀♀♀♀♀♀♀♀positions.append(pos)
♀♀♀♀♀♀♀♀start♀=♀pos♀+♀1♀♀#♀继续向后查找
♀♀♀♀return♀positions
def♀rot_right_bulk(block:♀bytes,♀bits:♀int,♀xor_val:♀int):
♀♀♀♀"""批量处理字节旋转和异或"""
♀♀♀♀#♀创建预处理的查找表♀(256种可能的字节值)
♀♀♀♀table♀=♀bytearray([
♀♀♀♀♀♀♀♀((byte♀>>♀bits)♀|♀((byte♀<<♀(8♀-♀bits))♀&♀0xFF))♀^♀xor_val
♀♀♀♀♀♀♀♀for♀byte♀in♀range(256)
♀♀♀♀])
♀♀♀♀return♀bytes(table[b]♀for♀b♀in♀block)
def♀xor_decrypt(data,♀key):
♀♀♀♀"""
♀♀♀♀使用异或操作解密数据
♀♀♀♀Args:
♀♀♀♀♀♀♀♀data:♀要解密的字节数据
♀♀♀♀♀♀♀♀key:♀密钥字节,可以是任意长度
♀♀♀♀Returns:
♀♀♀♀♀♀♀♀解密后的字节数据
♀♀♀♀"""
♀♀♀♀if♀not♀data:
♀♀♀♀♀♀♀♀return♀b''
♀♀♀♀if♀not♀key:
♀♀♀♀♀♀♀♀raise♀ValueError("密钥不能为空")
♀♀♀♀#♀确保key是bytes类型
♀♀♀♀if♀isinstance(key,♀int):
♀♀♀♀♀♀♀♀key♀=♀bytes([key])
♀♀♀♀elif♀not♀isinstance(key,♀bytes):
♀♀♀♀♀♀♀♀key♀=♀str(key).encode('utf-8')
♀♀♀♀key_length♀=♀len(key)
♀♀♀♀#♀使用列表推导式进行异或解密
♀♀♀♀decrypted♀=♀bytes(data[i]♀^♀key[i♀%♀key_length]♀for♀i♀in♀range(len(data)))
♀♀♀♀return♀decrypted
def♀start(arc='Arc04.dat.old'):
♀♀♀♀try:
♀♀♀♀♀♀♀♀fb♀=♀open(arc,♀'rb')
♀♀♀♀♀♀♀♀b♀=♀fb.read()
♀♀♀♀except:
♀♀♀♀♀♀♀♀fb♀=♀open('Arc04.dat',♀'rb')
♀♀♀♀♀♀♀♀b♀=♀fb.read()
♀♀♀♀♀♀♀♀fb.close()
♀♀♀♀♀♀♀♀fold♀=♀open(arc,♀'wb')
♀♀♀♀♀♀♀♀fold♀.write(b)
♀♀♀♀♀♀♀♀fold.close()
♀♀♀♀♀♀♀♀fb♀=♀open(arc,♀'rb')
♀♀♀♀♀♀♀♀b♀=♀fb.read()
♀♀♀♀#♀查找所有匹配位置
♀♀♀♀pattern♀=♀b'\x00\x00\x00\x53'
♀♀♀♀positions♀=♀find_all_occurrences(b,♀pattern)
♀♀♀♀#♀可选:将文件内容写入新文件(根据你的需求)
♀♀♀♀new♀=♀'new'
♀♀♀♀fa♀=♀open(arc.replace('.old','')♀+♀'',♀'wb')
♀♀♀♀fa.write(b)
♀♀♀♀#♀输出所有位置(十六进制)
♀♀♀♀for♀pos♀in♀positions:
♀♀♀♀♀♀♀♀fb.seek(pos)
♀♀♀♀♀♀♀♀#♀print(fb.read(4))
♀♀♀♀♀♀♀♀fb.read(4)
♀♀♀♀♀♀♀♀size♀=♀fb.read(4)
♀♀♀♀♀♀♀♀key♀=♀size[0]
♀♀♀♀♀♀♀♀size♀=♀struct.unpack('i',size)[0]
♀♀♀♀♀♀♀♀#♀print('pos♀'+hex(pos).replace('0x','')+'h','size♀'+hex(size))
♀♀♀♀♀♀♀♀fb.seek(pos♀+♀4♀+♀size♀+♀3)
♀♀♀♀♀♀♀♀fe♀=♀fb.read(1)
♀♀♀♀♀♀♀♀fe♀=♀struct.unpack('B',♀fe)[0]
♀♀♀♀♀♀♀♀print(hex(fe),'->',hex(fe^size))
♀♀♀♀♀♀♀♀if♀fe^size!=0xfe:
♀♀♀♀♀♀♀♀♀♀♀♀continue
♀♀♀♀♀♀♀♀fb.seek(pos♀+♀4♀+♀4)
♀♀♀♀♀♀♀♀data♀=♀fb.read(size-1)
♀♀♀♀♀♀♀♀#♀data♀=♀rot_right_bulk(data,0,size)
♀♀♀♀♀♀♀♀fb.seek(pos+4)
♀♀♀♀♀♀♀♀key♀=♀fb.read(1)
♀♀♀♀♀♀♀♀key♀=♀((size+0xd)♀^♀size)&0XFF
♀♀♀♀♀♀♀♀key♀=♀struct.pack('B',key)
♀♀♀♀♀♀♀♀key♀=♀b'\x00'♀+♀key
♀♀♀♀♀♀♀♀data♀=♀xor_decrypt(data,key)
♀♀♀♀♀♀♀♀fa.seek(pos♀+♀4♀+♀4)
♀♀♀♀♀♀♀♀fa.write(data)
♀♀♀♀fa.close()
♀♀♀♀fb.close()
♀♀♀♀return♀positions♀♀#♀返回所有位置的列表
#♀调用函数并获取所有位置
all_positions♀=♀start()
#♀print("所有位置:",♀[hex(pos)♀for♀pos♀in♀all_positions])