mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-18 08:23:12 +00:00
XORpad detection for powersave files.
No current solution for the easy creation of xorpads; thankfully SciresM has that covered with another mini-tool!
This commit is contained in:
parent
5c345848e1
commit
f73b6a668c
1 changed files with 48 additions and 0 deletions
|
@ -556,6 +556,54 @@ namespace PKHeX
|
||||||
}
|
}
|
||||||
private void open1MB(byte[] input, string path, string GameType, bool oras)
|
private void open1MB(byte[] input, string path, string GameType, bool oras)
|
||||||
{
|
{
|
||||||
|
// Detection of stored Decryption XORpads:
|
||||||
|
if (ModifierKeys != Keys.Control) // Allow bypass via control key.
|
||||||
|
{
|
||||||
|
byte[] savID = new byte[0x10]; Array.Copy(input, 0x20, savID, 0, 0x10);
|
||||||
|
ulong ident = BitConverter.ToUInt64(savID, 0x0);
|
||||||
|
string exepath = System.Windows.Forms.Application.StartupPath;
|
||||||
|
string checkpath = exepath.Clone().ToString();
|
||||||
|
|
||||||
|
check:
|
||||||
|
{
|
||||||
|
string[] XORpads = Directory.GetFiles(checkpath);
|
||||||
|
for (int i = 0; i < XORpads.Length; i++)
|
||||||
|
{
|
||||||
|
FileInfo fi = new FileInfo(XORpads[i]);
|
||||||
|
if (fi.Extension == ".xorpad" && (fi.Length == 0x65610 || fi.Length == 0x76010))
|
||||||
|
{
|
||||||
|
byte[] data = File.ReadAllBytes(XORpads[i]);
|
||||||
|
if (BitConverter.ToUInt64(data, 0) == ident) // we match our cart ident.
|
||||||
|
{
|
||||||
|
// Set up faux Cyber Save
|
||||||
|
int length = (int)fi.Length - 0x10;
|
||||||
|
byte[] decryptedPS = new byte[length];
|
||||||
|
Array.Copy(input, 0x5400, decryptedPS, 0, length);
|
||||||
|
for (int z = 0; z < length; z++)
|
||||||
|
decryptedPS[z] ^= data[z + 0x10];
|
||||||
|
|
||||||
|
// Weakly check the validity of the decrypted content
|
||||||
|
if (BitConverter.ToUInt32(decryptedPS, length - 0x1F0) != 0x42454546)
|
||||||
|
continue; // If the XORpad doesn't decrypt properly, we keep checking.
|
||||||
|
oras = (length == 0x76000);
|
||||||
|
GameType = oras ? "ORAS" : "XY";
|
||||||
|
|
||||||
|
// Save file is now decrypted!
|
||||||
|
openMAIN(decryptedPS, path, GameType, oras);
|
||||||
|
// Abort the opening of a non-cyber file.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// End file check loop, if xorpads folder path exists, check there too.
|
||||||
|
if (checkpath == exepath && Directory.Exists(Path.Combine(exepath, "xorpads")))
|
||||||
|
{
|
||||||
|
checkpath = Path.Combine(exepath, "xorpads");
|
||||||
|
goto check;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
L_Save.Text = "SAV: " + Path.GetFileName(path);
|
L_Save.Text = "SAV: " + Path.GetFileName(path);
|
||||||
SaveGame = new PKX.Structures.SaveGame(GameType);
|
SaveGame = new PKX.Structures.SaveGame(GameType);
|
||||||
savegame_oras = oras;
|
savegame_oras = oras;
|
||||||
|
|
Loading…
Reference in a new issue