mirror of
https://github.com/cemu-project/GhidraRPXLoader.git
synced 2024-11-25 18:46:56 +01:00
Get the sections header names before converting the rpl/rpx to elf
This commit is contained in:
parent
92a68e21fc
commit
eba14fb8f5
@ -24,4 +24,18 @@ public class Utils {
|
|||||||
}
|
}
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String stringFromStringTable(byte[] stringTable, int index) {
|
||||||
|
ByteBuffer buf = ByteBuffer.wrap(stringTable);
|
||||||
|
|
||||||
|
int pos = index;
|
||||||
|
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
for (byte b; (b = buf.get(pos)) != 0; pos++) {
|
||||||
|
result.append((char) b);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,28 @@ public class RPXUtils {
|
|||||||
long shdr_elf_offset = elfFile.e_ehsize() & 0xFFFFFFFF;
|
long shdr_elf_offset = elfFile.e_ehsize() & 0xFFFFFFFF;
|
||||||
long shdr_data_elf_offset = shdr_elf_offset + elfFile.e_shnum() * elfFile.e_shentsize();
|
long shdr_data_elf_offset = shdr_elf_offset + elfFile.e_shnum() * elfFile.e_shentsize();
|
||||||
|
|
||||||
|
// Let's get / decompress the section header string table at first.
|
||||||
|
ElfSectionHeader sh_str_sh = elfFile.getSections()[elfFile.e_shstrndx()];
|
||||||
|
byte[] sh_str_sh_data = new byte[0];
|
||||||
|
if (sh_str_sh.getOffset() != 0) {
|
||||||
|
if ((sh_str_sh.getFlags() & SHT_NOBITS) != SHT_NOBITS) {
|
||||||
|
sh_str_sh_data = sh_str_sh.getData();
|
||||||
|
if ((sh_str_sh.getFlags() & SHF_RPL_ZLIB) == SHF_RPL_ZLIB) {
|
||||||
|
long section_size_inflated = ByteBuffer.wrap(Arrays.copyOf(sh_str_sh_data, 4)).getInt()
|
||||||
|
& 0xFFFFFFFF;
|
||||||
|
Inflater inflater = new Inflater();
|
||||||
|
inflater.setInput(sh_str_sh_data, 4, (int) sh_str_sh.getSize() - 4); // the first byte is the size
|
||||||
|
|
||||||
|
byte[] decompressed = new byte[(int) section_size_inflated];
|
||||||
|
|
||||||
|
inflater.inflate(decompressed);
|
||||||
|
inflater.end();
|
||||||
|
|
||||||
|
sh_str_sh_data = decompressed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
long curSymbolAddress = 0x01000000;
|
long curSymbolAddress = 0x01000000;
|
||||||
|
|
||||||
for (ElfSectionHeader h : elfFile.getSections()) {
|
for (ElfSectionHeader h : elfFile.getSections()) {
|
||||||
@ -45,6 +67,7 @@ public class RPXUtils {
|
|||||||
long curSize = h.getSize();
|
long curSize = h.getSize();
|
||||||
long flags = h.getFlags();
|
long flags = h.getFlags();
|
||||||
long offset = h.getOffset();
|
long offset = h.getOffset();
|
||||||
|
String sectionName = Utils.stringFromStringTable(sh_str_sh_data, h.getName());
|
||||||
|
|
||||||
if (offset != 0) {
|
if (offset != 0) {
|
||||||
if ((flags & SHT_NOBITS) != SHT_NOBITS) {
|
if ((flags & SHT_NOBITS) != SHT_NOBITS) {
|
||||||
|
Loading…
Reference in New Issue
Block a user