Exemplo n.º 1
0
        public void Prld_Procedure_Placement()
        {
            var sProject = new Project_v5
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                InputFiles       =
                {
                    new DecompilerInput_v5
                    {
                        Filename = Path.Combine("foo", "bar.exe"),
                        User     = new UserData_v4
                        {
                            Procedures =
                            {
                                new Procedure_v1
                                {
                                    Address    = "00123400",
                                    OutputFile = Path.Combine("src", "bar.c")
                                }
                            }
                        }
                    },
                }
            };
            var ldr = mockFactory.CreateLoader();

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

            platform.Setup(p => p.TryParseAddress("00123400", out addr)).Returns(true);

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

            var u         = prj.Programs[0].User;
            var placement = u.ProcedureSourceFiles[addr];

            Assert.IsTrue(IsPathEndingWith(placement, "foo/src/bar.c"));
        }
Exemplo n.º 2
0
        public void Sud_LoadProject_Inputs_v2()
        {
            Given_Loader();
            Given_Architecture();
            Expect_Arch_ParseAddress("1000:0400", Address.SegPtr(0x1000, 0x0400));
            Given_ExecutableProgram("foo.exe", Address.SegPtr(0x1000, 0x0000));
            Given_BinaryFile("foo.bin", Address.SegPtr(0x1000, 0x0000));


            var sProject = new Project_v2
            {
                Inputs = {
                    new DecompilerInput_v2 {
                        Filename = "foo.exe",
                        Address = "1000:0000",
                        Comment = "main file",
                        UserGlobalData = new List<GlobalDataItem_v2>
                        {
                            new GlobalDataItem_v2 { Address = "1000:0400", DataType = new StringType_v2 { 
                                Termination=StringType_v2.ZeroTermination,
                                CharType= new PrimitiveType_v1 { ByteSize = 1, Domain=Domain.Character} } 
                            }
                        }
                    },
                    new DecompilerInput_v2 {
                        Filename = "foo.bin",
                        Address = "1000:D000",
                        Comment = "overlay",
                        Processor = "x86-real-16",
                    }
                }
            };

            var ps = new ProjectLoader(sc, loader.Object, listener.Object);
            var project = ps.LoadProject("project.dcproj", sProject);
            Assert.AreEqual(2, project.Programs.Count);
            var input0 = project.Programs[0];
            Assert.AreEqual(1, input0.User.Globals.Count);
            Assert.AreEqual("1000:0400", input0.User.Globals.Values[0].Address);
            var str_t = (StringType_v2)input0.User.Globals.Values[0].DataType;
            Assert.AreEqual("prim(Character,1)", str_t.CharType.ToString());
        }
Exemplo n.º 3
0
        public static ModuleDefinition GenerateModuleDefinition(string project)
        {
            if (project == null)
            {
                throw new ArgumentNullException(nameof(project));
            }
            CSharpProject          p            = ProjectLoader.LoadProject(project);
            List <CSharpReference> embedFiles   = p.EmbeddedReferences;
            List <CSharpReference> packageFiles = p.PackageReferences;
            List <CSharpReference> projectFiles = p.ProjectReferences;

            ModuleDefinition def = new ModuleDefinition(
                Path.GetFileNameWithoutExtension(project),
                Path.GetDirectoryName(Path.GetFullPath(project)),
                packageFiles.ToArray(),
                projectFiles.ToArray(),
                embedFiles.ToArray());

            return(def);
        }
Exemplo n.º 4
0
        public void Prld_v2()
        {
            var sExp =
                @"<?xml version=""1.0"" encoding=""utf-8""?>
<project xmlns=""http://schemata.jklnet.org/Decompiler/v2"">
  <input>
  </input>
</project>";
            var ldr      = new Mock <ILoader>();
            var platform = new TestPlatform(sc);

            Given_Binary(ldr, platform);
            Given_TypeLibraryLoaderService();
            cfgSvc.Setup(c => c.GetEnvironment("testOS")).Returns(new PlatformDefinition
            {
            });

            var prld    = new ProjectLoader(sc, ldr.Object, listener.Object);
            var project = prld.LoadProject("/foo/bar", new MemoryStream(Encoding.UTF8.GetBytes(sExp)));

            Assert.AreEqual(1, project.Programs.Count);
        }
Exemplo n.º 5
0
        public void Prld_issue_299()
        {
            var sExp =
                @"<?xml version=""1.0"" encoding=""utf-8""?>
<project xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""http://schemata.jklnet.org/Reko/v3"">
  <input>
    <filename>switch.dll</filename>
    <disassembly>switch.asm</disassembly>
    <intermediate-code>switch.dis</intermediate-code>
    <output>switch.c</output>
    <types-file>switch.h</types-file>
    <global-vars>switch.globals.c</global-vars>
    <user>
      <procedure name=""get"">
        <address>10071000</address>
        <CSignature>char * get(unsigned int n)</CSignature>
      </procedure>
      <heuristic name=""shingle"" />
    </user>
  </input>
</project>
";
            var ldr      = mr.Stub <ILoader>();
            var platform = new TestPlatform(sc);

            Given_TestArch();
            Given_TestOS();
            Given_Binary(ldr, platform);
            Given_TypeLibraryLoaderService();
            oe.Stub(o => o.TypeLibraries).Return(new List <ITypeLibraryElement>());
            oe.Stub(o => o.CharacteristicsLibraries).Return(new List <ITypeLibraryElement>());
            mr.ReplayAll();

            var prld    = new ProjectLoader(sc, ldr, listener);
            var project = prld.LoadProject("/foo/bar", new MemoryStream(Encoding.UTF8.GetBytes(sExp)));

            Assert.AreEqual(1, project.Programs.Count);
        }
Exemplo n.º 6
0
        public void SudLoadMetadata()
        {
            var sProject = new Project_v2 {
                Inputs =
                {
                    new MetadataFile_v2
                    {
                        Filename = "c:\\tmp\\foo.def"
                    }
                }
            };
            var loader  = mr.Stub <ILoader>();
            var typelib = new TypeLibrary();

            loader.Stub(l => l.LoadMetadata("")).IgnoreArguments().Return(typelib);
            mr.ReplayAll();

            var ploader = new ProjectLoader(loader);
            var project = ploader.LoadProject(sProject);

            Assert.AreEqual(1, project.MetadataFiles.Count);
            Assert.AreEqual("c:\\tmp\\foo.def", project.MetadataFiles[0].Filename);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Loads (or assembles) the decompiler project. If a binary file is
        /// specified instead, we create a simple project for the file.
        /// </summary>
        /// <param name="fileName">The filename to load.</param>
        /// <param name="loaderName">Optional .NET class name of a custom
        /// image loader</param>
        /// <returns>True if the file could be loaded.</returns>
        public bool Load(string fileName, string loaderName = null)
        {
            eventListener.ShowStatus("Loading source program.");
            byte[] image         = loader.LoadImageBytes(fileName, 0);
            var    projectLoader = new ProjectLoader(this.services, loader, eventListener);

            projectLoader.ProgramLoaded += (s, e) => { RunScriptOnProgramImage(e.Program, e.Program.User.OnLoadedScript); };
            this.Project = projectLoader.LoadProject(fileName, image);
            if (Project == null)
            {
                var program = loader.LoadExecutable(fileName, image, loaderName, null);
                if (program == null)
                {
                    return(false);
                }
                this.Project = AddProgramToProject(fileName, program);
                this.Project.LoadedMetadata = program.Platform.CreateMetadata();
                program.EnvironmentMetadata = this.Project.LoadedMetadata;
            }
            BuildImageMaps();
            eventListener.ShowStatus("Source program loaded.");
            return(true);
        }
Exemplo n.º 8
0
        /// <summary>
        /// Loads (or assembles) the decompiler project. If a binary file is specified instead,
        /// we create a simple project for the file.
        /// </summary>
        /// <returns>True if what was loaded was an actual project</returns>
        /// <param name="program"></param>
        /// <param name="cfg"></param>
        public bool Load(string fileName)
        {
            eventListener.ShowStatus("Loading source program.");
            byte[] image         = loader.LoadImageBytes(fileName, 0);
            var    projectLoader = new ProjectLoader(this.services, loader);

            projectLoader.ProgramLoaded += (s, e) => { RunScriptOnProgramImage(e.Program, e.Program.OnLoadedScript); };
            Project = projectLoader.LoadProject(fileName, image);
            bool isProject;

            if (Project != null)
            {
                isProject = true;
            }
            else
            {
                var program = loader.LoadExecutable(fileName, image, null);
                Project   = CreateDefaultProject(fileName, program);
                isProject = false;
            }
            eventListener.ShowStatus("Source program loaded.");
            return(isProject);
        }
Exemplo n.º 9
0
        public void Prld_PlatformOptions_Dictionary()
        {
            var sproject =
                @"<?xml version=""1.0"" encoding=""utf-8""?>
<project xmlns=""http://schemata.jklnet.org/Reko/v4"">
  <arch>testArch</arch>
  <platform>testOS</platform>
  <input>
    <user>
      <platform>
        <dict key=""Names"">
          <item key=""Adam"">30</item>
          <item key=""Bob"">10</item>
          <item key=""Cecil"">120</item>
        </dict>
        <item key=""Name2"">Sue</item>
      </platform>
    </user>
  </input>
</project>";
            var ldr = mr.Stub <ILoader>();

            Given_TestArch();
            Given_TestOS();
            Given_Binary(ldr, platform);
            Expect_LoadOptions();

            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr);

            prld.LoadProject("c:\\foo\\bar.proj", new MemoryStream(Encoding.UTF8.GetBytes(sproject)));

            var list = (IDictionary)loadedOptions["Names"];

            Assert.AreEqual(3, list.Count);
        }
Exemplo n.º 10
0
        public void Prld_PlatformOptions_List()
        {
            var sExp =
                @"<?xml version=""1.0"" encoding=""utf-8""?>
<project xmlns=""http://schemata.jklnet.org/Reko/v4"">
  <arch>testArch</arch>
  <platform>testOS</platform>
  <input>
    <user>
      <platform>
        <list key=""Names"">
          <item>Adam</item>
          <item>Bob</item>
          <item>Cecil</item>
        </list>
        <item key=""Name2"">Sue</item>
      </platform>
    </user>
  </input>
</project>";
            var ldr = mr.Stub <ILoader>();

            Given_TestArch();
            Given_TestOS();
            Given_Binary(ldr, platform);
            Expect_LoadOptions();
            mr.ReplayAll();

            var prld = new ProjectLoader(sc, ldr);

            prld.LoadProject("/ff/b/foo.proj", new MemoryStream(Encoding.UTF8.GetBytes(sExp)));

            var list = (IList)loadedOptions["Names"];

            Assert.AreEqual(3, list.Count);
        }
Exemplo n.º 11
0
        private static Tuple <string, List <ModuleDefinition> > GenerateProject(string msBuildPath, string workingDir,
                                                                                AssemblyDefinition definition, bool lib = true)
        {
            if (workingDir == null)
            {
                throw new ArgumentNullException(nameof(workingDir));
            }
            if (definition == null)
            {
                throw new ArgumentNullException(nameof(definition));
            }
            if (!Directory.Exists(workingDir))
            {
                throw new DirectoryNotFoundException("Can not find the working directory: " + workingDir);
            }


            Logger.Log(LogType.Log, "Generating csproject File...");

            DotNetHelper.New(msBuildPath, workingDir, definition.AssemblyName, lib);

            File.Delete(Path.Combine(workingDir, definition.AssemblyName,
                                     lib ? "Class1.cs" : "Program.cs")); //Delete Default Class

            string projectFile = Path.Combine(workingDir, definition.AssemblyName, definition.AssemblyName + ".csproj");

            List <ModuleDefinition> modules = new List <ModuleDefinition>();

            for (int i = 0; i < definition.IncludedModules.Count; i++)
            {
                if (modules.Count(x => x.Name == definition.IncludedModules[i].Name) == 0)
                {
                    DiscoverModules(definition.IncludedModules[i], modules);
                }
            }

            Logger.Log(LogType.Log, $"Discovered {modules.Count} Modules.");

            CSharpProject p = ProjectLoader.LoadProject(projectFile);

            foreach (ModuleDefinition defintionDefinition in modules)
            {
                for (int i = 0; i < defintionDefinition.Packages.Length; i++)
                {
                    p.AddReference(defintionDefinition.Packages[i]);
                }
                //for (int i = 0; i < defintionDefinition.Projects.Length; i++)
                //{
                //    CSharpReference r = PrepareForTransfer(defintionDefinition.Projects[i],
                //        defintionDefinition);
                //    string path = r.Attributes["Include"];
                //    if (modules.Count(x => path == Path.GetFullPath(Path.Combine(x.RootDirectory, x.Name + ".csproj"))) == 0)
                //    {
                //        p.AddReference(r);
                //    }
                //}

                for (int i = 0; i < defintionDefinition.EmbeddedFiles.Length; i++)
                {
                    p.AddReference(defintionDefinition.EmbeddedFiles[i]);
                }
            }

            File.Delete(projectFile);
            p.Save(projectFile);

            return(new Tuple <string, List <ModuleDefinition> >(projectFile, modules));
        }
Exemplo n.º 12
0
        public void Sud_LoadProject_Inputs_v5()
        {
            Given_Loader();
            Given_Architecture();
            Given_TestOS_Platform();
            Expect_Arch_ParseAddress("1000:0400", Address.SegPtr(0x1000, 0x0400));
            Given_ExecutableProgram("foo.exe", Address.SegPtr(0x1000, 0x0000));
            Given_BinaryFile("foo.bin", Address.SegPtr(0x1000, 0x0000));

            var sProject = new Project_v5
            {
                ArchitectureName = arch.Object.Name,
                PlatformName     = platform.Object.Name,
                InputFiles       =
                {
                    new DecompilerInput_v5            {
                        Filename = "foo.exe",
                        User     =
                        {
                            LoadAddress = "1000:0000",
                            GlobalData  =
                            {
                                new GlobalDataItem_v2 {
                                    Address          = "1000:0400",                  DataType  = new StringType_v2{
                                        Termination = StringType_v2.ZeroTermination,
                                        CharType    = new PrimitiveType_v1 {
                                            ByteSize =                             1,Domain    = Domain.Character
                                        }
                                    }
                                }
                            }
                        },
                        Comment = "main file",
                    },
                    new DecompilerInput_v5            {
                        Filename = "foo.bin",
                        Comment  = "overlay",
                        User     =
                        {
                            LoadAddress = "1000:D000",
                            Processor   = new ProcessorOptions_v4 {
                                Name    = "x86-real-16",
                            }
                        }
                    }
                }
            };

            var location = ImageLocation.FromUri("/var/project.dcproj");
            var ps       = new ProjectLoader(sc, loader.Object, location, listener.Object);
            var project  = ps.LoadProject(sProject);

            Assert.AreEqual(2, project.Programs.Count);
            var input0 = project.Programs[0];

            Assert.AreEqual(1, input0.User.Globals.Count);
            Assert.AreEqual("1000:0400", input0.User.Globals.Values[0].Address.ToString());
            var str_t = (StringType_v2)input0.User.Globals.Values[0].DataType;

            Assert.AreEqual("prim(Character,1)", str_t.CharType.ToString());
        }
Exemplo n.º 13
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);
        }
Exemplo n.º 14
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, null))
            .IgnoreArguments()
            .Return(new Program
            {
                Platform = this.platform,
            });
            mr.ReplayAll();

            var ploader = new ProjectLoader(sc, loader, listener);
            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);
        }
Exemplo n.º 15
0
        private static Tuple <string, List <ModuleDefinition> > GenerateProject(string msBuildPath, string workingDir,
                                                                                AssemblyDefinition definition, bool lib)
        {
            if (workingDir == null)
            {
                throw new ArgumentNullException(nameof(workingDir));
            }

            if (definition == null)
            {
                throw new ArgumentNullException(nameof(definition));
            }

            if (!Directory.Exists(workingDir))
            {
                throw new DirectoryNotFoundException("Can not find the working directory: " + workingDir);
            }


            Logger.Log(LogType.Log, "Generating csproject File...", 1);

            if (lib)
            {
                DotNetHelper.NewLib(msBuildPath, workingDir, definition.AssemblyName);
            }
            else
            {
                DotNetHelper.NewCommandLine(msBuildPath, workingDir, definition.AssemblyName);
            }

            File.Delete(Path.Combine(workingDir, definition.AssemblyName,
                                     lib ? "Class1.cs" : "Program.cs")); //Delete Default Class

            string projectFile = Path.Combine(workingDir, definition.AssemblyName, definition.AssemblyName + ".csproj");

            List <ModuleDefinition> modules = new List <ModuleDefinition>();

            for (int i = 0; i < definition.IncludedModules.Count; i++)
            {
                if (modules.Count(x => x.Name == definition.IncludedModules[i].Name) == 0)
                {
                    DiscoverModules(definition.IncludedModules[i], modules);
                }
            }

            Logger.Log(LogType.Log, $"Discovered {modules.Count} Modules.", 1);

            CSharpProject p = ProjectLoader.LoadProject(projectFile);

            foreach (ModuleDefinition defintionDefinition in modules)
            {
                for (int i = 0; i < defintionDefinition.Packages.Length; i++)
                {
                    p.AddReference(defintionDefinition.Packages[i]);
                }

                for (int i = 0; i < defintionDefinition.EmbeddedFiles.Length; i++)
                {
                    p.AddReference(defintionDefinition.EmbeddedFiles[i]);
                }
            }

            File.Delete(projectFile);
            p.Save(projectFile);

            return(new Tuple <string, List <ModuleDefinition> >(projectFile, modules));
        }
Exemplo n.º 16
0
        public void Ps_Load_v1()
        {
            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
            });

            mr.ReplayAll();

            var sp = new Project_v1
            {
                Input = new DecompilerInput_v1
                {
                    Filename = "f.exe",
                },
                UserProcedures =
                {
                    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(loader);
            var p  = ps.LoadProject(sp);

            Assert.AreEqual(1, p.Programs.Count);
            var inputFile = p.Programs[0];

            Assert.AreEqual(1, inputFile.UserProcedures.Count);
            Assert.AreEqual("Fn", inputFile.UserProcedures.First().Value.Name);
        }
Exemplo n.º 17
0
        public void Ps_Load_v5()
        {
            var bytes = new byte[100];

            loader.Setup(l => l.LoadFileBytes(
                             It.IsAny <string>())).
            Returns(bytes);
            loader.Setup(l => l.Load(
                             It.IsAny <ImageLocation>(),
                             null,
                             null)).Returns(new Func <ImageLocation, string, Address, ILoadedImage>(
                                                (i, l, a) => 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",
                InputFiles       =
                {
                    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",
                                }
                            }
                        }
                    },
                    new DecompilerInput_v5
                    {
                        Location = OsPath.Relative("foo", "i am positive+.exe")
                    }
                }
            };
            var location = ImageLocation.FromUri(OsPath.Absolute("tmp", "fproj.proj"));
            var ps       = new ProjectLoader(sc, loader.Object, location, listener.Object);
            var p        = ps.LoadProject(sp);

            Assert.AreEqual(2, p.Programs.Count);
            var inputFile0 = p.Programs[0];
            var inputFile1 = p.Programs[1];

            Assert.AreEqual(1, inputFile0.User.Procedures.Count);
            Assert.AreEqual("Fn", inputFile0.User.Procedures.First().Value.Name);

            Assert.AreEqual(1, inputFile0.User.JumpTables.Count);
            var jumpTable = inputFile0.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, inputFile0.User.IndirectJumps.Count);
            var indJump = inputFile0.User.IndirectJumps[Address.Ptr32(0x00113800)];

            Assert.AreSame(jumpTable, indJump.Table);

            Assert.AreEqual(1, inputFile0.User.BlockLabels.Count);
            var blockLabel = inputFile0.User.BlockLabels["115252"];

            Assert.AreEqual("errorExit", blockLabel);
            Assert.AreEqual(Program.SegmentFilePolicy, inputFile0.User.OutputFilePolicy);

            Assert.AreEqual(OsPath.Absolute("tmp", "foo", "i am positive+.exe"), inputFile1.Location.FilesystemPath);
        }
Exemplo n.º 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()
                );
        }
Exemplo n.º 19
0
        public void SudLoadProgramOptions()
        {
            var sProject = new Project_v4
            {
                ArchitectureName = "testArch",
                PlatformName     = "testOS",
                InputFiles       =
                {
                    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));
            Expect_TryGetRegister(arch, "eax", new RegisterStorage("eax", 0, 0, PrimitiveType.Word32));
            Expect_TryGetRegister(arch, "ecx", new RegisterStorage("ecx", 1, 0, PrimitiveType.Word32));
            var loader = new Mock <ILoader>();

            loader.Setup(l => l.LoadFileBytes(It.IsAny <string>()))
            .Returns(new byte[10]);
            loader.Setup(l => l.LoadBinaryImage(
                             It.IsAny <ImageLocation>(),
                             It.IsAny <byte[]>(),
                             It.IsAny <string>(),
                             It.IsAny <Address>()))
            .Returns(new Program
            {
                Platform = this.platform.Object
            });

            var location = ImageLocation.FromUri("c:\\tmp\\foo\\bar.proj");
            var ploader  = new ProjectLoader(sc, loader.Object, location, new FakeDecompilerEventListener());
            var project  = ploader.LoadProject(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);
        }
Exemplo n.º 20
0
        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",
                                    }
                                }
                            }
                        }
                    }
                }
            };
            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);
        }
        protected override void Execute()
        {
            SolutionOptions options = new SolutionOptions();

            Solution.GetProperty((int)__VSPROPID.VSPROPID_SolutionDirectory, out object solutionDirectoryRaw);
            Solution.GetProperty((int)__VSPROPID.VSPROPID_SolutionBaseName, out object solutionNameRaw);
            string solutionName      = solutionNameRaw.ToString();
            string solutionDirectory = solutionDirectoryRaw.ToString();

            options.SolutionName        = solutionName;
            options.SolutionDirectory   = solutionDirectory;
            options.RepositoryDirectory = new DirectoryInfo(solutionDirectory).Parent.FullName;

            IEnumerable <Project> projects = DTE.Solution.GetAllProjects();

            using (DialogScope progress2 = new DialogScope())
            {
                progress2.Update("Synchronizing project file properties with solution. Please wait...");


                foreach (Project project in projects)
                {
                    progress2.Update(
                        "Synchronizing project file properties with solution. Please wait...",
                        $"Processing Project '{project.Name}'"
                        );

                    // ===========================
                    //            Flow
                    // ===========================
                    //
                    // 1) Snapshot project file full path.
                    // 2) Open Project File with filePath and snapshot its ProjectRootElement.
                    // 3) Retrieve Project GUID of the project snapshotted in step 1
                    // 4) Unload project as if user manually unloaded it, and then close it
                    //
                    // 5) Walk property elements, stop at chosen property Name
                    // 5.1) Get the parent of the property element (should be a ProjectPropertyGroupElement)
                    // 5.2) Remove the property element, which will be an immediate child of the parent you just got in 5.1
                    // 6) Save the ProjectRootElement
                    // 7) Reload the project. This is where the GUID from step 3 comes in handy.
                    // 8) For good measure, save the project via the hierarchy.
                    // 9) You are done, Son!
                    //
                    //

                    string projectFilePath = project.FullName;



                    Solution.GetProjectOfUniqueName(project.UniqueName, out IVsHierarchy ppHierarchy);
                    Solution.GetGuidOfProject(ppHierarchy, out Guid projectGuid);
                    Solution4.UnloadProject(ref projectGuid, (uint)_VSProjectUnloadStatus.UNLOADSTATUS_UnloadedByUser);
                    Solution.CloseSolutionElement((uint)__VSSLNCLOSEOPTIONS.SLNCLOSEOPT_UnloadProject, ppHierarchy, VSConstants.VSITEMID_NIL);



                    ProjectRootElement root = ProjectLoader.LoadProject(projectFilePath).Xml;

                    foreach (ProjectPropertyElement propertyElement in root.Properties)
                    {
                        // Check for the most common property names for
                        // output paths. The names checked below are
                        // non-exhaustive. Technically, OutputPath should
                        // be sufficient; however, OutDir is used as
                        // well, but not very often.
                        if (propertyElement.Name.Equals("OutputPath") ||
                            propertyElement.Name.Equals("OutDir"))
                        {
                            propertyElement.Parent.RemoveChild(propertyElement);
                            root.Save(projectFilePath);
                        }
                    }

                    // This has to come after the properties are removed. Otherwise you get some error
                    // saing The SDK '' could not be found.
                    ProjectXmlService.SetExplicitSdkImportsIfNecessaryAsync(projectFilePath);

                    Solution4.ReloadProject(ref projectGuid);
                    Solution4.EnsureProjectIsLoaded(ref projectGuid, 0);
                    Solution.SaveSolutionElement((uint)__VSSLNSAVEOPTIONS.SLNSAVEOPT_ForceSave, ppHierarchy, VSConstants.VSITEMID_NIL);
                }
            }

            DirectoryBuildPropsWriter.WriteDirectoryBuildProps(options);

            Project solutionItems = DTE.Solution.GetOrCreateSolutionFolder("Solution Items");

            solutionItems.ProjectItems.AddFromFile(options.DirectoryBuildPropsPath);

            DTE.Collapse();
        }