Skip to content

Instantly share code, notes, and snippets.

@polaris-
Last active November 26, 2015 00:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save polaris-/d972d4eccf65967000cd to your computer and use it in GitHub Desktop.
Save polaris-/d972d4eccf65967000cd to your computer and use it in GitHub Desktop.
○○○○○○○○
(電話だけで、すぐ採用されてしまった)
(春はやっぱり人手不足なんだな……)
(ファミレス『デキシーズ』●は今日からここで働くんだな……)
さて……まずはどうしたら……。
???
いらっしゃいませー。
お客様、おひとりでしょうか?
(うわ、キレイな人だな。大人っぽいけど、大学生か? じゃなくて!)
どうなさいました?
えっと……●、今日からここでバイトを……。
え、あぁ。新人さんね?
はい。
こっちに来て。
従業員は、表の入り口から入っちゃダメよ。
すいません……。
ふふ、いいわ。初めてなんだもの。
姉ヶ崎
私は姉ヶ崎 寧々(あねがさき ねね)、よろしくね?
▲苗字▲ ▲名前▲です。よろしくお願いします。
私はここでも学校でも、あなたの1年先輩になるのかな?
なんで学校……●、転校してきたばかりなんですけど……。
ふふ。ごめんね、店長から聞いたの。私と同じ高校の1年後輩が来るって。
そうだったんですか。
ん~っ……ちょっと他人行儀かな?
なにがですか?
敬語。たった1歳しか違わないのに、それだとすごく年上扱いされてるみたいで、ちょっと、ね。
すいま……いや、ごめん。ちょっと緊張してて。
うん、それそれ。でも、お客様には敬語だよ?
うちのお店、そのあたりは厳しいから。ね?
はい……じゃなくて、うん。
ふふ。じゃあ私は戻るから、ここにいて? もうすぐ店長が来るはずだから……。
うん、ありがとう。
ふふ、どういたしまして。
(このバイト、楽しくなりそうだな……)
# 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