Ejemplo n.º 1
0
        public byte[] GetPackedFile(JMDPackedFileInfo info)
        {
            FileStream fs = new FileStream(Path, FileMode.Open);

            if (info.CryptMode == CryptMode.None)
            {
                JMDStreamInfo streaminfo = this.GetStreamInfo(info.Index);
                fs.Seek(streaminfo.Offset, SeekOrigin.Begin);
                byte[] data = new byte[streaminfo.Size];
                fs.Read(data, 0, data.Length);
                fs.Close();
                return(data);
            }
            else if (info.CryptMode == CryptMode.FullCryption)
            {
                JMDStreamInfo streaminfo = this.GetStreamInfo(info.Index);
                fs.Seek(streaminfo.Offset, SeekOrigin.Begin);
                byte[] data = new byte[streaminfo.Size];
                fs.Read(data, 0, data.Length);
                fs.Close();
                uint key = Crypt.KeyGenerator.GetDataKey(HeaderKey, info);
                data = JMDCrypt.Decrypt(data, key);
                return(data);
            }
            else if (info.CryptMode == CryptMode.PartCryption)
            {
                List <byte>   output     = new List <byte>();
                JMDStreamInfo streaminfo = this.GetStreamInfo(info.Index);
                fs.Seek(streaminfo.Offset, SeekOrigin.Begin);
                byte[] data = new byte[streaminfo.Size];
                fs.Read(data, 0, data.Length);
                uint key = Crypt.KeyGenerator.GetDataKey(HeaderKey, info);
                data = JMDCrypt.Decrypt(data, key);
                output.AddRange(data);
                streaminfo = this.GetStreamInfo(info.Index + 1);
                fs.Seek(streaminfo.Offset, SeekOrigin.Begin);
                data = new byte[streaminfo.Size];
                fs.Read(data, 0, data.Length);
                output.AddRange(data);
                fs.Close();
                return(output.ToArray());
            }
            else
            {
                fs.Close();
                throw new Exception("Unknown CryptMode.");
            }
        }
Ejemplo n.º 2
0
        //AutoClose!!!
        public void ApplyModification(string File)
        {
            string tempS    = "";
            bool   tempMode = false;

            if (Path == File)
            {
                tempS = File;
                string newPath = $"{Path}.temp{DateTime.Now.ToString("yyyyMMddhhmmssffff")}";
                File     = newPath;
                tempMode = true;
            }
            FileStream fs         = new FileStream(File, FileMode.Create);
            FileStream jmdFileOrg = new FileStream(Path, FileMode.Open);

            byte[] headerString   = Encoding.GetEncoding("UTF-16").GetBytes(HeaderString);
            byte[] DescriptString = Encoding.GetEncoding("UTF-16").GetBytes(JMDFile.DescriptString);
            //offset:0x00 size:0x80
            fs.Seek(0, SeekOrigin.Begin);
            fs.Write(headerString, 0, headerString.Length);
            fs.Seek(0x40, SeekOrigin.Begin);
            fs.Write(DescriptString, 0, DescriptString.Length);
            fs.Seek(0x80, SeekOrigin.Begin);
            //FileDataWriter
            byte[] data2;
            int    offset      = GetNextOffset(0, 0x100 + (0x20 * StreamInfos.Count));
            int    firstOffset = offset;

            using (MemoryStream ms = new MemoryStream())
            {
                for (int i = 0; i < StreamInfos.Count; i++)
                {
                    ms.Seek(offset - firstOffset, SeekOrigin.Begin);
                    JMDStreamInfo streamInfo = StreamInfos[i];
                    int           tempOffset = offset;
                    switch (streamInfo.StreamMode)
                    {
                    case StreamMode.JMDFile:
                        if (IsChangedFolder(streamInfo.Index))
                        {
                            IPackedObject[]         objects    = JMDPackedFilesInfoDecoder.GetJMDPackedFileInfos(GetStreamData(streamInfo.Index, jmdFileOrg), this.HeaderKey, this.NowFolder.Index);
                            List <ModifiedFileInfo> needModify = ModifiedFileInfos.FindAll(x => x.FolderIndex == streamInfo.Index);
                            for (int a = 0; a < objects.Length; a++)
                            {
                                int indexAAA = -1;     //20210425현재 캐스팅오류 임시해결
                                if (indexAAA != -1)
                                {
                                    JMDPackedFileInfo objT = objects[a] as JMDPackedFileInfo;
                                    objT.FileSize = (int)needModify[indexAAA].NewFileSize;
                                }
                            }
                            uint   hash = 0;
                            byte[] newD = JMDPackedFilesInfoDecoder.ToByteArray(objects, HeaderKey, out hash);
                            ms.Write(newD, 0, newD.Length);
                            StreamInfos[i].Size  = (uint)newD.Length;
                            StreamInfos[i].Size2 = (uint)newD.Length;
                            StreamInfos[i].Hash  = hash;
                            offset = GetNextOffset(offset, (int)newD.Length);
                        }
                        else
                        {
                            jmdFileOrg.Seek(streamInfo.Offset, SeekOrigin.Begin);
                            byte[] dataT = new byte[streamInfo.Size];
                            jmdFileOrg.Read(dataT, 0, dataT.Length);
                            ms.Write(dataT, 0, dataT.Length);
                            offset = GetNextOffset(offset, (int)dataT.Length);
                        }
                        break;

                    case StreamMode.Local:
                        LocalStreamAddition lsa       = streamInfo.StreamAddition as LocalStreamAddition;
                        FileStream          localFile = new FileStream(lsa.FileName, FileMode.Open);
                        localFile.Seek(lsa.Offset, SeekOrigin.Begin);
                        byte[] dataT2 = new byte[lsa.Length];
                        localFile.Read(dataT2, 0, dataT2.Length);
                        localFile.Close();
                        if (streamInfo.NeedCrypt)
                        {
                            dataT2 = JMDCrypt.Decrypt(dataT2, lsa.Key);
                        }
                        ms.Write(dataT2, 0, dataT2.Length);
                        offset = GetNextOffset(offset, (int)dataT2.Length);
                        break;
                    }
                    StreamInfos[i].Offset = (uint)tempOffset;
                }
                data2 = ms.ToArray();
            }
            //offset:0x80 size:0x80
            byte[] b2 = Header.ToByteArray(HeaderKey);
            fs.Write(b2, 0, b2.Length);
            //offset:0x100 size:?
            foreach (JMDStreamInfo jsi in StreamInfos)
            {
                byte[] atrq = jsi.ToByteArray(Header.StreamInfosKey);
                fs.Write(atrq, 0, atrq.Length);
            }
            //
            fs.Seek(firstOffset, SeekOrigin.Begin);
            fs.Write(data2, 0, data2.Length);
            byte[] zzzzz = new byte[offset - fs.Position];
            fs.Write(zzzzz, 0, zzzzz.Length);
            fs.Close();
            jmdFileOrg.Close();
            //Reload
            if (tempMode)
            {
                Delete(Path);
                FileInfo fi = new FileInfo(File);
                fi.MoveTo(tempS);
                File = tempS;
            }
            Load(File);
        }
Ejemplo n.º 3
0
        //Modify Functions
        //Version 1.1

        public void ModifyDataStream(string FileName, string LocalFile)
        {
            JMDPackedFileInfo fileInfo = (JMDPackedFileInfo)Array.Find(NowFolderContent, x => x.Type == ObjectType.File && ((JMDPackedFileInfo)x).FileName == FileName);

            if (fileInfo == null)
            {
                throw new FileNotFoundException($"File: {FileName} is not found in \"{NowPath}\" folder.");
            }
            int        StreamIndex = StreamInfos.FindIndex(x => x.Index == fileInfo.Index);
            FileStream fs          = new FileStream(LocalFile, FileMode.Open);

            StreamInfos[StreamIndex].StreamMode = StreamMode.Local;
            switch (fileInfo.CryptMode)
            {
            case CryptMode.None:
                StreamInfos[StreamIndex].StreamAddition = new LocalStreamAddition
                {
                    FileName = LocalFile,
                    Key      = 0x00,
                    Length   = (int)fs.Length,
                    Offset   = 0x00
                };
                StreamInfos[StreamIndex].Size  = (uint)fs.Length;
                StreamInfos[StreamIndex].Size2 = (uint)fs.Length;
                break;

            case CryptMode.PartCryption:
                if (fs.Length <= 0x100)
                {
                    throw new NotSupportedException("This mode is not supported now,Sorry.");
                }
                StreamInfos[StreamIndex].StreamAddition = new LocalStreamAddition
                {
                    FileName = LocalFile,
                    Key      = KeyGenerator.GetDataKey(HeaderKey, fileInfo),
                    Length   = 0x100,
                    Offset   = 0x00
                };
                StreamInfos[StreamIndex + 1].StreamAddition = new LocalStreamAddition
                {
                    FileName = LocalFile,
                    Key      = 0x00,
                    Length   = (int)fs.Length - 0x100,
                    Offset   = 0x100
                };
                StreamInfos[StreamIndex].Size           = 0x100;
                StreamInfos[StreamIndex].Size2          = 0x100;
                StreamInfos[StreamIndex + 1].Size       = (uint)fs.Length - 0x100;
                StreamInfos[StreamIndex + 1].Size2      = (uint)fs.Length - 0x100;
                StreamInfos[StreamIndex + 1].StreamMode = StreamMode.Local;
                break;

            case CryptMode.FullCryption:
                StreamInfos[StreamIndex].StreamAddition = new LocalStreamAddition
                {
                    FileName = LocalFile,
                    Key      = KeyGenerator.GetDataKey(HeaderKey, fileInfo),
                    Length   = (int)fs.Length,
                    Offset   = 0x00
                };
                StreamInfos[StreamIndex].Size  = (uint)fs.Length;
                StreamInfos[StreamIndex].Size2 = (uint)fs.Length;
                break;
            }
            ModifiedFileInfos.Add(new ModifiedFileInfo()
            {
                FileIndex   = fileInfo.Index,
                FolderIndex = NowFolder.Index,
                NewFileSize = (uint)fs.Length
            });
            fs.Close();
        }