Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import pefile
- def skipPastSequence(f, target, bufsize=0):
- match_index = 0
- buf = []
- resbuf = []
- while (match_index < len(target)):
- char = chr(int.from_bytes(f.read(1), "little"))
- if bufsize > 0:
- if len(buf) == bufsize:
- buf.pop(0)
- buf.append(char)
- if char == target[match_index]:
- match_index += 1
- else:
- if bufsize > 0:
- resbuf = buf[::]
- match_index = 0
- return "".join(resbuf) if bufsize > 0 else None
- def readString(offset):
- offset -= 0x400000
- for s in sections:
- if offset >= s['vaddr'] and offset < s['vend']:
- offset = offset - s['vaddr'] + s['paddr']
- break
- buf = ''
- while True:
- if (raw[offset] == 0):
- break
- buf += chr(raw[offset])
- offset += 1
- return buf
- def readSpellData(f, o):
- start = ("\x8b\x45\xec\x8b\x4d\x10\x89\x48\x08\x8b\x45\xec\x8b\x48\x08\x8b" +
- "\x55\xec\x8b\x01\x89\x42\x04\x8b\x45\xec\x8b\x4d\x08\x89\x88\x8c" +
- "\x00\x00\x00\x8b\x55\xec\x8b\x45\x0c\x89\x82\x90\x00\x00\x00")
- skipPastSequence(f, start)
- # Read spell name
- f.read(1)
- nameOffset = int.from_bytes(f.read(4), "little")
- name = readString(nameOffset)
- o.write(name + ',')
- # Read targetting mode
- skipPastSequence(f, "\xc7\x80\x98")
- f.read(3)
- targetting = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(targetting) + ',')
- if (name == "Mononobe's Eighty Sake Cups"):
- # It changes when there are more than 6 cups, ignore that for now
- f.read(71)
- # Read elements
- buf = None
- if (name == "Tradition of Just Rewards"):
- # It changes depending on HP and skills learned, just put all 3 in there tbh
- f.read(220)
- elements = ['MYS', 'SPI', 'DRK']
- else:
- elements = []
- while True:
- buf = list(f.read(7))
- if (buf[5:] == [0xd1, 0xe0]):
- elements += ['WND']
- else:
- buf += list(f.read(1))
- if (buf[5:] == [0x6b, 0xc8, 0x00]):
- elements += ['FIR']
- elif (buf[5:] == [0xc1, 0xe0, 0x00]):
- elements += ['CLD']
- elif (buf[5:] == [0x6b, 0xc8, 0x03]):
- elements += ['NTR']
- elif (buf[5:] == [0xc1, 0xe0, 0x02]):
- elements += ['MYS']
- elif (buf[5:] == [0x6b, 0xc8, 0x05]):
- elements += ['SPI']
- elif (buf[5:] == [0x6b, 0xc8, 0x06]):
- elements += ['DRK']
- elif (buf[5:] == [0x6b, 0xc8, 0x07]):
- elements += ['PHY']
- elif (buf[5:] == [0xc1, 0xe0, 0x03]):
- elements += ['VOI']
- else:
- break
- f.read(14)
- elements = "-".join(elements)
- o.write(elements + ',')
- # Read ATK influence
- if (name == "Youkai Yakuza Kick"):
- # Normal / Skill learned / Reading / Reading + Skill
- f.read(77)
- atk = "150/170/210/230"
- else:
- f.read(1)
- atk = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(atk) + ',')
- # Read MAG influence
- if (name == "Mari's DIY Novice Border"):
- # Only applies from certain level
- f.read(23)
- mag = -16
- elif (name == "The Count of Monte Cristo" or name == "Musketeer d'Artagnan"):
- # Normal / Reading
- f.read(13)
- mag = "120/140"
- else:
- f.read(9)
- mag = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(mag) + ',')
- # Read DEF influence
- f.read(9)
- dfe = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(dfe) + ',')
- # Read MND influence
- f.read(9)
- mnd = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(mnd) + ',')
- # Read T.DEF influence
- f.read(9)
- tdef = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(tdef) + ',')
- # Read T.MND influence
- f.read(9)
- tmnd = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(tmnd) + ',')
- # Read multiplier
- if (name == "Mari's DIY Novice Border"):
- f.read(32)
- multiplier = 100
- elif (name == "Youkai Yakuza Kick"):
- # Normal / Skill learned / Reading / Reading + Skill
- f.read(85)
- multiplier = "150/170/210/230"
- elif (name == "The Count of Monte Cristo" or name == "Musketeer d'Artagnan"):
- # Normal / Reading
- f.read(13)
- multiplier = "120/150"
- else:
- f.read(9)
- multiplier = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(multiplier) + ',')
- # Read accuracy
- f.read(9)
- accuracy = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(accuracy) + ',')
- # Read delay
- if (name == "The Count of Monte Cristo" or name == "Musketeer d'Artagnan"):
- # Normal / Reading
- delay = "4000/7000"
- elif (name == "Non-Neumann Systems"):
- # Normal / Reading
- delay = "3000/5500"
- elif (name == "Selfless Love"):
- delay = "5300+(300*SLv)"
- elif (name == "Hourai Elixir"):
- delay = "3400+(300*SLv)"
- elif (name == "Missing Power"):
- delay = "1500+(500*SLv)"
- else:
- f.read(9)
- delay = int.from_bytes(f.read(4), "little", signed=True)
- o.write(str(delay) + ',')
- # Compute power
- if (name == "Youkai Yakuza Kick"):
- power = "/".join([
- str(round((int(a)*int(m)) / 10000, 2)) for a, m in zip(
- atk.split('/'), multiplier.split('/')
- )
- ])
- elif (name == "The Count of Monte Cristo" or name == "Musketeer d'Artagnan"):
- power = "/".join([
- str(round((int(a)*int(m)) / 10000, 2)) for a, m in zip(
- mag.split('/'), multiplier.split('/')
- )
- ])
- else:
- power = (atk + mag + dfe + mnd) * multiplier / 10000
- power = str(round(power, 2))
- o.write(power + ',')
- # Compute piercing power
- if (tdef + tmnd) == 0:
- pierce = '+inf'
- elif (name == "Youkai Yakuza Kick"):
- pierce = "/".join([
- str(round(int(a) / (tdef + tmnd), 2)) for a in atk.split('/')
- ])
- elif (name == "The Count of Monte Cristo" or name == "Musketeer d'Artagnan"):
- pierce = "/".join([
- str(round(int(a) / (tdef + tmnd), 2)) for a in mag.split('/')
- ])
- else:
- pierce = (atk + mag + dfe + mnd) / (tdef + tmnd)
- pierce = str(round(pierce, 2))
- o.write(pierce + '\n')
- return name
- raw = None
- sections = []
- with open("laby2_1107e.exe", 'rb') as f:
- data = f.read()
- raw = list(data)
- pe = pefile.PE(data=data)
- for s in pe.sections:
- entry = {}
- entry['vaddr'] = s.VirtualAddress
- entry['paddr'] = s.PointerToRawData
- entry['vsize'] = s.Misc_VirtualSize
- entry['psize'] = s.SizeOfRawData
- entry['vend'] = entry['vaddr'] + entry['vsize']
- entry['pend'] = entry['paddr'] + entry['psize']
- sections += [entry]
- with open("laby2_1107e.exe", 'rb') as f:
- with open("spells.csv", 'w', encoding="utf-8") as o:
- f.read(0x5f4b90)
- c = 0
- while True:
- c += 1
- print(readSpellData(f, o), c)
- o.flush()
- print("Done!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement