ELF: Add ability to fetch exports with GetExports()

This commit is contained in:
Katy Coe
2020-07-18 16:07:59 +02:00
parent 7209fa74a5
commit 67b979cd05
2 changed files with 23 additions and 5 deletions

View File

@@ -130,6 +130,9 @@ namespace Il2CppInspector
private TPHdr getProgramHeader(Elf programIndex) => program_header_table.FirstOrDefault(x => x.p_type == (uint) programIndex); private TPHdr getProgramHeader(Elf programIndex) => program_header_table.FirstOrDefault(x => x.p_type == (uint) programIndex);
private elf_dynamic<TWord> getDynamic(Elf dynamicIndex) => dynamic_table?.FirstOrDefault(x => (Elf) conv.ULong(x.d_tag) == dynamicIndex); private elf_dynamic<TWord> getDynamic(Elf dynamicIndex) => dynamic_table?.FirstOrDefault(x => (Elf) conv.ULong(x.d_tag) == dynamicIndex);
private Dictionary<string, ulong> symbolTable = new Dictionary<string, ulong>();
private List<Export> exports = new List<Export>();
protected abstract Elf ArchClass { get; } protected abstract Elf ArchClass { get; }
protected abstract void Write(BinaryWriter writer, TWord value); protected abstract void Write(BinaryWriter writer, TWord value);
@@ -284,6 +287,9 @@ namespace Il2CppInspector
throw new InvalidOperationException("This IL2CPP binary is packed in a way not currently supported by Il2CppInspector and cannot be loaded."); throw new InvalidOperationException("This IL2CPP binary is packed in a way not currently supported by Il2CppInspector and cannot be loaded.");
} }
// Build symbol and export tables
processSymbols();
return true; return true;
} }
@@ -301,7 +307,10 @@ namespace Il2CppInspector
xorRange(conv.Int(section.sh_offset), conv.Int(section.sh_size), xorValue); xorRange(conv.Int(section.sh_offset), conv.Int(section.sh_size), xorValue);
} }
public override Dictionary<string, ulong> GetSymbolTable() { public override Dictionary<string, ulong> GetSymbolTable() => symbolTable;
public override IEnumerable<Export> GetExports() => exports;
private void processSymbols() {
// Three possible symbol tables in ELF files // Three possible symbol tables in ELF files
var pTables = new List<(TWord offset, TWord count, TWord strings)>(); var pTables = new List<(TWord offset, TWord count, TWord strings)>();
@@ -337,7 +346,8 @@ namespace Il2CppInspector
} }
// Now iterate through all of the symbol and string tables we found to build a full list // Now iterate through all of the symbol and string tables we found to build a full list
var symbolTable = new Dictionary<string, ulong>(); symbolTable.Clear();
var exportTable = new Dictionary<string, Export>();
foreach (var pTab in pTables) { foreach (var pTab in pTables) {
var symbol_table = ReadArray<TSym>(conv.Long(pTab.offset), conv.Int(pTab.count)); var symbol_table = ReadArray<TSym>(conv.Long(pTab.offset), conv.Int(pTab.count));
@@ -347,10 +357,12 @@ namespace Il2CppInspector
// Avoid duplicates // Avoid duplicates
symbolTable.TryAdd(name, conv.ULong(symbol.st_value)); symbolTable.TryAdd(name, conv.ULong(symbol.st_value));
if (symbol.st_shndx != (ushort) Elf.SHN_UNDEF)
exportTable.TryAdd(name, new Export {Name = name, VirtualAddress = conv.ULong(symbol.st_value)});
} }
} }
return symbolTable; exports = exportTable.Values.ToList();
} }
public override uint[] GetFunctionTable() { public override uint[] GetFunctionTable() {

View File

@@ -42,6 +42,9 @@ namespace Il2CppInspector
SHT_REL = 9, SHT_REL = 9,
SHT_DYNSYM = 11, SHT_DYNSYM = 11,
// SHNs
SHN_UNDEF = 0,
// dynamic sections // dynamic sections
DT_STRTAB = 5, DT_STRTAB = 5,
DT_SYMTAB = 6, DT_SYMTAB = 6,
@@ -187,30 +190,33 @@ namespace Il2CppInspector
{ {
uint st_name { get; } uint st_name { get; }
TWord st_value { get; } TWord st_value { get; }
ushort st_shndx { get; }
} }
internal class elf_32_sym : Ielf_sym<uint> internal class elf_32_sym : Ielf_sym<uint>
{ {
public uint st_name => f_st_name; public uint st_name => f_st_name;
public uint st_value => f_st_value; public uint st_value => f_st_value;
public ushort st_shndx => f_st_shndx;
public uint f_st_name; public uint f_st_name;
public uint f_st_value; public uint f_st_value;
public uint st_size; public uint st_size;
public byte st_info; public byte st_info;
public byte st_other; public byte st_other;
public ushort st_shndx; public ushort f_st_shndx;
} }
internal class elf_64_sym : Ielf_sym<ulong> internal class elf_64_sym : Ielf_sym<ulong>
{ {
public uint st_name => f_st_name; public uint st_name => f_st_name;
public ulong st_value => f_st_value; public ulong st_value => f_st_value;
public ushort st_shndx => f_st_shndx;
public uint f_st_name; public uint f_st_name;
public byte st_info; public byte st_info;
public byte st_other; public byte st_other;
public ushort st_shndx; public ushort f_st_shndx;
public ulong f_st_value; public ulong f_st_value;
public ulong st_size; public ulong st_size;
} }