Example #1
0
        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);
        }
Example #2
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);
        }
Example #3
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);
        }
Example #4
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);
        }
Example #5
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);
        }