IL2CPP: Change metadata and binary to derive from BinaryObjectStream
This commit is contained in:
@@ -13,9 +13,9 @@ namespace Il2CppInspector
|
||||
{
|
||||
internal class Il2CppBinaryARM : Il2CppBinary
|
||||
{
|
||||
public Il2CppBinaryARM(IFileFormatReader stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
public Il2CppBinaryARM(IFileFormatStream stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
|
||||
public Il2CppBinaryARM(IFileFormatReader stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
public Il2CppBinaryARM(IFileFormatStream stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
: base(stream, codeRegistration, metadataRegistration, statusCallback) { }
|
||||
|
||||
// ARMv7-A Architecture Reference Manual: https://static.docs.arm.com/ddi0406/c/DDI0406C_C_arm_architecture_reference_manual.pdf
|
||||
@@ -67,7 +67,7 @@ namespace Il2CppInspector
|
||||
}
|
||||
|
||||
// Section 3.1
|
||||
private uint getNextThumbInstruction(IFileFormatReader image) {
|
||||
private uint getNextThumbInstruction(IFileFormatStream image) {
|
||||
// Assume 16-bit
|
||||
uint inst = image.ReadUInt16();
|
||||
|
||||
@@ -123,7 +123,7 @@ namespace Il2CppInspector
|
||||
private bool isBW(uint inst) => inst.Bits(27, 5) == 0b11110 && inst.Bits(14, 2) == 0b10 && inst.Bits(12, 1) == 1;
|
||||
|
||||
// Sweep a Thumb function and return the register values at the end (register number => value)
|
||||
private Dictionary<uint, uint> sweepThumbForAddressLoads(List<uint> func, uint baseAddress, IFileFormatReader image) {
|
||||
private Dictionary<uint, uint> sweepThumbForAddressLoads(List<uint> func, uint baseAddress, IFileFormatStream image) {
|
||||
// List of registers and addresses loaded into them
|
||||
var regs = new Dictionary<uint, uint>();
|
||||
|
||||
@@ -200,7 +200,7 @@ namespace Il2CppInspector
|
||||
}
|
||||
|
||||
// Get a Thumb function that ends in B.W
|
||||
private List<uint> getThumbFunctionAtFileOffset(IFileFormatReader image, uint loc, uint maxLength) {
|
||||
private List<uint> getThumbFunctionAtFileOffset(IFileFormatStream image, uint loc, uint maxLength) {
|
||||
// Read a function that ends in a hard branch (B.W) or exceeds maxLength instructions
|
||||
var func = new List<uint>();
|
||||
uint inst;
|
||||
@@ -215,7 +215,7 @@ namespace Il2CppInspector
|
||||
return func;
|
||||
}
|
||||
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatReader image, uint loc) {
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc) {
|
||||
// Assembly bytes to search for at start of each function
|
||||
ulong metadataRegistration, codeRegistration;
|
||||
|
||||
@@ -264,7 +264,7 @@ namespace Il2CppInspector
|
||||
// - B
|
||||
// R0 = CodeRegistration, R1 = MetadataRegistration, R2 = Il2CppCodeGenOptions
|
||||
|
||||
var insts = image.Stream.ReadArray<uint>(pCgr, 10); // 7 instructions + 3 pointers
|
||||
var insts = image.ReadArray<uint>(pCgr, 10); // 7 instructions + 3 pointers
|
||||
var ldrOffsets = new uint[3];
|
||||
var pointers = new uint[3];
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@ namespace Il2CppInspector
|
||||
// A64 ISA reference: https://static.docs.arm.com/ddi0596/a/DDI_0596_ARM_a64_instruction_set_architecture.pdf
|
||||
internal class Il2CppBinaryARM64 : Il2CppBinary
|
||||
{
|
||||
public Il2CppBinaryARM64(IFileFormatReader stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
public Il2CppBinaryARM64(IFileFormatStream stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
|
||||
public Il2CppBinaryARM64(IFileFormatReader stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
public Il2CppBinaryARM64(IFileFormatStream stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
: base(stream, codeRegistration, metadataRegistration, statusCallback) { }
|
||||
|
||||
private (uint reg, ulong page)? getAdrp(uint inst, ulong pc) {
|
||||
@@ -70,7 +70,7 @@ namespace Il2CppInspector
|
||||
|
||||
private bool isB(uint inst) => inst.Bits(26, 6) == 0b_000101;
|
||||
|
||||
private Dictionary<uint, ulong> sweepForAddressLoads(List<uint> func, ulong baseAddress, IFileFormatReader image) {
|
||||
private Dictionary<uint, ulong> sweepForAddressLoads(List<uint> func, ulong baseAddress, IFileFormatStream image) {
|
||||
// List of registers and addresses loaded into them
|
||||
var regs = new Dictionary<uint, ulong>();
|
||||
|
||||
@@ -118,7 +118,7 @@ namespace Il2CppInspector
|
||||
return regs;
|
||||
}
|
||||
|
||||
private List<uint> getFunctionAtFileOffset(IFileFormatReader image, uint loc, uint maxLength) {
|
||||
private List<uint> getFunctionAtFileOffset(IFileFormatStream image, uint loc, uint maxLength) {
|
||||
// Read a function that ends in a hard branch (B) or exceeds maxLength instructions
|
||||
var func = new List<uint>();
|
||||
uint inst;
|
||||
@@ -141,7 +141,7 @@ namespace Il2CppInspector
|
||||
// - Loads can be done either with ADRP+ADD (loads the address of the wanted struct) or ADRP+LDR (loads a pointer to the address which must be de-referenced)
|
||||
// - Loads do not need to be pairs of sequential instructions
|
||||
// - We need to sweep the whole function from the ADRP to the next B to find an ADD or LDR with a corresponding register
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatReader image, uint loc) {
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc) {
|
||||
// Load function into memory
|
||||
// In practice, the longest function length we need is not generally longer than 7 instructions (0x1C bytes)
|
||||
var func = getFunctionAtFileOffset(image, loc, 7);
|
||||
|
||||
@@ -13,9 +13,9 @@ namespace Il2CppInspector
|
||||
{
|
||||
internal class Il2CppBinaryX64 : Il2CppBinary
|
||||
{
|
||||
public Il2CppBinaryX64(IFileFormatReader stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
public Il2CppBinaryX64(IFileFormatStream stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
|
||||
public Il2CppBinaryX64(IFileFormatReader stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
public Il2CppBinaryX64(IFileFormatStream stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
: base(stream, codeRegistration, metadataRegistration, statusCallback) { }
|
||||
|
||||
// Format of 64-bit LEA:
|
||||
@@ -94,7 +94,7 @@ namespace Il2CppInspector
|
||||
return ((buff[offset + 1] & 0b0011_1000) >> 3, buff[offset + 1] & 0b0000_0111);
|
||||
}
|
||||
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatReader image, uint loc) {
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc) {
|
||||
|
||||
// Setup
|
||||
var buffSize = 0x76; // minimum number of bytes to process the longest expected function
|
||||
|
||||
@@ -11,12 +11,12 @@ namespace Il2CppInspector
|
||||
{
|
||||
internal class Il2CppBinaryX86 : Il2CppBinary
|
||||
{
|
||||
public Il2CppBinaryX86(IFileFormatReader stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
public Il2CppBinaryX86(IFileFormatStream stream, EventHandler<string> statusCallback = null) : base(stream, statusCallback) { }
|
||||
|
||||
public Il2CppBinaryX86(IFileFormatReader stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
public Il2CppBinaryX86(IFileFormatStream stream, uint codeRegistration, uint metadataRegistration, EventHandler<string> statusCallback = null)
|
||||
: base(stream, codeRegistration, metadataRegistration, statusCallback) { }
|
||||
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatReader image, uint loc) {
|
||||
protected override (ulong, ulong) ConsiderCode(IFileFormatStream image, uint loc) {
|
||||
ulong metadata, code;
|
||||
long pCgr;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user