You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.4 KiB
C#
87 lines
2.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using DotNetCTFDumper.Utils;
|
|
|
|
namespace DotNetCTFDumper.MMFParser.EXE
|
|
{
|
|
public class PackData
|
|
{
|
|
public List<PackFile> Items = new List<PackFile>();
|
|
public PackData()
|
|
{
|
|
|
|
}
|
|
public void Read(ByteReader exeReader)
|
|
{
|
|
long start = exeReader.Tell();
|
|
byte[] header = exeReader.ReadBytes(8);
|
|
|
|
exeReader.Skip(8);
|
|
uint headerSize = exeReader.ReadUInt32();
|
|
uint dataSize = exeReader.ReadUInt32();
|
|
|
|
exeReader.Seek((int)(start + dataSize - 32));
|
|
exeReader.Skip(4);
|
|
exeReader.Seek(start + 16);
|
|
|
|
uint formatVersion = exeReader.ReadUInt32();
|
|
exeReader.Skip(8);
|
|
|
|
uint count = exeReader.ReadUInt32();
|
|
|
|
Logger.Log($"Found {count} Pack Files:", true, ConsoleColor.Blue);
|
|
|
|
long offset = exeReader.Tell();
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
if (!exeReader.Check(2)) break;
|
|
UInt16 value = exeReader.ReadUInt16();
|
|
if (!exeReader.Check(value)) break;
|
|
exeReader.ReadBytes(value);
|
|
exeReader.Skip(value);
|
|
if (!exeReader.Check(value)) break;
|
|
}
|
|
|
|
header = exeReader.ReadFourCc();
|
|
|
|
exeReader.Seek(offset);
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
var item = new PackFile();
|
|
item.Read(exeReader);
|
|
Items.Add(item);
|
|
|
|
}
|
|
|
|
Logger.Log("\nPackdata Done\n", true, ConsoleColor.Blue);
|
|
|
|
}
|
|
|
|
}
|
|
public class PackFile
|
|
{
|
|
public string PackFilename = "ERROR";
|
|
int _bingo = 0;
|
|
public byte[] Data;
|
|
|
|
public void Read(ByteReader exeReader)
|
|
{
|
|
UInt16 len = exeReader.ReadUInt16();
|
|
PackFilename = exeReader.ReadWideString(len);
|
|
_bingo = exeReader.ReadInt32();
|
|
Data = exeReader.ReadBytes(exeReader.ReadInt32());
|
|
|
|
//Dump();
|
|
}
|
|
public void Dump(string path = "[DEFAULT-PATH]")
|
|
{
|
|
Logger.Log($"Dumping {PackFilename}", true, ConsoleColor.DarkBlue);
|
|
var actualPath = path=="[DEFAULT-PATH]" ? ($"{Settings.ExtensionPath}\\{PackFilename}"):path;
|
|
File.WriteAllBytes(actualPath, Data);
|
|
}
|
|
|
|
}
|
|
|
|
}
|