예제 #1
0
        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");
            }
        }
예제 #2
0
        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);
        }