Example #1
0
        public Program ParseLoadCommands(mach_header_64 hdr, Address addrLoad)
        {
            var imageMap = new SegmentMap(addrLoad);

            Debug.Print("Parsing {0} load commands.", hdr.ncmds);

            for (uint i = 0; i < hdr.ncmds; ++i)
            {
                var pos = rdr.Offset;
                if (!rdr.TryReadUInt32(out uint cmd) ||
                    !rdr.TryReadUInt32(out uint cmdsize))
                {
                    throw new BadImageFormatException(string.Format(
                                                          "Unable to read Mach-O command ({0:X}).",
                                                          rdr.Offset));
                }
                Debug.Print("{0,2}: Read MachO load command 0x{1:X} {2} of size {3}.", i, cmd, (Command)cmd, cmdsize);

                switch ((Command)(cmd & ~(uint)LC_REQ_DYLD))
                {
                case LC_SEGMENT:
                    ParseSegmentCommand32(imageMap);
                    break;

                case LC_SEGMENT_64:
                    ParseSegmentCommand64(imageMap);
                    break;

                case LC_SYMTAB:
                    ParseSymtabCommand();
                    break;

                case LC_DYSYMTAB:
                    ParseDysymtabCommand();
                    break;

                case LC_FUNCTION_STARTS:
                    ParseFunctionStarts(rdr.Clone());
                    break;

                case LC_UNIXTHREAD:
                    ParseUnixThread(hdr.cputype);
                    break;
                }
                rdr.Offset = pos + cmdsize;
            }
            ldr.program.Architecture = specific.Architecture;
            ldr.program.SegmentMap   = imageMap;
            ldr.program.Platform     = new DefaultPlatform(ldr.Services, specific.Architecture);
            return(ldr.program);
        }
Example #2
0
        public Program ParseLoadCommands(mach_header_64 hdr, IProcessorArchitecture arch, Address addrLoad)
        {
            var imageMap = new SegmentMap(addrLoad);

            Debug.Print("Parsing {0} load commands.", hdr.ncmds);
            string?platformName = null;

            for (uint i = 0; i < hdr.ncmds; ++i)
            {
                var pos = rdr.Offset;
                if (!rdr.TryReadUInt32(out uint cmd) ||
                    !rdr.TryReadUInt32(out uint cmdsize))
                {
                    throw new BadImageFormatException(string.Format(
                                                          "Unable to read Mach-O command ({0:X}).",
                                                          rdr.Offset));
                }
                Debug.Print("{0,2}: Read MachO load command 0x{1:X} {2} of size {3}.", i, cmd, (Command)cmd, cmdsize);

                switch ((Command)(cmd & ~(uint)LC_REQ_DYLD))
                {
                case LC_SEGMENT:
                    ParseSegmentCommand32(imageMap);
                    break;

                case LC_SEGMENT_64:
                    ParseSegmentCommand64(imageMap);
                    break;

                case LC_SYMTAB:
                    ParseSymtabCommand(arch);
                    break;

                case LC_DYSYMTAB:
                    ParseDysymtabCommand(arch);
                    break;

                case LC_FUNCTION_STARTS:
                    ParseFunctionStarts(rdr.Clone());
                    break;

                case LC_UNIXTHREAD:
                    ParseUnixThread(hdr.cputype, arch);
                    break;

                case LC_VERSION_MIN_MACOSX:
                    platformName = "macOsX";
                    break;

                case LC_MAIN & ~LC_REQ_DYLD:
                    ParseMain(arch);
                    break;
                }
                rdr.Offset = pos + cmdsize;
            }
            ldr.program !.Architecture = arch;
            ldr.program.SegmentMap     = imageMap;
            if (!string.IsNullOrEmpty(platformName))
            {
                var env = cfgSvc.GetEnvironment(platformName !);
                ldr.program.Platform = env.Load(ldr.Services, arch);
            }
            else
            {
                ldr.program.Platform = new DefaultPlatform(ldr.Services, arch);
            }
            return(ldr.program);
        }