private ulong FindReference(ulong pointer, MachoSection64bit search) { var searchend = search.offset + search.size; Position = search.offset; while ((ulong)Position < searchend) { if (ReadUInt64() == pointer) { return((ulong)Position - search.offset + search.address);//MapRATV } } return(0); }
private ulong FindCodeRegistration(int count, MachoSection64bit search, MachoSection64bit search2, MachoSection64bit range) { var searchend = search.offset + search.size; var rangeend = range.address + range.size; var search2end = search2 == null ? 0 : search2.offset + search2.size; Position = search.offset; while ((ulong)Position < searchend) { var add = Position; if (ReadUInt64() == (ulong)count) { try { ulong pointers = MapVATR(ReadUInt64()); if (pointers >= search.offset && pointers <= searchend) { var np = Position; var temp = ReadClassArray <ulong>(pointers, count); var r = Array.FindIndex(temp, x => x <range.address || x> rangeend); if (r == -1) { return((ulong)add - search.offset + search.address); //VirtualAddress } Position = np; } else if (search2 != null && pointers >= search2.offset && pointers <= search2end) { var np = Position; var temp = ReadClassArray <ulong>(pointers, count); var r = Array.FindIndex(temp, x => x <range.address || x> rangeend); if (r == -1) { return((ulong)add - search.offset + search.address); //VirtualAddress } Position = np; } } catch { // ignored } } } return(0); }
private ulong FindMetadataRegistration(int typeDefinitionsCount, MachoSection64bit search, MachoSection64bit search2, MachoSection64bit range) { var searchend = search.offset + search.size; var rangeend = range.address + range.size; var search2end = search2 == null ? 0 : search2.offset + search2.size; Position = search.offset; while ((ulong)Position < searchend) { var add = Position; if (ReadUInt64() == (ulong)typeDefinitionsCount) { try { var np = Position; Position += 16; ulong pointers = MapVATR(ReadUInt64()); if (pointers >= search.offset && pointers <= searchend) { var temp = ReadClassArray <ulong>(pointers, maxmetadataUsages); var r = Array.FindIndex(temp, x => x <range.address || x> rangeend); if (r == -1) { return((ulong)add - 96ul - search.offset + search.address);//MapRATV } } else if (search2 != null && pointers >= search2.offset && pointers <= search2end) { var temp = ReadClassArray <ulong>(pointers, maxmetadataUsages); var r = Array.FindIndex(temp, x => x <range.address || x> rangeend); if (r == -1) { return((ulong)add - 96ul - search.offset + search.address);//MapRATV } } Position = np; } catch { // ignored } } } return(0); }
private ulong FindPointersDesc(long readCount, MachoSection64bit search, MachoSection64bit range) { var add = 0L; var searchend = search.offset + search.size; var rangeend = range.address + range.size; while (searchend + (ulong)add > search.offset) { var temp = ReadClassArray <ulong>((long)searchend + add - 8 * readCount, readCount); var r = Array.FindIndex(temp, x => x <range.address || x> rangeend); if (r != -1) { add -= (readCount - r) * 8; } else { return(search.address + search.size + (ulong)add - 8ul * (ulong)readCount);//MapRATV } } return(0); }
private ulong FindPointersAsc(long readCount, MachoSection64bit search, MachoSection64bit range) { var add = 0ul; var searchend = search.offset + search.size; var rangeend = range.address + range.size; while (search.offset + add < searchend) { var temp = ReadClassArray <ulong>(search.offset + add, readCount); var r = Array.FindLastIndex(temp, x => x <range.address || x> rangeend); if (r != -1) { add += (ulong)(++r * 8); } else { return(search.address + add);//MapRATV } } return(0); }