Ejemplo n.º 1
0
 public static Address GetRawBinaryEntryAddress(
     RawFileDefinition rawFile,
     byte[] image,
     IProcessorArchitecture arch,
     Address baseAddr)
 {
     if (!string.IsNullOrEmpty(rawFile.EntryPoint.Address))
     {
         if (arch.TryParseAddress(rawFile.EntryPoint.Address, out Address entryAddr))
         {
             if (rawFile.EntryPoint.Follow)
             {
                 var rdr  = arch.CreateImageReader(new MemoryArea(baseAddr, image), entryAddr);
                 var addr = arch.ReadCodeAddress(0, rdr, arch.CreateProcessorState());
                 return(addr);
             }
             else
             {
                 return(entryAddr);
             }
         }
         else
         {
             return(baseAddr);
         }
     }
     return(baseAddr);
 }
Ejemplo n.º 2
0
        private void Given_MsDosRawFileFormat()
        {
            this.x86arch = new Mock <IProcessorArchitecture>();
            this.x86arch.Setup(a => a.Name).Returns("x86-real-16");
            var env = new Mock <PlatformDefinition>();

            this.msdosPlatform = new Mock <IPlatform>();
            var map     = new SegmentMap(Address.SegPtr(0x0C00, 0));
            var state   = new FakeProcessorState(x86arch.Object);
            var rawFile = new RawFileDefinition
            {
                BaseAddress  = "0C00:0100",
                Environment  = "ms-dos",
                Architecture = "x86-real-16",
            };

            rawFile.EntryPoint.Address = null;
            rawFile.EntryPoint.Name    = "Start_Here";
            cfgSvc.Setup(d => d.GetRawFile("ms-dos-com")).Returns(rawFile);
            cfgSvc.Setup(d => d.GetArchitecture("x86-real-16")).Returns(x86arch.Object);
            cfgSvc.Setup(d => d.GetEnvironment("ms-dos")).Returns(env.Object);
            env.Setup(e => e.Load(It.IsAny <IServiceProvider>(), It.IsAny <IProcessorArchitecture>()))
            .Returns(msdosPlatform.Object);

            var addr = Address.SegPtr(0x0C00, 0x0100);

            x86arch.Setup(a => a.TryParseAddress(
                              "0C00:0100",
                              out addr))
            .Returns(true);
            x86arch.Setup(a => a.CreateProcessorState()).Returns(state);
        }
Ejemplo n.º 3
0
        private ImageLoader CreateRawImageLoader(string filename, byte[] image, RawFileDefinition rawFile)
        {
            var       arch = cfgSvc.GetArchitecture(rawFile.Architecture);
            var       env  = cfgSvc.GetEnvironment(rawFile.Environment);
            IPlatform platform;

            if (env != null)
            {
                platform = env.Load(Services, arch);
            }
            else
            {
                platform = new DefaultPlatform(Services, arch);
            }

            Address entryAddr = null;

            if (arch.TryParseAddress(rawFile.BaseAddress, out Address baseAddr))
            {
                entryAddr = GetRawBinaryEntryAddress(rawFile, image, arch, baseAddr);
            }
            var imgLoader = new NullImageLoader(Services, filename, image)
            {
                Architecture         = arch,
                Platform             = platform,
                PreferredBaseAddress = entryAddr,
            };
            Address addrEp;

            if (rawFile.EntryPoint != null)
            {
                if (!string.IsNullOrEmpty(rawFile.EntryPoint.Address))
                {
                    arch.TryParseAddress(rawFile.EntryPoint.Address, out addrEp);
                }
                else
                {
                    addrEp = baseAddr;
                }
                imgLoader.EntryPoints.Add(ImageSymbol.Procedure(arch, addrEp));
            }
            return(imgLoader);
        }