-
-
Save polaris-/d972d4eccf65967000cd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
○○○○○○○○ | |
(電話だけで、すぐ採用されてしまった) | |
(春はやっぱり人手不足なんだな……) | |
(ファミレス『デキシーズ』●は今日からここで働くんだな……) | |
さて……まずはどうしたら……。 | |
??? | |
いらっしゃいませー。 | |
お客様、おひとりでしょうか? | |
(うわ、キレイな人だな。大人っぽいけど、大学生か? じゃなくて!) | |
どうなさいました? | |
えっと……●、今日からここでバイトを……。 | |
え、あぁ。新人さんね? | |
はい。 | |
こっちに来て。 | |
従業員は、表の入り口から入っちゃダメよ。 | |
すいません……。 | |
ふふ、いいわ。初めてなんだもの。 | |
姉ヶ崎 | |
私は姉ヶ崎 寧々(あねがさき ねね)、よろしくね? | |
▲苗字▲ ▲名前▲です。よろしくお願いします。 | |
私はここでも学校でも、あなたの1年先輩になるのかな? | |
なんで学校……●、転校してきたばかりなんですけど……。 | |
ふふ。ごめんね、店長から聞いたの。私と同じ高校の1年後輩が来るって。 | |
そうだったんですか。 | |
ん~っ……ちょっと他人行儀かな? | |
なにがですか? | |
敬語。たった1歳しか違わないのに、それだとすごく年上扱いされてるみたいで、ちょっと、ね。 | |
すいま……いや、ごめん。ちょっと緊張してて。 | |
うん、それそれ。でも、お客様には敬語だよ? | |
うちのお店、そのあたりは厳しいから。ね? | |
はい……じゃなくて、うん。 | |
ふふ。じゃあ私は戻るから、ここにいて? もうすぐ店長が来るはずだから……。 | |
うん、ありがとう。 | |
ふふ、どういたしまして。 | |
(このバイト、楽しくなりそうだな……) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Decrypt data from New Love Plus and New Love Plus Plus files | |
# Supported file formats: .SBIN2/.DBIN2/.FBIN2 | |
# Unsupported/Unknown file formats: .TBIN2 | |
import os | |
import struct | |
import sys | |
def read_int_be(data): | |
return struct.unpack(">I", data)[0] | |
def decrypt_data(data, data_len): | |
start = 0 | |
if len(data) > 8 and data[0:8] == bytearray("TERMBIN2"): | |
# Is this right? How do you handle .TBIN2 files? | |
start = 4 | |
key = data[start + 0x04: start + 0x07] | |
mul = data[start + 0x07] | |
output = bytearray(data[0x00:0x08 + start]) | |
for i in range(8 + start, data_len): | |
output.append(data[i] ^ ((key[i % 3] + ((i / 3) * mul)) & 0xff)) | |
return output | |
def read_header(data): | |
if data[0:4] != bytearray("SBN2") and data[0:4] != bytearray("DBN2"): | |
print "Not a SBN2 or DBN2 file, attempting to decrypt directly..." | |
return [(0, len(data))] | |
header_pre = decrypt_data(data, 0x10) | |
num_of_entries = read_int_be(header_pre[0x08:0x0c]) | |
header_data = decrypt_data(data, 0x10 + (num_of_entries * 0x10)) | |
files = [] | |
for i in range(0, num_of_entries): | |
offset_start = (0x10 * (i + 1)) + 0x08 | |
offset_end = (0x10 * (i + 1)) + 0x08 + 4 | |
filesize_start = (0x10 * (i + 1)) + 0x0c | |
filesize_end = (0x10 * (i + 1)) + 0x0c + 4 | |
offset = read_int_be(header_data[offset_start:offset_end]) | |
filesize = read_int_be(header_data[filesize_start:filesize_end]) | |
files.append((offset, filesize)) | |
return files | |
def dump_file(data, offset, filesize, output_filename, output_foldername): | |
file_data = decrypt_data(data[offset:offset+filesize], filesize) | |
ext = str(file_data[0:4]).lower() | |
output_filename = "%s.%s" % (output_filename, ext) | |
output_path = os.path.join(output_foldername, output_filename) | |
open(output_path, "wb").write(file_data) | |
def parse_script(filename): | |
data = bytearray(open(filename, "rb").read()) | |
files = read_header(data) | |
output_foldername = os.path.splitext(os.path.basename(filename))[0] | |
if not os.path.exists(output_foldername): | |
os.makedirs(output_foldername) | |
for i in range(0, len(files)): | |
file = files[i] | |
output_filename = "%04d_%08x" % (i, file[0]) | |
dump_file(data, file[0], file[1], output_filename, output_foldername) | |
if __name__ == "__main__": | |
if len(sys.argv) != 2: | |
print "usage: %s input_file" % (sys.argv[0]) | |
exit() | |
parse_script(sys.argv[1]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment