mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-18 00:13:10 +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)
|
||||
{
|
||||
// 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);
|
||||
SaveGame = new PKX.Structures.SaveGame(GameType);
|
||||
savegame_oras = oras;
|
||||
|
|
Loading…
Reference in a new issue