Ejemplo n.º 1
0
        private Dictionary <int, SystemService> LoadLibraryDef(string lib_name, int version, TypeLibrary libDst)
        {
            var tlSvc = Services.RequireService <ITypeLibraryLoaderService>();
            var fsSvc = Services.RequireService <IFileSystemService>();
            var tser  = new TypeLibraryDeserializer(this, true, libDst);
            var sser  = new ProcedureSerializer(this, tser, DefaultCallingConvention);

            using (var rdr = new StreamReader(fsSvc.CreateFileStream(tlSvc.InstalledFileLocation(lib_name + ".funcs"), FileMode.Open, FileAccess.Read)))
            {
                var fpp = new FuncsFileParser((M68kArchitecture)this.Architecture, rdr);
                fpp.Parse();
                return(fpp.FunctionsByLibBaseOffset.Values
                       .Select(amiSvc => new SystemService
                {
                    Name = amiSvc.Name,
                    SyscallInfo = new SyscallInfo
                    {
                        Vector = amiSvc.Offset,
                    },
                    Signature = sser.Deserialize(amiSvc.Signature, Architecture.CreateFrame()),       //$BUGBUG: catch dupes?
                    Characteristics = new ProcedureCharacteristics {
                    }
                })
                       .ToDictionary(de => de.SyscallInfo.Vector, de => de));
            };
        }
Ejemplo n.º 2
0
        private void OnMemoryMapChanged()
        {
            //var tlSvc = Services.RequireService<ITypeLibraryLoaderService>();
            var tser  = new TypeLibraryDeserializer(this, true, Metadata);
            var sser  = new ProcedureSerializer(this, tser, DefaultCallingConvention);
            var disps = new Dictionary <Address, DispatchProcedure>();

            foreach (var callable in this.MemoryMap.Segments.SelectMany(s => s.Procedures))
            {
                if (callable is DispatchProcedure_v1 sDisp)
                {
                    if (sDisp.Services == null)
                    {
                        continue;
                    }
                    var svcs = sDisp.Services
                               .Where(s => s.SyscallInfo != null)
                               .Select(s => (
                                           s.SyscallInfo.Build(this),
                                           new ExternalProcedure(
                                               s.Name,
                                               sser.Deserialize(s.Signature, Architecture.CreateFrame()))))
                               .ToList();
                    if (Architecture.TryParseAddress(sDisp.Address, out var addr))
                    {
                        var disp = new DispatchProcedure(
                            sDisp.Name,
                            svcs);
                        disps.Add(addr, disp);
                    }
                }
            }
            this.dispatchProcedures = disps;
        }
Ejemplo n.º 3
0
 private void Given_X86ProcedureSerializer()
 {
     sser = new ProcedureSerializer(
         platform,
         new TypeLibraryDeserializer(platform, true, new TypeLibrary()),
         "stdapi");
 }
Ejemplo n.º 4
0
 public void Setup()
 {
     arch     = new IntelArchitecture(ProcessorMode.Real);
     platform = new MsdosPlatform(null, arch);
     sigser   = new X86ProcedureSerializer(arch, new TypeLibraryLoader(platform, true), "stdapi");
     argser   = new ArgumentSerializer(sigser, arch, arch.CreateFrame(), null);
 }
Ejemplo n.º 5
0
        public void LoadProcedure(Procedure_v1 sp)
        {
            try
            {
                var sser      = new ProcedureSerializer(platform, this, this.defaultConvention);
                var signature = sser.Deserialize(sp.Signature, platform.Architecture.CreateFrame());
                library.Signatures[sp.Name] = signature;
                var mod = EnsureModule(this.moduleName, this.library);
                var svc = new SystemService
                {
                    ModuleName = mod.ModuleName,
                    Name       = sp.Name,
                    Signature  = signature,
                };
                mod.ServicesByName[sp.Name] = svc;    //$BUGBUG: catch dupes?

                if (sp.Ordinal != Procedure_v1.NoOrdinal)
                {
                    mod.ServicesByOrdinal[sp.Ordinal] = svc;
                }
            }
            catch (Exception ex)
            {
                Debug.Print("An error occurred when loading the signature of procedure {0}.", sp.Name);
                throw new ApplicationException(
                          string.Format("An error occurred when loading the signature of procedure {0}.", sp.Name),
                          ex);
            }
        }
Ejemplo n.º 6
0
        public void ProcessDeclaration(Decl declaration, IPlatform platform, TypeLibraryDeserializer tldser, SymbolTable symbolTable)
        {
            var types        = symbolTable.AddDeclaration(declaration);
            var type         = types[0];
            int?vectorOffset = GetVectorOffset(declaration);

            if (vectorOffset.HasValue)
            {
                var ntde = new NamedDataTypeExtractor(platform, declaration.decl_specs, symbolTable, 4);
                foreach (var declarator in declaration.init_declarator_list)
                {
                    var nt   = ntde.GetNameAndType(declarator.Declarator);
                    var ssig = (SerializedSignature?)nt.DataType;
                    if (ssig != null && ssig.ReturnValue != null)
                    {
                        ssig.ReturnValue.Kind = ntde.GetArgumentKindFromAttributes(
                            "returns", declaration.attribute_list);
                    }
                    var sser = new ProcedureSerializer(platform, tldser, platform.DefaultCallingConvention);
                    var sig  = sser.Deserialize(ssig, platform.Architecture.CreateFrame());
                    SystemServices.Add(
                        vectorOffset.Value,
                        new SystemService
                    {
                        Name        = nt.Name,
                        SyscallInfo = new SyscallInfo
                        {
                            Vector = vectorOffset.Value,
                        },
                        Signature = sig,
                    });
                }
            }
        }
Ejemplo n.º 7
0
 public UserCallData GetUserCallData(ProcedureSerializer procSer)
 {
     return(new UserCallData
     {
         Address = dlg.Address,
         NoReturn = dlg.NoReturn.Checked,
     });
 }
 private void Given_ArchitectureStub()
 {
     arch     = mr.DynamicMock <IProcessorArchitecture>();
     platform = mr.DynamicMock <IPlatform>();
     platform.Stub(p => p.PointerType).Return(PrimitiveType.Pointer32);
     this.procSer = mr.StrictMock <ProcedureSerializer>(null, null, null);
     platform.Stub(p => p.CreateProcedureSerializer(null, null)).IgnoreArguments().Return(procSer);
     platform.Stub(p => p.Architecture).Return(arch);
 }
 private void Given_ArchitectureStub()
 {
     arch = new Mock <IProcessorArchitecture>();
     arch.Setup(a => a.PointerType).Returns(PrimitiveType.Ptr32);
     arch.Setup(a => a.WordWidth).Returns(PrimitiveType.Ptr32);
     platform = new Mock <IPlatform>();
     platform.Setup(p => p.PointerType).Returns(PrimitiveType.Ptr32);
     platform.Setup(p => p.Architecture).Returns(arch.Object);
     this.procSer = new ProcedureSerializer(platform.Object, null, "");
 }
Ejemplo n.º 10
0
 private void Given_ArchitectureStub()
 {
     arch = mr.DynamicMock <IProcessorArchitecture>();
     arch.Stub(a => a.PointerType).Return(PrimitiveType.Ptr32);
     arch.Stub(a => a.WordWidth).Return(PrimitiveType.Ptr32);
     platform = mr.DynamicMock <IPlatform>();
     platform.Stub(p => p.PointerType).Return(PrimitiveType.Ptr32);
     platform.Stub(p => p.Architecture).Return(arch);
     platform.Replay();
     this.procSer = new ProcedureSerializer(platform, null, "");
 }
Ejemplo n.º 11
0
        public ExternalProcedure LoadExternalProcedure(ProcedureBase_v1 sProc)
        {
            var sSig = sProc.Signature;
            var sser = new ProcedureSerializer(platform, this, this.defaultConvention);
            var sig  = sser.Deserialize(sSig, platform.Architecture.CreateFrame());   //$BUGBUG: catch dupes?

            return(new ExternalProcedure(sProc.Name, sig)
            {
                EnclosingType = sSig.EnclosingType
            });
        }
Ejemplo n.º 12
0
 public void LoadProcedure(Procedure_v1 sp)
 {
     try
     {
         var sser      = new ProcedureSerializer(platform, this, this.defaultConvention ?? "");
         var signature = sser.Deserialize(sp.Signature, platform.Architecture.CreateFrame());
         if (sp.Name is null || signature is null)
         {
             return;
         }
         library.Signatures[sp.Name !] = signature;
Ejemplo n.º 13
0
        public void Setup()
        {
            var sc = new ServiceContainer();

            sc.AddService <IFileSystemService>(new FileSystemServiceImpl());
            arch     = new X86ArchitectureReal();
            platform = new MsdosPlatform(sc, arch);
            sigser   = new X86ProcedureSerializer(
                arch,
                new TypeLibraryDeserializer(platform, true, new TypeLibrary()),
                "stdapi");
            argser = new ArgumentDeserializer(sigser, arch, arch.CreateFrame(), 4);
        }
Ejemplo n.º 14
0
        public void LoadProcedure(Procedure_v1 sp)
        {
            try
            {
                if (sp.Name is null)
                {
                    return;
                }
                if (sp.Characteristics != null)
                {
                    library.Characteristics[sp.Name] = sp.Characteristics;
                }
                var sser      = new ProcedureSerializer(platform, this, this.defaultConvention ?? "");
                var signature = sser.Deserialize(sp.Signature, platform.Architecture.CreateFrame());
                if (signature is null)
                {
                    return;
                }
                library.Signatures[sp.Name] = signature;
                if (platform.TryParseAddress(sp.Address, out var addr))
                {
                    this.library.Procedures[addr] = (sp.Name, signature);
                }
                else
                {
                    var mod = EnsureModule(this.moduleName, this.library);
                    var svc = new SystemService
                    {
                        ModuleName = mod.ModuleName,
                        Name       = sp.Name,
                        Signature  = signature,
                    };
                    mod.ServicesByName[sp.Name] = svc;    //$BUGBUG: catch dupes?

                    if (sp.Ordinal != Procedure_v1.NoOrdinal)
                    {
                        mod.ServicesByOrdinal[sp.Ordinal] = svc;
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.Print("An error occurred when loading the signature of procedure {0}.", sp.Name);
                throw new ApplicationException(
                          string.Format("An error occurred when loading the signature of procedure {0}.", sp.Name),
                          ex);
            }
        }
Ejemplo n.º 15
0
        public void Setup()
        {
            var sc = new ServiceContainer();

            sc.AddService <IFileSystemService>(new FileSystemServiceImpl());
            arch     = new X86ArchitectureReal("x86-real-16");
            platform = new MsdosPlatform(sc, arch);
            sigser   = new ProcedureSerializer(
                platform,
                new TypeLibraryDeserializer(platform, true, new TypeLibrary()),
                "stdapi");
            argser = new ArgumentDeserializer(
                sigser,
                arch,
                arch.CreateFrame(),
                // It's possible that old, hand-written assembler passes
                // arguments on unaligned offsets
                13,
                4);
        }
Ejemplo n.º 16
0
        public ExternalProcedure?LoadExternalProcedure(
            ProcedureBase_v1 sProc, ProcedureCharacteristics?chr = null)
        {
            if (sProc.Name is null)
            {
                return(null);
            }
            var sSig = sProc.Signature;
            var sser = new ProcedureSerializer(platform, this, this.defaultConvention ?? "");
            var sig  = sser.Deserialize(sSig, platform.Architecture.CreateFrame());   //$BUGBUG: catch dupes?

            if (sig is null)
            {
                return(null);
            }
            return(new ExternalProcedure(sProc.Name, sig, chr)
            {
                EnclosingType = sSig?.EnclosingType
            });
        }
Ejemplo n.º 17
0
        public Tuple <int?, SystemService> ParseLine()
        {
            try
            {
                int?ordinal = ParseOrdinal();

                string callconv = ParseCallingConvention();

                var options = ParseOptions();

                var    tok    = Get();
                string fnName = tok.Value;
                var    ssig   = new SerializedSignature
                {
                    Convention = callconv,
                };
                ssig.Arguments = ParseParameters(ssig);
                SkipToEndOfLine();

                var deser = new ProcedureSerializer(platform, tlLoader, ssig.Convention);
                var sig   = deser.Deserialize(ssig, new Frame(platform.FramePointerType));
                var svc   = new SystemService
                {
                    ModuleName = moduleName.ToUpper(),
                    Name       = fnName,
                    Signature  = sig
                };
                return(Tuple.Create(ordinal, svc));
            }
            catch
            {
                Services.RequireService <DecompilerEventListener>().Warn(
                    new NullCodeLocation(moduleName),
                    "Line {0} in the Wine spec file could not be read; skipping.",
                    lexer.lineNumber);
                SkipToEndOfLine();
                return(null);
            }
        }
Ejemplo n.º 18
0
 private Dictionary <Address, ExternalProcedure> LoadPlatformProcedures(Platform platform)
 {
     if (platform.MemoryMap != null && platform.MemoryMap.Segments != null)
     {
         platform.EnsureTypeLibraries(platform.Name);
         var tser = new TypeLibraryDeserializer(platform, true, platform.Metadata);
         var sser = new ProcedureSerializer(platform, tser, platform.DefaultCallingConvention);
         return(platform.MemoryMap.Segments.SelectMany(s => s.Procedures)
                .OfType <Procedure_v1>()
                .Where(p => p.Name != null)
                .Select(p =>
                        (addr: platform.Architecture.TryParseAddress(p.Address, out var addr) ? addr : null,
                         ext:  new ExternalProcedure(
                             p.Name !,
                             sser.Deserialize(p.Signature, platform.Architecture.CreateFrame())
                             ?? new Types.FunctionType())))
                .Where(p => p.addr != null)
                .ToDictionary(p => p.addr !, p => p.ext));
     }
     else
     {
         return(new Dictionary <Address, ExternalProcedure>());
     }
 }
Ejemplo n.º 19
0
        public DataType VisitSignature(SerializedSignature sSig)
        {
            var sser = new ProcedureSerializer(platform, this, this.defaultConvention);

            return(sser.Deserialize(sSig, platform.Architecture.CreateFrame()));
        }
Ejemplo n.º 20
0
 public UserCallData GetUserCallData(ProcedureSerializer procSer)
 {
     return(interactor.GetUserCallData(procSer));
 }
Ejemplo n.º 21
0
 private void Given_ProcedureSerializer(string cConvention)
 {
     this.deserializer = new FakeTypeDeserializer(32);
     this.ser          = new ProcedureSerializer(platform, deserializer, cConvention);
 }