public void SseqCreate() { Identifier head = new Identifier(Registers.dx.Name, Registers.dx.DataType, Registers.dx); Identifier tail = new Identifier(Registers.ax.Name, Registers.ax.DataType, Registers.ax); Identifier seq = new Identifier("dx_ax", PrimitiveType.Word32, new SequenceStorage(PrimitiveType.Word32, head.Storage, tail.Storage)); SerializedSequence sq = new SerializedSequence((SequenceStorage)seq.Storage); Assert.AreEqual("dx", sq.Registers[0].Name); Assert.AreEqual("ax", sq.Registers[1].Name); XmlSerializer ser = SerializedLibrary.CreateSerializer_v1(sq.GetType()); StringWriter sw = new StringWriter(); XmlTextWriter xml = new XmlTextWriter(sw); xml.Formatting = Formatting.None; ser.Serialize(xml, sq); string s = sw.ToString(); int i = s.IndexOf("<reg"); Assert.AreEqual("<reg>dx</reg><reg>ax</reg>", s.Substring(i, s.IndexOf("</Se") - i)); }
public void Tlldr_typedef_int() { Given_ArchitectureStub(); mr.ReplayAll(); var tlLdr = new TypeLibraryDeserializer(platform, true, new TypeLibrary()); var slib = new SerializedLibrary { Types = new SerializedType[] { new SerializedTypedef { Name = "int", DataType = new PrimitiveType_v1 { Domain = Domain.SignedInt, ByteSize = 4 } } } }; var lib = tlLdr.Load(slib); Assert.AreSame(PrimitiveType.Int32, lib.LookupType("int")); }
public void SlLookupType() { var slib = new SerializedLibrary { Types = new SerializedType[] { new SerializedTypedef { Name = "int", DataType = new PrimitiveType_v1 { Domain = Reko.Core.Types.Domain.SignedInt, ByteSize = 4 } } } }; var arch = new X86ArchitectureFlat32("x86-protected-32"); var platform = new SysVPlatform(null, arch); var tldser = new TypeLibraryDeserializer(platform, true, new TypeLibrary()); var lib = tldser.Load(slib); Assert.AreEqual(PrimitiveType.Int32, lib.LookupType("int")); }
private void LoadGlobals(SerializedLibrary sLib) { var mod = EnsureModule(this.moduleName, this.library); if (sLib.Globals != null) { foreach (var g in sLib.Globals.Where(gg => !string.IsNullOrEmpty(gg.Name) && gg.Type != null)) { var dt = this.LoadType(g.Type); var sym = new ImageSymbol { Type = SymbolType.Data }; mod.GlobalsByName[g.Name] = sym; if (g.Ordinal != GlobalVariable_v1.NoOrdinal) { mod.GlobalsByOrdinal[g.Ordinal] = sym; } library.Globals[g.Name] = dt; //$REVIEW: How to cope with colissions MODULE1!foo and MODULE2!foo? } } }
public override TypeLibrary Load(IPlatform platform, TypeLibrary dstLib) { var rdr = new StreamReader(stream); var parser = platform.CreateCParser(rdr); var symbolTable = CreateSymbolTable(platform, dstLib); var declarations = parser.Parse(); foreach (var decl in declarations) { symbolTable.AddDeclaration(decl); } var slib = new SerializedLibrary { Types = symbolTable.Types.ToArray(), Procedures = symbolTable.Procedures.ToList(), }; var tldser = new TypeLibraryDeserializer(platform, true, dstLib); var tlib = tldser.Load(slib); return(tlib); }
public void LoadRealmodeServices(IProcessorArchitecture arch) { var prefix = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var libPath = Path.Combine(prefix, "realmodeintservices.xml"); if (!File.Exists(libPath)) { libPath = Path.Combine(Directory.GetCurrentDirectory(), "realmodeintservices.xml"); } SerializedLibrary lib; using (FileStream stm = new FileStream(libPath, FileMode.Open)) { lib = SerializedLibrary.LoadFromStream(stm); } realModeServices = lib.Procedures .Cast <SerializedService>() .Select(s => s.Build(this)) .ToArray(); }
public void LoadInterruptServices(IProcessorArchitecture arch) { var prefix = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var libPath = Path.Combine(prefix, "realmodeintservices.xml"); if (!File.Exists(libPath)) { libPath = Path.Combine(Directory.GetCurrentDirectory(), "realmodeintservices.xml"); } SerializedLibrary lib; var fsSvc = Services.RequireService<IFileSystemService>(); using (Stream stm = fsSvc.CreateFileStream(libPath, FileMode.Open, FileAccess.Read)) { lib = SerializedLibrary.LoadFromStream(stm); } this.interruptServices = lib.Procedures .Cast<SerializedService>() .Select(s => ExtendRegisters(s)) .Select(s => s.Build(this, Metadata)) .ToArray(); }
public void SlibReadRealModeIntServices_v1() { var ser = SerializedLibrary.CreateSerializer_v1(typeof(SerializedLibrary)); SerializedLibrary lib; var contents = @"<?xml version=""1.0"" encoding=""utf-16"" ?> <library xmlns=""http://schemata.jklnet.org/Decompiler""> <service name=""msdos_rename_file""> <syscallinfo> <vector>21</vector> <regvalue reg=""ah"">56</regvalue> </syscallinfo> <signature> <return> <flag>C</flag> </return> <arg name=""oldName""><seq><reg>ds</reg><reg>dx</reg></seq></arg> <arg name=""newName""><seq><reg>es</reg><reg>di</reg></seq></arg> <arg name=""errorCode"" out=""true""><reg>ax</reg></arg> </signature> </service> </library> "; lib = (SerializedLibrary)ser.Deserialize(new StringReader(contents)); Assert.AreEqual(1, lib.Procedures.Count); var svc = (SerializedService)lib.Procedures[0]; Assert.AreEqual("msdos_rename_file", svc.Name); Assert.AreEqual("21", svc.SyscallInfo.Vector); Assert.AreEqual("ah", svc.SyscallInfo.RegisterValues[0].Register); Assert.AreEqual("56", svc.SyscallInfo.RegisterValues[0].Value); Assert.AreEqual("arg()", svc.Signature.ReturnValue.ToString()); Assert.AreEqual(3, svc.Signature.Arguments.Length); Assert.AreEqual("arg(oldName,)", svc.Signature.Arguments[0].ToString()); Assert.AreEqual("arg(newName,)", svc.Signature.Arguments[1].ToString()); Assert.AreEqual("arg(errorCode,)", svc.Signature.Arguments[2].ToString()); }
public void Convert() { var lexer = new CLexer(rdr); var parser = new CParser(parserState, lexer); var declarations = parser.Parse(); var symbolTable = new SymbolTable(platform) { NamedTypes = { { "off_t", new PrimitiveType_v1 { Domain = Domain.SignedInt, ByteSize = 4 } }, //$BUGBUG: arch-dependent! { "ssize_t", new PrimitiveType_v1 { Domain = Domain.SignedInt, ByteSize = 4 } }, //$BUGBUG: arch-dependent! { "size_t", new PrimitiveType_v1 { Domain = Domain.UnsignedInt, ByteSize = 4 } }, //$BUGBUG: arch-dependent! { "va_list", new PrimitiveType_v1 { Domain = Domain.Pointer, ByteSize = platform.PointerType.Size } } } }; foreach (var decl in declarations) { symbolTable.AddDeclaration(decl); } var lib = new SerializedLibrary { Types = symbolTable.Types.ToArray(), Procedures = symbolTable.Procedures.ToList(), }; var ser = SerializedLibrary.CreateSerializer(); ser.Serialize(writer, lib); }
public void SudSaveScripts() { var project = new Project { ScriptFiles = { new Mock <ScriptFile>( null, "/var/foo/script.fake", new byte[100]).Object }, }; var sw = new StringWriter(); var writer = new FilteringXmlWriter(sw) { Formatting = System.Xml.Formatting.Indented }; var ser = SerializedLibrary.CreateSerializer_v5( typeof(Project_v5)); var saver = new ProjectSaver(sc); var sProject = saver.Serialize("/var/foo/foo.proj", project); ser.Serialize(writer, sProject); var expected = @"<?xml version=""1.0"" encoding=""utf-16""?> <project xmlns=""http://schemata.jklnet.org/Reko/v5""> <script> <filename>script.fake</filename> </script> </project>"; if (sw.ToString() != expected) { Console.WriteLine("{0}", sw.ToString()); } Assert.AreEqual(expected, sw.ToString()); }
public void Tlldr_typedef_empty_enum() { Given_ArchitectureStub(); var tlLdr = new TypeLibraryDeserializer(platform.Object, true, new TypeLibrary()); var slib = new SerializedLibrary { Types = new SerializedType[] { new SerializedTypedef { Name = "empty_enum", DataType = new SerializedEnumType { Name = "empty", Size = 4, } } } }; var lib = tlLdr.Load(slib); Assert.AreEqual("(enum empty,())", lib.LookupType("empty_enum").ToString()); }
public void SudSaveProject() { Given_Architecture(); Given_TestOS_Platform(); var eax = new RegisterStorage("eax", 0, 0, PrimitiveType.Word32); var ecx = new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32); var jumpTable = new ImageMapVectorTable( Address.SegPtr(0x1000, 0x400), new Address[] { Address.SegPtr(0x1000, 0x500), Address.SegPtr(0x1000, 0x513), Address.SegPtr(0x1000, 0x5BA), }, 0); Project project = new Project { Programs = { new Program { Architecture = arch.Object, Platform = platform.Object, SegmentMap = new SegmentMap(Address.SegPtr(0x1000, 0)), //, new byte[100]), DisassemblyDirectory = "", User = new UserData { Loader = "CustomLoader", ExtractResources = true, Procedures = { { Address.SegPtr(0x1000, 0x10), new UserProcedure(Address.SegPtr(0x1000, 0x10), "foo") { Signature = new SerializedSignature { ReturnValue = new Argument_v1{ Kind = new Register_v1("eax") }, Arguments = new Argument_v1[] { new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) }, new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) } } } } } }, Globals = { { Address.SegPtr(0x2000, 0), new UserGlobal(Address.SegPtr(0x2000, 0), "g_20000", new StringType_v2{ Termination = StringType_v2.ZeroTermination, CharType = new PrimitiveType_v1 { Domain = Domain.Character, ByteSize = 1 } }) } }, Calls = { { Address.SegPtr(0x1000, 0x0320), new UserCallData { Address = Address.SegPtr(0x1000, 0x0320), NoReturn = true, } } }, RegisterValues = { { Address.Ptr32(0x012310), new List <UserRegisterValue> { new UserRegisterValue(eax, Constant.Word32(0x01231)), new UserRegisterValue(ecx, Constant.Word32(0x42424711)), } } }, IndirectJumps = { { Address.SegPtr(0x1000, 0x380), new UserIndirectJump { Address = jumpTable.Address, Table = jumpTable, IndexRegister = new RegisterStorage("R1", 1, 0, PrimitiveType.Word32) } } }, JumpTables = { { jumpTable.Address, jumpTable } }, OutputFilePolicy = Program.SegmentFilePolicy, } } } }; using (FileUnitTester fut = new FileUnitTester("Core/SudSaveProject.txt")) { FilteringXmlWriter writer = new FilteringXmlWriter(fut.TextWriter); writer.Formatting = System.Xml.Formatting.Indented; XmlSerializer ser = SerializedLibrary.CreateSerializer_v5(typeof(Project_v5)); Project_v5 ud = new ProjectSaver(sc).Serialize("/var/foo/foo.proj", project); ser.Serialize(writer, ud); fut.AssertFilesEqual(); } }
public void SudWrite() { Project_v5 ud = new Project_v5 { InputFiles = { new DecompilerInput_v5 { DisassemblyDirectory = "", User = new UserData_v4 { ExtractResources = true, Procedures = { new Procedure_v1 { Name = "foo", Signature = new SerializedSignature { ReturnValue = new Argument_v1 { Kind = new Register_v1("eax") }, Arguments = new Argument_v1[] { new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) }, new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) } } } } }, LoadAddress = "1000:0000", IndirectJumps = { new IndirectJump_v4 { InstructionAddress = "1000:0220", TableAddress = "1000:0228" }, }, JumpTables = { new JumpTable_v4 { TableAddress = "1000:0228", Destinations = new string[] { "1000:0230", "1000:0244", "1000:033F", } } } } } } }; using (FileUnitTester fut = new FileUnitTester("Core/SudWrite.txt")) { var writer = new FilteringXmlWriter(fut.TextWriter); writer.Formatting = System.Xml.Formatting.Indented; XmlSerializer ser = SerializedLibrary.CreateSerializer_v5(typeof(Project_v5)); ser.Serialize(writer, ud); fut.AssertFilesEqual(); } }
public void SudSaveProject() { Project project = new Project { Programs = { new Program { Image = new LoadedImage(Address.SegPtr(0x1000, 0), new byte[100]), DisassemblyFilename = "foo.asm", IntermediateFilename = "foo.cod", UserProcedures = new SortedList <Address, Procedure_v1> { { Address.SegPtr(0x1000, 0x10), new Procedure_v1 { Name = "foo", Signature = new SerializedSignature { ReturnValue = new Argument_v1{ Kind = new Register_v1("eax") }, Arguments = new Argument_v1[] { new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) }, new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) } } } } } }, UserGlobalData = { { Address.SegPtr(0x2000, 0), new GlobalDataItem_v2 { Address = Address.SegPtr(0x2000, 0).ToString(), DataType = new StringType_v2{ Termination = StringType_v2.ZeroTermination, CharType = new PrimitiveType_v1 { Domain = Domain.Character, ByteSize = 1 } } } } } } } }; using (FileUnitTester fut = new FileUnitTester("Core/SudSaveProject.txt")) { FilteringXmlWriter writer = new FilteringXmlWriter(fut.TextWriter); writer.Formatting = System.Xml.Formatting.Indented; XmlSerializer ser = SerializedLibrary.CreateSerializer_v2(typeof(Project_v2)); Project_v2 ud = new ProjectSaver().Save(project); ser.Serialize(writer, ud); fut.AssertFilesEqual(); } }
public void SudSaveProject() { Given_Architecture(); Given_TestOS_Platform(); var eax = new RegisterStorage("eax", 0, 0, PrimitiveType.Word32); var ecx = new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32); var jumpTable = new ImageMapVectorTable( Address.SegPtr(0x1000, 0x400), new Address[] { Address.SegPtr(0x1000, 0x500), Address.SegPtr(0x1000, 0x513), Address.SegPtr(0x1000, 0x5BA), }, 0); Project project = new Project { Programs = { new Program { Architecture = arch, Platform = platform, SegmentMap = new SegmentMap(Address.SegPtr(0x1000, 0)), //, new byte[100]), DisassemblyFilename = "foo.asm", IntermediateFilename = "foo.cod", User = new UserData { Procedures = { { Address.SegPtr(0x1000, 0x10), new Procedure_v1 { Name = "foo", Signature = new SerializedSignature { ReturnValue = new Argument_v1{ Kind = new Register_v1("eax") }, Arguments = new Argument_v1[] { new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) }, new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) } } } } } }, Globals = { { Address.SegPtr(0x2000, 0), new GlobalDataItem_v2 { Address = Address.SegPtr(0x2000, 0).ToString(), DataType = new StringType_v2{ Termination = StringType_v2.ZeroTermination, CharType = new PrimitiveType_v1 { Domain = Domain.Character, ByteSize = 1 } } } } }, Calls = { { Address.SegPtr(0x1000, 0x0320), new UserCallData { Address = Address.SegPtr(0x1000, 0x0320), NoReturn = true, } } }, RegisterValues = { { Address.Ptr32(0x012310), new List <UserRegisterValue> { new UserRegisterValue { Register = eax, Value = Constant.Word32(0x01231) }, new UserRegisterValue { Register = ecx, Value = Constant.Word32(0x42424711) }, } } }, IndirectJumps = { { Address.SegPtr(0x1000, 0x380), new UserIndirectJump { Address = jumpTable.Address, Table = jumpTable, IndexRegister = new RegisterStorage("R1", 1, 0, PrimitiveType.Word32) } } }, JumpTables = { { jumpTable.Address, jumpTable } } } } } }; mr.ReplayAll(); using (FileUnitTester fut = new FileUnitTester("Core/SudSaveProject.txt")) { FilteringXmlWriter writer = new FilteringXmlWriter(fut.TextWriter); writer.Formatting = System.Xml.Formatting.Indented; XmlSerializer ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4)); Project_v4 ud = new ProjectSaver(sc).Serialize("/var/foo/foo.proj", project); ser.Serialize(writer, ud); fut.AssertFilesEqual(); } }
public void SudSaveProject() { Given_Architecture(); Given_TestOS_Platform(); Project project = new Project { Programs = { new Program { Architecture = arch, Platform = platform, ImageMap = new ImageMap(Address.SegPtr(0x1000, 0)), //, new byte[100]), DisassemblyFilename = "foo.asm", IntermediateFilename = "foo.cod", User = new UserData { Procedures = { { Address.SegPtr(0x1000, 0x10), new Procedure_v1 { Name = "foo", Signature = new SerializedSignature { ReturnValue = new Argument_v1{ Kind = new Register_v1("eax") }, Arguments = new Argument_v1[] { new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) }, new Argument_v1 { Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.SignedInt, 4) } } } } } }, Globals = { { Address.SegPtr(0x2000, 0), new GlobalDataItem_v2 { Address = Address.SegPtr(0x2000, 0).ToString(), DataType = new StringType_v2{ Termination = StringType_v2.ZeroTermination, CharType = new PrimitiveType_v1 { Domain = Domain.Character, ByteSize = 1 } } } } }, Calls = { { Address.SegPtr(0x1000, 0x0320), new UserCallData { Address = Address.SegPtr(0x1000, 0x0320), NoReturn = true, } } } } } } }; mr.ReplayAll(); using (FileUnitTester fut = new FileUnitTester("Core/SudSaveProject.txt")) { FilteringXmlWriter writer = new FilteringXmlWriter(fut.TextWriter); writer.Formatting = System.Xml.Formatting.Indented; XmlSerializer ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4)); Project_v4 ud = new ProjectSaver(sc).Save("/var/foo/foo.proj", project); ser.Serialize(writer, ud); fut.AssertFilesEqual(); } }