public void SudWrite() { Project_v5 ud = new Project_v5 { Inputs = { 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 Ps_Load_v5() { var bytes = new byte[100]; loader.Setup(l => l.LoadImageBytes( It.IsAny <string>(), It.IsAny <int>())). Returns(bytes); loader.Setup(l => l.LoadExecutable( It.IsAny <string>(), It.IsAny <byte[]>(), It.IsAny <string>(), It.IsAny <Address>())).Returns( new Program { Architecture = arch.Object }); Given_Architecture(); Given_TestOS_Platform(); Given_Platform_Address("113800", 0x113800); Given_Platform_Address("114000", 0x114000); Given_Platform_Address("115000", 0x115000); Given_Platform_Address("115012", 0x115012); Given_Platform_Address("11504F", 0x11504F); arch.Setup(a => a.GetRegister("r1")).Returns(new RegisterStorage("r1", 1, 0, PrimitiveType.Word32)); var sp = new Project_v5 { ArchitectureName = "testArch", PlatformName = "testOS", Inputs = { new DecompilerInput_v5 { Filename = "f.exe", User = new UserData_v4 { Procedures = { new Procedure_v1 { Name = "Fn", Decompile = true, Characteristics = new ProcedureCharacteristics { Terminates = true, }, Address = "113300", Signature = new SerializedSignature{ ReturnValue = new Argument_v1{ Type = new PrimitiveType_v1(Domain.SignedInt, 4), }, Arguments = new Argument_v1[]{ new Argument_v1 { Name = "a", Kind = new StackVariable_v1(), Type = new PrimitiveType_v1(Domain.Character, 2) }, new Argument_v1 { Name = "b", Kind = new StackVariable_v1(), Type = new PointerType_v1{ DataType = new PrimitiveType_v1(Domain.Character, 2) } } } } } }, IndirectJumps = { new IndirectJump_v4 { InstructionAddress = "113800", IndexRegister = "r1", TableAddress = "114000", } }, JumpTables = { new JumpTable_v4 { TableAddress = "114000", Destinations = new [] { "115000", "115012", "11504F", } } }, OutputFilePolicy = Program.SegmentFilePolicy, BlockLabels = { new BlockLabel_v1 { Location = "115252", Name = "errorExit", } } } } } }; var ps = new ProjectLoader(sc, loader.Object, listener.Object); var p = ps.LoadProject("c:\\tmp\\fproj.proj", sp); Assert.AreEqual(1, p.Programs.Count); var inputFile = p.Programs[0]; Assert.AreEqual(1, inputFile.User.Procedures.Count); Assert.AreEqual("Fn", inputFile.User.Procedures.First().Value.Name); Assert.AreEqual(1, inputFile.User.JumpTables.Count); var jumpTable = inputFile.User.JumpTables[Address.Ptr32(0x114000)]; Assert.AreEqual(Address.Ptr32(0x00115000), jumpTable.Addresses[0]); Assert.AreEqual(Address.Ptr32(0x00115012), jumpTable.Addresses[1]); Assert.AreEqual(Address.Ptr32(0x0011504F), jumpTable.Addresses[2]); Assert.AreEqual(1, inputFile.User.IndirectJumps.Count); var indJump = inputFile.User.IndirectJumps[Address.Ptr32(0x00113800)]; Assert.AreSame(jumpTable, indJump.Table); Assert.AreEqual(1, inputFile.User.BlockLabels.Count); var blockLabel = inputFile.User.BlockLabels["115252"]; Assert.AreEqual("errorExit", blockLabel); Assert.AreEqual(Program.SegmentFilePolicy, inputFile.User.OutputFilePolicy); }