Пример #1
0
        public void Prld_MakePathsAbsolute()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                    }
                }
            };

            Given_TestArch();
            Given_TestOS();
            var ldr = new Mock <ILoader>();

            ldr.Setup(l => l.LoadExecutable(
                          It.IsAny <string>(),
                          It.IsAny <byte[]>(),
                          It.IsAny <string>(),
                          It.IsAny <Address>())).Returns(new Program());
            ldr.Setup(l => l.LoadImageBytes(
                          It.IsAny <string>(),
                          It.IsAny <int>())).Returns(new byte[1000]);

            var prld    = new ProjectLoader(sc, ldr.Object, listener.Object);
            var project = prld.LoadProject(OsPath.Absolute("users", "bob", "projects", "foo.project"), sProject);

            Assert.AreEqual(OsPath.Absolute("users", "bob", "projects", "foo.exe"), project.Programs[0].Filename);
        }
Пример #2
0
        public void Prld_MakePathsAbsolute_From_Filename()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                InputFiles       =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                    },
                }
            };

            Given_TestArch();
            Given_TestOS();
            var ldr = new Mock <ILoader>();

            ldr.Setup(l => l.Load(
                          It.IsAny <ImageLocation>(),
                          It.IsAny <string>(),
                          It.IsAny <Address>())).Returns(new Program());
            ldr.Setup(l => l.LoadFileBytes(
                          It.IsAny <string>())).Returns(new byte[1000]);

            var location = ImageLocation.FromUri(OsPath.Absolute("users", "bob", "projects", "foo.project"));
            var prld     = new ProjectLoader(sc, ldr.Object, location, listener.Object);
            var project  = prld.LoadProject(sProject);

            var programUri = project.Programs[0].Location;

            Assert.AreEqual(OsPath.Absolute("users", "bob", "projects", "foo.exe"), programUri.FilesystemPath);
        }
Пример #3
0
        public void Save_v4()
        {
            var sp = new Project_v4
            {
                Inputs =
                {
                    new DecompilerInput_v4       {
                        Filename = "foo.exe",
                        User     = new UserData_v4 {
                            Heuristics =
                            {
                                new Heuristic_v3 {
                                    Name = "shingle"
                                }
                            }
                        }
                    },
                    new AssemblerFile_v3         {
                        Filename = "foo.asm", Assembler = "x86-att"
                    }
                }
            };
            var xw = new FilteringXmlWriter(new StringWriter());

            new ProjectSaver(sc).Save(sp, xw);
        }
Пример #4
0
        public void Prld_EnableExtractResources()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            ExtractResources = true
                        }
                    }
                }
            };

            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            var prld    = new ProjectLoader(sc, ldr, listener.Object);
            var project = prld.LoadProject("foo.dcproject", sProject);

            Assert.IsTrue(project.Programs[0].User.ExtractResources);
        }
Пример #5
0
        public void Prld_MakePathsAbsolute()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                    }
                }
            };

            Given_TestArch();
            Given_TestOS();
            var ldr = mr.Stub <ILoader>();

            ldr.Stub(l => l.LoadExecutable(null, null, null)).IgnoreArguments().Return(new Program());
            ldr.Stub(l => l.LoadImageBytes(null, 0)).IgnoreArguments().Return(new byte[1000]);
            mr.ReplayAll();

            var prld    = new ProjectLoader(sc, ldr);
            var project = prld.LoadProject(OsPath.Absolute("users", "bob", "projects", "foo.project"), sProject);

            Assert.AreEqual(OsPath.Absolute("users", "bob", "projects", "foo.exe"), project.Programs[0].Filename);
        }
Пример #6
0
        public void Prld_UserSegments()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                InputFiles       =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                        User     = new UserData_v4
                        {
                            Segments =
                            {
                                new Segment_v4
                                {
                                    Name = "text", Address = "00123400", Length = "C00", Architecture = "testArch", Access = "r-x",
                                },
                                new Segment_v4
                                {
                                    Name = "data", Address = "00200000", Offset = "C00", Length = "1200", Access = "rw"
                                },
                            }
                        }
                    }
                }
            };

            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            Address addr = Address.Ptr32(0x00123400);

            platform.Setup(p => p.TryParseAddress("00123400", out addr)).Returns(true);
            addr = Address.Ptr32(0x00200000);
            platform.Setup(p => p.TryParseAddress("00200000", out addr)).Returns(true);

            var location = ImageLocation.FromUri("foo.dcproject");
            var prld     = new ProjectLoader(sc, ldr, location, listener.Object);
            var prj      = prld.LoadProject(sProject);

            var u = prj.Programs[0].User;

            Assert.AreEqual(2, u.Segments.Count);

            Assert.AreEqual("text", u.Segments[0].Name);
            Assert.AreEqual("00123400", u.Segments[0].Address.ToString());
            Assert.AreEqual(0xC00, u.Segments[0].Length);
            Assert.AreEqual(0, u.Segments[0].Offset);
            Assert.AreEqual(AccessMode.ReadExecute, u.Segments[0].AccessMode);

            Assert.AreEqual("data", u.Segments[1].Name);
            Assert.AreEqual("00200000", u.Segments[1].Address.ToString());
            Assert.AreEqual(0x1200, u.Segments[1].Length);
            Assert.AreEqual(0x0C00, u.Segments[1].Offset);
            Assert.AreEqual(AccessMode.ReadWrite, u.Segments[1].AccessMode);
        }
Пример #7
0
        public void SudLoadProgramOptions()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs = 
                {
                    new DecompilerInput_v4
                    {
                        Filename = "c:\\tmp\\foo\\foo.exe",
                        User = new UserData_v4
                        {
                            Heuristics = { new Heuristic_v3 { Name="HeuristicScanning" } },
                            TextEncoding = "windows-1251",
                            Calls =
                            {
                                new SerializedCall_v1
                                {
                                    InstructionAddress = "0041230",
                                    NoReturn = true, 
                                }
                            },
                            RegisterValues = new RegisterValue_v2[]
                            {
                                new RegisterValue_v2 { Address="00443210", Register="eax", Value="42" },
                                new RegisterValue_v2 { Address="00443210", Register="ecx", Value="10" },
                            }
                        }
                    }
                }
            };
            Given_Architecture();
            Given_TestOS_Platform();
            Expect_TryParseAddress("0041230", Address.Ptr32(0x0041230));
            Expect_TryParseAddress("00443210", Address.Ptr32(0x00443210));
            arch.Setup(a => a.GetRegister("eax")).Returns(new RegisterStorage("eax", 0, 0, PrimitiveType.Word32));
            arch.Setup(a => a.GetRegister("ecx")).Returns(new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32));
            var loader = new Mock<ILoader>();
            loader.Setup(l => l.LoadImageBytes(It.IsAny<string>(), It.IsAny<int>()))
                .Returns(new byte[10]);
            loader.Setup(l => l.LoadExecutable(
                It.IsAny<string>(),
                It.IsAny<byte[]>(),
                It.IsAny<string>(),
                It.IsAny<Address>()))
                .Returns(new Program
                {
                    Platform = this.platform.Object
                });

            var ploader = new ProjectLoader(sc, loader.Object, listener.Object);
            var project = ploader.LoadProject("c:\\tmp\\foo\\bar.proj", sProject);
            Assert.IsTrue(project.Programs[0].User.Heuristics.Contains("HeuristicScanning"));
            Assert.AreEqual("windows-1251", project.Programs[0].User.TextEncoding.WebName);
            Assert.AreEqual(1, project.Programs[0].User.RegisterValues.Count);
            Assert.AreEqual(2, project.Programs[0].User.RegisterValues[Address.Ptr32(0x00443210)].Count);
        }
Пример #8
0
        public void SudWrite()
        {
            Project_v4 ud = new Project_v4
            {
                Inputs =
                {
                    new DecompilerInput_v4
                    {
                        DisassemblyFilename  = "foo.asm",
                        IntermediateFilename = "foo.cod",
                        User = new UserData_v4{
                            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 = "0x1000:0x0",
                        }
                    }
                }
            };

            using (FileUnitTester fut = new FileUnitTester("Core/SudWrite.txt"))
            {
                var writer = new FilteringXmlWriter(fut.TextWriter);
                writer.Formatting = System.Xml.Formatting.Indented;
                XmlSerializer ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4));
                ser.Serialize(writer, ud);
                fut.AssertFilesEqual();
            }
        }
Пример #9
0
        public void SudLoadProgramOptions()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            Heuristics ={ new Heuristic_v3                  {
                                      Name = "HeuristicScanning"
                                  } },
                            TextEncoding = "windows-1251",
                            Calls        =
                            {
                                new SerializedCall_v1
                                {
                                    InstructionAddress = "0041230",
                                    NoReturn           = true,
                                }
                            }
                        }
                    }
                }
            };

            Given_Architecture();
            Given_TestOS_Platform();
            platform.Stub(p => p.TryParseAddress(
                              Arg <string> .Is.Equal("0041230"),
                              out Arg <Address> .Out(Address.Ptr32(0x0041230)).Dummy)).Return(true);
            var loader = mr.Stub <ILoader>();

            loader.Stub(l => l.LoadImageBytes(null, 0))
            .IgnoreArguments()
            .Return(new byte[10]);
            loader.Stub(l => l.LoadExecutable(null, null, null))
            .IgnoreArguments()
            .Return(new Program
            {
                Platform = this.platform,
            });
            mr.ReplayAll();

            var ploader = new ProjectLoader(sc, loader);
            var project = ploader.LoadProject("c:\\tmp\\foo\\bar.proj", sProject);

            Assert.IsTrue(project.Programs[0].User.Heuristics.Contains("HeuristicScanning"));
            Assert.AreEqual("windows-1251", project.Programs[0].User.TextEncoding.WebName);
        }
Пример #10
0
        public void Prld_LoadGlobalUserData()
        {
            Given_TestArch();
            Given_TestOS();
            Expect_Arch_ParseAddress("10000010", Address.Ptr32(0x10000010));

            var sproject = new Project_v4
            {
                ArchitectureName = arch.Object.Name,
                PlatformName     = platform.Object.Name,
                InputFiles       =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "c:\\tmp\\foo\\foo.exe",
                        User     = new UserData_v4
                        {
                            GlobalData =
                            {
                                new GlobalDataItem_v2
                                {
                                    Address  = "10000010",
                                    Name     = "testVar",
                                    DataType = new ArrayType_v1
                                    {
                                        ElementType = new TypeReference_v1
                                        {
                                            TypeName = "Blob"
                                        },
                                        Length = 10
                                    }
                                }
                            }
                        }
                    },
                }
            };
            var ldr = mockFactory.CreateLoader();

            var prld    = new ProjectLoader(sc, ldr, listener.Object);
            var project = prld.LoadProject(
                @"c:\foo\global_user.proj",
                sproject);

            Assert.AreEqual(1, project.Programs.Count);
            Assert.AreEqual(1, project.Programs[0].User.Globals.Count);
            var globalVariable = project.Programs[0].User.Globals.Values[0];

            Assert.AreEqual("10000010", globalVariable.Address.ToString());
            Assert.AreEqual("testVar", globalVariable.Name);
            Assert.AreEqual("arr(Blob,10)", globalVariable.DataType.ToString());
        }
Пример #11
0
        public void Prld_LoadGlobalUserData()
        {
            var sproject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            GlobalData =
                            {
                                new GlobalDataItem_v2
                                {
                                    Address  = "10000010",
                                    Name     = "testVar",
                                    DataType = new ArrayType_v1
                                    {
                                        ElementType = new TypeReference_v1
                                        {
                                            TypeName = "Blob"
                                        },
                                        Length = 10
                                    }
                                }
                            }
                        }
                    },
                }
            };
            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            mr.ReplayAll();

            var prld    = new ProjectLoader(sc, ldr);
            var project = prld.LoadProject(
                @"c:\foo\global_user.proj",
                sproject);

            Assert.AreEqual(1, project.Programs.Count);
            Assert.AreEqual(1, project.Programs[0].User.Globals.Count);
            var globalVariable = project.Programs[0].User.Globals.Values[0];

            Assert.AreEqual("10000010", globalVariable.Address);
            Assert.AreEqual("testVar", globalVariable.Name);
            Assert.AreEqual("arr(Blob,10)", globalVariable.DataType.ToString());
        }
Пример #12
0
 public Project_v4 Save(string projectAbsPath, Project project)
 {
     var inputs = new List<ProjectFile_v3>();
     inputs.AddRange(project.Programs.Select(p => VisitProgram(projectAbsPath, p)));
     inputs.AddRange(project.MetadataFiles.Select(m => VisitMetadataFile(projectAbsPath, m)));
     var sp = new Project_v4
     {
         // ".Single()" because there can be only one Architecture and Platform, realistically.
         ArchitectureName = project.Programs.Select(p => p.Architecture.Name).Distinct().SingleOrDefault(),
         PlatformName = project.Programs.Select(p => p.Platform.Name).Distinct().SingleOrDefault(),   
         Inputs = inputs
     };
     return sp;
 }
Пример #13
0
        private void When_SaveToTextWriter(Program program, TextWriter sw)
        {
            var saver = new ProjectSaver(sc);
            var sProj = new Project_v4
            {
                Inputs = { saver.VisitProgram("foo.exe", program) }
            };
            var writer = new FilteringXmlWriter(sw);

            writer.Formatting = System.Xml.Formatting.Indented;
            XmlSerializer ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4));

            ser.Serialize(writer, sProj);
        }
Пример #14
0
        public void Prld_LoadAnnotation()
        {
            var sproject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "c:\\tmp\\foo\\foo.exe",
                        User     = new UserData_v4
                        {
                            Annotations =
                            {
                                new Annotation_v3
                                {
                                    Address = "commentAddress",
                                    Text    = "User comment",
                                }
                            }
                        }
                    },
                }
            };
            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            var addr = Address.Ptr32(0x0000CADD);

            arch.Setup(a => a.TryParseAddress(
                           "commentAddress",
                           out addr))
            .Returns(true);

            var prld    = new ProjectLoader(sc, ldr, listener.Object);
            var project = prld.LoadProject(
                @"c:\foo\annot.proj",
                sproject);

            Assert.AreEqual(1, project.Programs.Count);
            Assert.AreEqual(1, project.Programs[0].User.Annotations.Count());
            var annotation = project.Programs[0].User.Annotations.First();

            Assert.AreEqual("0000CADD", annotation.Address.ToString());
            Assert.AreEqual("User comment", annotation.Text);
        }
Пример #15
0
        public void Prld_Partial_UserProc()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                InputFiles       =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "c:\\tmp\\foo\\foo.exe",
                        User     = new UserData_v4
                        {
                            Procedures =
                            {
                                new Procedure_v1
                                {
                                    Address   = "00123400",
                                    Decompile = false,
                                }
                            }
                        }
                    }
                }
            };

            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            var addrNav = new Mock <ICodeLocation>();

            listener.Setup(l => l.CreateAddressNavigator(It.IsAny <Program>(), It.IsAny <Address>()))
            .Returns(addrNav.Object);
            listener.Setup(l => l.Warn(
                               It.IsAny <ICodeLocation>(),
                               It.IsAny <string>(),
                               It.IsAny <object[]>()))
            .Verifiable();

            var location = ImageLocation.FromUri("foo.dcproject");
            var prld     = new ProjectLoader(sc, ldr, location, listener.Object);

            prld.LoadProject(sProject);

            listener.Verify();
        }
Пример #16
0
        public void Prld_LoadAnnotation()
        {
            var sproject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            Annotations =
                            {
                                new Annotation_v3
                                {
                                    Address = "commentAddress",
                                    Text    = "User comment",
                                }
                            }
                        }
                    },
                }
            };
            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            arch.Stub(a => a.TryParseAddress(
                          Arg <string> .Is.Equal("commentAddress"),
                          out Arg <Address> .Out(Address.Ptr32(0x0000CADD)).Dummy))
            .Return(true);
            mr.ReplayAll();

            var prld    = new ProjectLoader(sc, ldr, listener);
            var project = prld.LoadProject(
                @"c:\foo\annot.proj",
                sproject);

            Assert.AreEqual(1, project.Programs.Count);
            Assert.AreEqual(1, project.Programs[0].User.Annotations.Count());
            var annotation = project.Programs[0].User.Annotations.First();

            Assert.AreEqual("0000CADD", annotation.Address.ToString());
            Assert.AreEqual("User comment", annotation.Text);
        }
Пример #17
0
        public void Prld_Partial_UserProc()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            Procedures =
                            {
                                new Procedure_v1
                                {
                                    Address   = "00123400",
                                    Decompile = false,
                                }
                            }
                        }
                    }
                }
            };

            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            var addrNav = mr.Stub <ICodeLocation>();

            listener.Stub(l => l.CreateAddressNavigator(null, null))
            .IgnoreArguments()
            .Return(addrNav);
            listener.Expect(l => l.Warn(null, null, null))
            .IgnoreArguments();
            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr, listener);

            prld.LoadProject("foo.dcproject", sProject);

            mr.VerifyAll();
        }
Пример #18
0
        public void Prld_LoadUserDefinedMetadata()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                    },
                    new MetadataFile_v3 {
                        Filename = "meta1.xml",
                    },
                    new MetadataFile_v3 {
                        Filename = "meta2.xml",
                    },
                }
            };

            var types1 = new Dictionary <string, DataType>()
            {
                { "USRTYPE1", PrimitiveType.Word16 }
            };
            var types2 = new Dictionary <string, DataType>()
            {
                { "USRTYPE2", PrimitiveType.Word32 }
            };

            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();

            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta1.xml"),
                this.platform,
                new TypeLibrary(
                    types1, new Dictionary <string, ProcedureSignature>()
                    )
                );
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta2.xml"),
                this.platform,
                new TypeLibrary(
                    types2, new Dictionary <string, ProcedureSignature>()
                    )
                );
            mr.ReplayAll();

            var prld    = new ProjectLoader(sc, ldr);
            var project = prld.LoadProject(OsPath.Absolute("foo.project"), sProject);

            Assert.AreEqual(2, project.Programs[0].EnvironmentMetadata.Types.Count);
            Assert.AreEqual(
                "word16",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE1"].ToString()
                );
            Assert.AreEqual(
                "word32",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE2"].ToString()
                );
        }
Пример #19
0
        public void SudLoadProgramOptions()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs = 
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            Heuristics = { new Heuristic_v3 { Name="HeuristicScanning" } },
                            TextEncoding = "windows-1251",
                            Calls =
                            {
                                new SerializedCall_v1
                                {
                                    InstructionAddress = "0041230",
                                    NoReturn = true, 
                                }
                            },
                            RegisterValues = new RegisterValue_v2[]
                            {
                                new RegisterValue_v2 { Address="00443210", Register="eax", Value="42" },
                                new RegisterValue_v2 { Address="00443210", Register="ecx", Value="10" },
                            }
                        }
                    }
                }
            };
            Given_Architecture();
            Given_TestOS_Platform();
            Expect_TryParseAddress("0041230", Address.Ptr32(0x0041230));
            Expect_TryParseAddress("00443210", Address.Ptr32(0x00443210));
            arch.Stub(a => a.GetRegister("eax")).Return(new RegisterStorage("eax", 0, 0, PrimitiveType.Word32));
            arch.Stub(a => a.GetRegister("ecx")).Return(new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32));
            var loader = mr.Stub<ILoader>();
            loader.Stub(l => l.LoadImageBytes(null, 0))
                .IgnoreArguments()
                .Return(new byte[10]);
            loader.Stub(l => l.LoadExecutable(null, null, null))
                .IgnoreArguments()
                .Return(new Program
                {
                    Platform = this.platform,
                });
            mr.ReplayAll();

            var ploader = new ProjectLoader(sc, loader);
            var project = ploader.LoadProject("c:\\tmp\\foo\\bar.proj", sProject);
            Assert.IsTrue(project.Programs[0].User.Heuristics.Contains("HeuristicScanning"));
            Assert.AreEqual("windows-1251", project.Programs[0].User.TextEncoding.WebName);
            Assert.AreEqual(1, project.Programs[0].User.RegisterValues.Count);
            Assert.AreEqual(2, project.Programs[0].User.RegisterValues[Address.Ptr32(0x00443210)].Count);
        }
Пример #20
0
 private void When_SaveToTextWriter(Program program, TextWriter sw)
 {
     var saver = new ProjectSaver(sc);
     var sProj = new Project_v4
     {
         Inputs = { saver.VisitProgram("foo.exe", program) }
     };
     var writer = new FilteringXmlWriter(sw);
     writer.Formatting = System.Xml.Formatting.Indented;
     XmlSerializer ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4));
     ser.Serialize(writer, sProj);
 }
Пример #21
0
        public void Prld_LoadUserDefinedMetadata()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                        User     = new UserData_v4
                        {
                            LoadAddress = "00123400"
                        }
                    },
                    new MetadataFile_v3 {
                        Filename = "meta1.xml",
                    },
                    new MetadataFile_v3 {
                        Filename = "meta2.xml",
                    },
                }
            };

            var types1 = new Dictionary <string, DataType>()
            {
                { "USRTYPE1", PrimitiveType.Word16 }
            };
            var types2 = new Dictionary <string, DataType>()
            {
                { "USRTYPE2", PrimitiveType.Word32 }
            };

            var ldr = mockFactory.CreateLoader();

            Given_TestArch();
            Given_TestOS();
            var addr = Address.Ptr32(0x00123400);

            arch.Setup(a => a.TryParseAddress(
                           "00123400",
                           out addr))
            .Returns(true);
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta1.xml"),
                this.platform.Object,
                new TypeLibrary(
                    types1, new Dictionary <string, FunctionType>(), new Dictionary <string, DataType>()
                    )
                );
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta2.xml"),
                this.platform.Object,
                new TypeLibrary(
                    types2, new Dictionary <string, FunctionType>(), new Dictionary <string, DataType>()
                    )
                );

            var prld    = new ProjectLoader(sc, ldr, listener.Object);
            var project = prld.LoadProject(OsPath.Absolute("foo.project"), sProject);

            Assert.AreEqual(2, project.Programs[0].EnvironmentMetadata.Types.Count);
            Assert.AreEqual(
                "word16",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE1"].ToString()
                );
            Assert.AreEqual(
                "word32",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE2"].ToString()
                );
            Assert.AreEqual(
                Address.Ptr32(0x00123400),
                project.Programs[0].User.LoadAddress);
        }
Пример #22
0
        public void Prld_LoadGlobalUserData()
        {
            var sproject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            GlobalData =
                            {
                                new GlobalDataItem_v2
                                {
                                    Address = "10000010",
                                    Name = "testVar",
                                    DataType = new ArrayType_v1
                                    {
                                        ElementType = new TypeReference_v1
                                        {
                                             TypeName = "Blob"
                                        },
                                        Length = 10
                                    }
                                }
                            }
                        }
                    },
                   
                }
            };
            var ldr = mockFactory.CreateLoader();
            Given_TestArch();
            Given_TestOS();
            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr);
            var project = prld.LoadProject(
                @"c:\foo\global_user.proj",
                sproject);

            Assert.AreEqual(1, project.Programs.Count);
            Assert.AreEqual(1, project.Programs[0].User.Globals.Count);
            var globalVariable = project.Programs[0].User.Globals.Values[0];
            Assert.AreEqual("10000010", globalVariable.Address);
            Assert.AreEqual("testVar", globalVariable.Name);
            Assert.AreEqual("arr(Blob,10)", globalVariable.DataType.ToString());
        }
Пример #23
0
        public void Prld_LoadUserDefinedMetadata()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                    },
                    new MetadataFile_v3 {
                        Filename = "meta1.xml",
                    },
                    new MetadataFile_v3 {
                        Filename = "meta2.xml",
                    },
                }
            };

            var types1 = new Dictionary<string, DataType>()
            {
                {"USRTYPE1", PrimitiveType.Word16}
            };
            var types2 = new Dictionary<string, DataType>()
            {
                {"USRTYPE2", PrimitiveType.Word32}
            };

            var ldr = mockFactory.CreateLoader();
            Given_TestArch();
            Given_TestOS();

            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta1.xml"),
                this.platform,
                new TypeLibrary(
                    types1, new Dictionary<string, FunctionType>(), new Dictionary<string, DataType>()
                )
            );
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta2.xml"),
                this.platform,
                new TypeLibrary(
                    types2, new Dictionary<string, FunctionType>(), new Dictionary<string, DataType>()
                )
            );
            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr);
            var project = prld.LoadProject(OsPath.Absolute("foo.project"), sProject);
            Assert.AreEqual(2, project.Programs[0].EnvironmentMetadata.Types.Count);
            Assert.AreEqual(
                "word16",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE1"].ToString()
            );
            Assert.AreEqual(
                "word32",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE2"].ToString()
            );
        }
Пример #24
0
        public void Prld_MakePathsAbsolute()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                    }
                }
            };
            Given_TestArch();
            Given_TestOS();
            var ldr = mr.Stub<ILoader>();
            ldr.Stub(l => l.LoadExecutable(null, null, null)).IgnoreArguments().Return(new Program());
            ldr.Stub(l => l.LoadImageBytes(null, 0)).IgnoreArguments().Return(new byte[1000]);
            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr);
            var project = prld.LoadProject(OsPath.Absolute("users", "bob", "projects", "foo.project"), sProject);
            Assert.AreEqual(OsPath.Absolute("users", "bob", "projects", "foo.exe"), project.Programs[0].Filename);
        }
Пример #25
0
        public void Prld_LoadUserDefinedMetadata()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs =
                {
                    new DecompilerInput_v4
                    {
                        Filename = "foo.exe",
                        User = new UserData_v4
                        {
                            LoadAddress = "00123400"
                        }
                    },
                    new MetadataFile_v3 {
                        Filename = "meta1.xml",
                    },
                    new MetadataFile_v3 {
                        Filename = "meta2.xml",
                    },
                }
            };

            var types1 = new Dictionary<string, DataType>()
            {
                {"USRTYPE1", PrimitiveType.Word16}
            };
            var types2 = new Dictionary<string, DataType>()
            {
                {"USRTYPE2", PrimitiveType.Word32}
            };

            var ldr = mockFactory.CreateLoader();
            Given_TestArch();
            Given_TestOS();
            arch.Stub(a => a.TryParseAddress(
                Arg<string>.Is.Equal("00123400"),
                out Arg<Address>.Out(Address.Ptr32(0x00123400)).Dummy))
                .Return(true);
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta1.xml"),
                this.platform,
                new TypeLibrary(
                    types1, new Dictionary<string, FunctionType>(), new Dictionary<string, DataType>()
                )
            );
            mockFactory.CreateLoadMetadataStub(
                OsPath.Absolute("meta2.xml"),
                this.platform,
                new TypeLibrary(
                    types2, new Dictionary<string, FunctionType>(), new Dictionary<string, DataType>()
                )
            );
            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr, listener);
            var project = prld.LoadProject(OsPath.Absolute("foo.project"), sProject);
            Assert.AreEqual(2, project.Programs[0].EnvironmentMetadata.Types.Count);
            Assert.AreEqual(
                "word16",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE1"].ToString()
            );
            Assert.AreEqual(
                "word32",
                project.Programs[0].EnvironmentMetadata.Types["USRTYPE2"].ToString()
            );
            Assert.AreEqual(
                Address.Ptr32(0x00123400),
                project.Programs[0].User.LoadAddress);
        }
Пример #26
0
 public void Save_v4()
 {
     var sp = new Project_v4
     {
         Inputs = {
             new DecompilerInput_v3 {
                 Filename ="foo.exe",
                 User = new UserData_v3 {
                     Heuristics = {
                         new Heuristic_v3 { Name = "shingle" }
                     }
                 }
             },
             new AssemblerFile_v3 { Filename="foo.asm", Assembler="x86-att" }
         }
     };
     var sw = new StringWriter();
     new ProjectSaver(sc).Save(sp, sw);
     Console.WriteLine(sw);
 }
Пример #27
0
        public void Prld_Partial_UserProc()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            Procedures =
                            {
                                new Procedure_v1
                                {
                                    Address = "00123400",
                                    Decompile = false,
                                }
                            }
                        }
                    }
                }
            };

            var ldr = mockFactory.CreateLoader();
            Given_TestArch();
            Given_TestOS();
            var addrNav = mr.Stub<ICodeLocation>();
            listener.Stub(l => l.CreateAddressNavigator(null, null))
                .IgnoreArguments()
                .Return(addrNav);
            listener.Expect(l => l.Warn(null, null, null))
                .IgnoreArguments();
            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr, listener);
            prld.LoadProject("foo.dcproject", sProject);

            mr.VerifyAll();
        }
Пример #28
0
        public void SudWrite()
        {
            Project_v4 ud = new Project_v4
            {
                Inputs =
                {
                    new DecompilerInput_v4
                    {
                        DisassemblyFilename = "foo.asm",
                        IntermediateFilename = "foo.cod",
                        User = new UserData_v4 {
                            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_v4(typeof(Project_v4));
				ser.Serialize(writer, ud);
				fut.AssertFilesEqual();
			}
		}
Пример #29
0
        public void SudLoadProgramOptions()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        User = new UserData_v4
                        {
                            Heuristics =             { new Heuristic_v3                  {
                                                           Name = "HeuristicScanning"
                                                       } },
                            TextEncoding = "windows-1251",
                            Calls        =
                            {
                                new SerializedCall_v1
                                {
                                    InstructionAddress = "0041230",
                                    NoReturn           = true,
                                }
                            },
                            RegisterValues = new RegisterValue_v2[]
                            {
                                new RegisterValue_v2 {
                                    Address = "00443210", Register = "eax", Value = "42"
                                },
                                new RegisterValue_v2 {
                                    Address = "00443210", Register = "ecx", Value = "10"
                                },
                            }
                        }
                    }
                }
            };

            Given_Architecture();
            Given_TestOS_Platform();
            Expect_TryParseAddress("0041230", Address.Ptr32(0x0041230));
            Expect_TryParseAddress("00443210", Address.Ptr32(0x00443210));
            var loader = mr.Stub <ILoader>();

            loader.Stub(l => l.LoadImageBytes(null, 0))
            .IgnoreArguments()
            .Return(new byte[10]);
            loader.Stub(l => l.LoadExecutable(null, null, null))
            .IgnoreArguments()
            .Return(new Program
            {
                Platform = this.platform,
            });
            mr.ReplayAll();

            var ploader = new ProjectLoader(sc, loader);
            var project = ploader.LoadProject("c:\\tmp\\foo\\bar.proj", sProject);

            Assert.IsTrue(project.Programs[0].User.Heuristics.Contains("HeuristicScanning"));
            Assert.AreEqual("windows-1251", project.Programs[0].User.TextEncoding.WebName);
            Assert.AreEqual(1, project.Programs[0].User.RegisterValues.Count);
            Assert.AreEqual(2, project.Programs[0].User.RegisterValues[Address.Ptr32(0x00443210)].Count);
        }
Пример #30
0
        public void Ps_Load_v4()
        {
            var bytes = new byte[100];
            loader.Stub(l => l.LoadImageBytes(null, 0)).IgnoreArguments().Return(bytes);
            loader.Stub(l => l.LoadExecutable(null, null, null)).IgnoreArguments().Return(
                new Program { Architecture = arch });
            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.Stub(a => a.GetRegister("r1")).Return(new RegisterStorage("r1", 1, 0, PrimitiveType.Word32));
            mr.ReplayAll();

            var sp = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName = "testOS",
                Inputs = {
                    new DecompilerInput_v4
                    {
                        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",
                                    }
                                }
                            }
                        }
                    }
                }
            };
            var ps = new ProjectLoader(sc, loader);
            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);

        }
Пример #31
0
 public void Save(Project_v4 sProject, TextWriter sw)
 {
     var ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4));
     ser.Serialize(sw, sProject);
 }
Пример #32
0
 public void Save(Project_v4 sProject, XmlWriter xw)
 {
     var ser = SerializedLibrary.CreateSerializer_v4(typeof(Project_v4));
     ser.Serialize(xw, sProject);
 }
Пример #33
0
        public void Ps_Load_v4()
        {
            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_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        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",
                                    }
                                }
                            }
                        }
                    }
                }
            };
            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);
        }
Пример #34
0
        public void Ps_Load_v4()
        {
            var bytes = new byte[100];

            loader.Stub(l => l.LoadImageBytes(null, 0)).IgnoreArguments().Return(bytes);
            loader.Stub(l => l.LoadExecutable(null, null, null)).IgnoreArguments().Return(
                new Program {
                Architecture = arch
            });
            Given_Architecture();
            Given_TestOS_Platform();
            mr.ReplayAll();

            var sp = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                Inputs           =
                {
                    new DecompilerInput_v4
                    {
                        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)
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            };
            var ps = new ProjectLoader(sc, loader);
            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);
        }