mirror of
https://silica.codes/BedrockReverse/McTools.git
synced 2025-05-23 03:26:25 +12:00
Add world decrypt // and package addons to .mcaddon
This commit is contained in:
parent
a441bfe929
commit
b67526b2cc
15 changed files with 565 additions and 125 deletions
|
@ -12,8 +12,6 @@ namespace McCrypt
|
|||
public class Marketplace
|
||||
{
|
||||
// Hi mojang <3
|
||||
// https://www.youtube.com/watch?v=jIM6dN3ogbk
|
||||
// https://www.youtube.com/watch?v=mnnYCJNhw7w
|
||||
|
||||
private static string[] dontEncrypt = new string[] { "manifest.json", "contents.json", "texts", "pack_icon.png", "ui"};
|
||||
private struct contentsJson
|
||||
|
@ -58,6 +56,37 @@ namespace McCrypt
|
|||
}
|
||||
}
|
||||
|
||||
// check if prid tag is present in a world
|
||||
// can be used to check if its encrypted.
|
||||
public static bool IsLevelEncrypted(string levelPath)
|
||||
{
|
||||
string ldbPath = Path.Combine(levelPath, "db");
|
||||
if (!Directory.Exists(ldbPath)) return false;
|
||||
|
||||
string[] ldbFiles = Directory.GetFiles(ldbPath, "*.ldb", SearchOption.TopDirectoryOnly);
|
||||
foreach (string ldbFile in ldbFiles)
|
||||
{
|
||||
string file = Path.Combine(ldbPath, ldbFile);
|
||||
using (FileStream fs = File.OpenRead(file)) // Open file for reading
|
||||
{
|
||||
using (BinaryReader br = new BinaryReader(fs)) // Create a binary reader overlay of it
|
||||
{
|
||||
|
||||
if (fs.Length <= 0x10)
|
||||
continue;
|
||||
|
||||
uint version = br.ReadUInt32();
|
||||
uint magic = br.ReadUInt32();
|
||||
UInt64 unk = br.ReadUInt64();
|
||||
|
||||
if (version == 0 && magic == 0x9bcfb9fc) // is valid header?
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Change all skins type to "free" instead of "paid"
|
||||
// This makes the game let you actually apply them
|
||||
public static void CrackSkinsJson(string skinsJsonFile)
|
||||
|
@ -160,54 +189,53 @@ namespace McCrypt
|
|||
// For the file types that have a header-
|
||||
private static byte[] worldOrContentsJsonDecrypt(string file)
|
||||
{
|
||||
FileStream fs = File.OpenRead(file); // Open file for reading
|
||||
BinaryReader br = new BinaryReader(fs); // Create a binary reader overlay of it
|
||||
using (FileStream fs = File.OpenRead(file))
|
||||
{ // Open file for reading
|
||||
using (BinaryReader br = new BinaryReader(fs))
|
||||
{
|
||||
// Create a binary reader overlay of it
|
||||
|
||||
if (fs.Length <= 0)
|
||||
{
|
||||
fs.Dispose();
|
||||
return new byte[0] { };
|
||||
}
|
||||
if (fs.Length <= 0)
|
||||
return new byte[0] { };
|
||||
|
||||
uint version = br.ReadUInt32();
|
||||
uint magic = br.ReadUInt32();
|
||||
UInt64 unk = br.ReadUInt64();
|
||||
uint version = br.ReadUInt32();
|
||||
uint magic = br.ReadUInt32();
|
||||
UInt64 unk = br.ReadUInt64();
|
||||
|
||||
if (version == 0 && magic == 0x9bcfb9fc) // is valid header?
|
||||
{
|
||||
if (version == 0 && magic == 0x9bcfb9fc) // is valid header?
|
||||
{
|
||||
|
||||
int len = fs.ReadByte();
|
||||
string uuid = Utils.ReadString(fs, len); // Read the pack UUID for this file
|
||||
byte[] key = Keys.LookupKey(uuid); // Look for key inside .ent / keys.db
|
||||
int len = fs.ReadByte();
|
||||
string uuid = Utils.ReadString(fs, len); // Read the pack UUID for this file
|
||||
byte[] key = Keys.LookupKey(uuid); // Look for key inside .ent / keys.db
|
||||
|
||||
|
||||
if (key == null)
|
||||
key = Encoding.UTF8.GetBytes("s5s5ejuDru4uchuF2drUFuthaspAbepE"); // Generic skinpack key
|
||||
// Every skinpack has the same key lol
|
||||
// This might be wrong, but hey! if it works, it works :D
|
||||
fs.Seek(0x100, SeekOrigin.Begin); // Read ciphertext
|
||||
byte[] ciphertext = new byte[fs.Length - 0x100];
|
||||
fs.Read(ciphertext, 0x00, ciphertext.Length);
|
||||
if (key == null)
|
||||
key = Encoding.UTF8.GetBytes("s5s5ejuDru4uchuF2drUFuthaspAbepE"); // Generic skinpack key
|
||||
// Every skinpack has the same key lol
|
||||
// This might be wrong, but hey! if it works, it works :D
|
||||
fs.Seek(0x100, SeekOrigin.Begin); // Read ciphertext
|
||||
byte[] ciphertext = new byte[fs.Length - 0x100];
|
||||
fs.Read(ciphertext, 0x00, ciphertext.Length);
|
||||
|
||||
|
||||
byte[] iv = new byte[16]; // Copy first 16 bytes of Key for IV
|
||||
Array.Copy(key, iv, iv.Length);
|
||||
byte[] iv = new byte[16]; // Copy first 16 bytes of Key for IV
|
||||
Array.Copy(key, iv, iv.Length);
|
||||
|
||||
byte[] plaintext = Crypto.Aes256CfbDecrypt(key, iv, ciphertext); // Decrypt data
|
||||
byte[] plaintext = Crypto.Aes256CfbDecrypt(key, iv, ciphertext); // Decrypt data
|
||||
|
||||
fs.Dispose();
|
||||
return plaintext;
|
||||
return plaintext;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
fs.Dispose();
|
||||
throw new InvalidDataException("Not a valid LEVELDB or CONTENTS.JSON file.");
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new InvalidDataException("Not a valid LEVELDB or CONTENTS.JSON file.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Read contents.json, and decrypt all files inside
|
||||
// Now Multi-Threaded for speed!
|
||||
private static void decryptContentsJsonFiles(string contentsJsonPath, List<Thread> threadList)
|
||||
|
@ -239,8 +267,9 @@ namespace McCrypt
|
|||
File.WriteAllBytes(filePath, plainText); // Write back decrypted filie
|
||||
});
|
||||
thrd.Priority = ThreadPriority.Highest;
|
||||
threadList.Add(thrd);
|
||||
thrd.Start();
|
||||
if (!Config.MultiThread) thrd.Join();
|
||||
else threadList.Add(thrd);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -311,13 +340,12 @@ namespace McCrypt
|
|||
File.WriteAllBytes(fileToDecrypt, decryptedData); // Write to disk
|
||||
}
|
||||
catch (InvalidDataException)
|
||||
{
|
||||
Console.Error.WriteLine("Failed to decrypt db/" + Path.GetFileName(levelDbFile));
|
||||
}
|
||||
{ }
|
||||
});
|
||||
thrd.Priority = ThreadPriority.Highest;
|
||||
threadList.Add(thrd);
|
||||
thrd.Start();
|
||||
if (!Config.MultiThread) thrd.Join();
|
||||
else threadList.Add(thrd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue