Improved Debug SELF loader

This commit is contained in:
DH 2013-11-26 07:04:39 +02:00
parent 9ce30fdd74
commit 4fbfc14763

View file

@ -340,47 +340,36 @@ void MainFrame::BootSelf(wxCommandEvent& WXUNUSED(event))
wxString fileOut = ctrl.GetPath()+".elf"; wxString fileOut = ctrl.GetPath()+".elf";
// Check if the data really needs to be decrypted. // Check if the data really needs to be decrypted.
FILE *f; if(!wxFileExists(fileIn))
if((f = fopen(fileIn.mb_str(), "rb")) == NULL)
{ {
ConLog.Error("Could not open SELF file!"); ConLog.Error("Could not open SELF file!");
return; return;
} }
wxFile f(fileIn);
// Get the key version. // Get the key version.
fseek(f, 0x08, SEEK_SET); f.Seek(0x08);
s16 key_version; be_t<u16> key_version;
fread(&key_version, 1, sizeof(key_version), f); f.Read(&key_version, sizeof(key_version));
be_t<u16> key_version_be;
key_version_be.FromLE(key_version);
// Get the real elf offset. if(key_version.ToBE() == const_se_t<u16, 0x8000>::value)
fseek(f, 0x10, SEEK_SET);
s64 elf_offset;
fread(&elf_offset, 1, sizeof(elf_offset), f);
be_t<u64> elf_offset_be;
elf_offset_be.FromLE(elf_offset);
fclose(f);
if(key_version_be.ToBE() == 0x8000)
{ {
ConLog.Warning("Debug SELF detected! Removing fake header..."); ConLog.Warning("Debug SELF detected! Removing fake header...");
FILE *in;
FILE *out; // Get the real elf offset.
in = fopen(fileIn, "rb"); f.Seek(0x10);
out = fopen(fileOut, "wb"); be_t<u64> elf_offset;
f.Read(&elf_offset, sizeof(elf_offset));
// Start at the real elf offset. // Start at the real elf offset.
fseek(in, elf_offset_be.ToBE(), SEEK_SET); f.Seek(elf_offset);
wxFile out(fileOut, wxFile::write);
// Copy the data. // Copy the data.
int c; char buf[2048];
while ((c = fgetc(in)) != EOF) while (ssize_t size = f.Read(buf, 2048))
fputc(c, out); out.Write(buf, size);
fclose(out);
fclose(in);
} }
else else
{ {
@ -391,9 +380,11 @@ void MainFrame::BootSelf(wxCommandEvent& WXUNUSED(event))
} }
} }
Emu.SetPath(ctrl.GetPath()+".elf"); f.Close();
Emu.SetPath(fileOut);
Emu.Load(); Emu.Load();
if (!wxRemoveFile(ctrl.GetPath()+".elf")) if (!wxRemoveFile(fileOut))
ConLog.Warning("Could not delete the decrypted ELF file"); ConLog.Warning("Could not delete the decrypted ELF file");
ConLog.Write("SELF: boot done."); ConLog.Write("SELF: boot done.");