public PSBAnalyzer(byte[] Script) { var Status = PSBStrMan.GetPackgetStatus(Script); if (Status == PSBStrMan.PackgetStatus.MDF) { Script = PSBStrMan.ExtractMDF(Script); } Status = PSBStrMan.GetPackgetStatus(Script); if (Status != PSBStrMan.PackgetStatus.PSB) { throw new Exception("Bad File Format"); } this.Script = new byte[Script.Length]; Script.CopyTo(this.Script, 0); StringManager = new PSBStrMan(Script) { CompressPackage = true, ForceMaxOffsetLength = ExtendStringLimit }; ByteCodeStart = ReadOffset(this.Script, 0x24, 4); ByteCodeLen = ReadOffset(this.Script, 0x10, 4) - ByteCodeStart; if (ByteCodeLen + ByteCodeStart > Script.Length) { throw new Exception("Corrupted Script"); } }
public FileEntry[] Import(byte[] script) { PSBStrMan.PackgetStatus Status = PSBStrMan.GetPackgetStatus(script); if (Status == PSBStrMan.PackgetStatus.MDF) { script = PSBStrMan.ExtractMDF(script); } Status = PSBStrMan.GetPackgetStatus(script); if (Status != PSBStrMan.PackgetStatus.PSB) { throw new Exception("Bad File Format"); } packget = script; StartPos = PSBStrMan.ReadOffset(packget, 0x20, 4); OffsetPos = PSBStrMan.ReadOffset(packget, 0x18, 4); int[] tmp = GetOffsetInfo(packget, OffsetPos); OffsetSize = tmp[0]; OffsetTablePos = tmp[1]; ResSizePos = PSBStrMan.ReadOffset(packget, 0x1C, 4); tmp = GetOffsetInfo(packget, ResSizePos); ResSizeOffSize = tmp[0]; ResSizeOffTablePos = tmp[1]; int[] Offsets = GetValues(packget, OffsetPos); int[] Sizes = GetValues(packget, ResSizePos); EntryCount = Offsets.Length; FileEntry[] Files = new FileEntry[EntryCount]; for (int i = 0; i < EntryCount; i++) { int EndPos = Offsets[i] + Sizes[i]; byte[] data = new byte[Sizes[i]]; for (int ind = Offsets[i]; ind < EndPos; ind++) { data[ind - Offsets[i]] = packget[ind + StartPos]; } Files[i] = new FileEntry() { Data = data }; } Initialized = true; return(Files); }