예제 #1
0
 public Project_v3 Save(Project project)
 {
     var inputs = new List<ProjectFile_v3>();
     inputs.AddRange(project.Programs.Select(p => VisitProgram(p)));
     inputs.AddRange(project.MetadataFiles.Select(m => VisitMetadataFile(m)));
     var sp = new Project_v3()
     {
         Inputs = inputs
     };
     return sp;
 }
예제 #2
0
 /// <summary>
 /// Shows UI and allows the user to edit the project properties.
 /// </summary>
 /// <param name="project"></param>
 public bool EditProjectProperties(
     IDecompilerShellUiService uiSvc,
     Project_v3 project,
     Action<Project_v3> updater)
 {
     using (var dlg = new EditProjectDialog())
     {
         Attach(dlg);
         LoadFieldsFromProject(project);
         if (uiSvc.ShowModalDialog(dlg) == DialogResult.OK)
         {
             updater(CreateProjectFromFields());
             return true;
         }
     }
     return false;
 }
예제 #3
0
 /// <summary>
 /// Shows UI and allows the user to edit the project properties.
 /// </summary>
 /// <param name="project"></param>
 public bool EditProjectProperties(
     IDecompilerShellUiService uiSvc,
     Project_v3 project,
     Action <Project_v3> updater)
 {
     using (var dlg = new EditProjectDialog())
     {
         Attach(dlg);
         LoadFieldsFromProject(project);
         if (uiSvc.ShowModalDialog(dlg) == Gui.DialogResult.OK)
         {
             updater(CreateProjectFromFields());
             return(true);
         }
     }
     return(false);
 }
예제 #4
0
        private Project_v3 CreateTestProject()
        {
            var project = new Project_v3
            {
                Inputs =
                {
                    new DecompilerInput_v3 {
                        Filename             = "test.exe",
                        DisassemblyFilename  = "test.asm",
                        IntermediateFilename = "test.dis",
                        TypesFilename        = "test.h",
                        OutputFilename       = "test.c",
                    }
                }
            };

            return(project);
        }
예제 #5
0
        private void LoadFieldsFromProject(Project_v3 project)
        {
            if (project == null || project.Inputs == null || project.Inputs.Count == 0)
            {
                return;
            }
            var input = project.Inputs[0] as DecompilerInput_v3;

            if (input == null)
            {
                return;
            }
            dlg.BinaryFilename.Text       = input.Filename;
            dlg.Disassembly.Text          = input.DisassemblyFilename;
            dlg.IntermediateFilename.Text = input.IntermediateFilename;
            dlg.TypesFilename.Text        = input.TypesFilename;
            dlg.OutputFilename.Text       = input.OutputFilename;
            // dlg.OutputFilename.Text = project.Output.GloblalsFilename
        }
예제 #6
0
        private Project_v3 CreateProjectFromFields()
        {
            Project_v3 project = new Project_v3
            {
                Inputs =
                {
                    new DecompilerInput_v3
                    {
                        Filename             = dlg.BinaryFilename.Text,
                        DisassemblyFilename  = dlg.Disassembly.Text,
                        IntermediateFilename = dlg.IntermediateFilename.Text,
                        TypesFilename        = dlg.TypesFilename.Text,
                        OutputFilename       = dlg.OutputFilename.Text,
                        //project.Output.GloblalsFilename = dlg.OutputFilename.Text;
                    }
                }
            };

            return(project);
        }
예제 #7
0
 private Project_v3 CreateTestProject()
 {
     var project = new Project_v3
     {
         Inputs =
         {
             new DecompilerInput_v3 {
                 Filename = "test.exe",
                 DisassemblyFilename = "test.asm",
                 IntermediateFilename = "test.dis",
                 TypesFilename = "test.h",
                 OutputFilename = "test.c",
             }
         }
     };
     return project;
 }
예제 #8
0
 private void LoadFieldsFromProject(Project_v3 project)
 {
     if (project == null || project.Inputs == null || project.Inputs.Count == 0)
         return;
     var input = project.Inputs[0] as DecompilerInput_v3;
     if (input == null)
         return;
     dlg.BinaryFilename.Text =       input.Filename;
     dlg.Disassembly.Text =          input.DisassemblyFilename;
     dlg.IntermediateFilename.Text = input.IntermediateFilename;
     dlg.TypesFilename.Text =        input.TypesFilename;
     dlg.OutputFilename.Text =       input.OutputFilename;
     // dlg.OutputFilename.Text = project.Output.GloblalsFilename
 }
예제 #9
0
 private Project_v3 CreateProjectFromFields()
 {
     Project_v3 project = new Project_v3
     {
         Inputs =
         {
             new DecompilerInput_v3
             {
                 Filename = dlg.BinaryFilename.Text,
                 DisassemblyFilename = dlg.Disassembly.Text,
                 IntermediateFilename = dlg.IntermediateFilename.Text,
                 TypesFilename = dlg.TypesFilename.Text,
                 OutputFilename = dlg.OutputFilename.Text,
                 //project.Output.GloblalsFilename = dlg.OutputFilename.Text;
             }
         }
     };
     return project;
 }
예제 #10
0
 public void Save(Project_v3 project, TextWriter sw)
 {
     XmlSerializer ser = SerializedLibrary.CreateSerializer_v3(typeof(Project_v3));
     ser.Serialize(sw, project);
 }
예제 #11
0
 private void When_SaveToTextWriter(Program program, TextWriter sw)
 {
     var saver = new ProjectSaver();
     var sProj = new Project_v3
     {
         Inputs = { saver.VisitProgram(program) }
     };
     var writer = new FilteringXmlWriter(sw);
     writer.Formatting = System.Xml.Formatting.Indented;
     XmlSerializer ser = SerializedLibrary.CreateSerializer_v3(typeof(Project_v3));
     ser.Serialize(writer, sProj);
 }
예제 #12
0
        public void SudWrite()
        {
            Project_v3 ud = new Project_v3
            {
                Inputs =
                {
                    new DecompilerInput_v3
                    {
                        DisassemblyFilename = "foo.asm",
                        IntermediateFilename = "foo.cod",
                        User = new UserData_v3 {
                            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_v3(typeof(Project_v3));
                ser.Serialize(writer, ud);
                fut.AssertFilesEqual();
            }
        }
예제 #13
0
        public void Ps_Load_v3()
        {
            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_v3
            {
                Inputs = {
                    new DecompilerInput_v3
                    {
                        Filename = "f.exe",
                        User = new UserData_v3
                        {
                            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);
        }
예제 #14
0
 public void Save_v3()
 {
     var sp = new Project_v3
     {
         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 ProjectLoader(sc, loader).Save(sp, sw);
     Console.WriteLine(sw);
 }
예제 #15
0
        public void Prld_LoadUserDefinedMetadata()
        {
            var sProject = new Project_v3
            {
                Inputs =
                {
                    new DecompilerInput_v3
                    {
                        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();
            var platform = mockFactory.CreatePlatform();

            mockFactory.CreateLoadMetadataStub(
                @"c:\meta1.xml",
                platform,
                new TypeLibrary(
                    types1, new Dictionary<string, ProcedureSignature>()
                )
            );
            mockFactory.CreateLoadMetadataStub(
                @"c:\meta2.xml",
                platform,
                new TypeLibrary(
                    types2, new Dictionary<string, ProcedureSignature>()
                )
            );

            var prld = new ProjectLoader(sc, ldr);
            var project = prld.LoadProject(@"c:\foo.project", sProject);
            Assert.AreEqual(2, project.Programs[0].Metadata.Types.Count);
            Assert.AreEqual(
                "word16",
                project.Programs[0].Metadata.Types["USRTYPE1"].ToString()
            );
            Assert.AreEqual(
                "word32",
                project.Programs[0].Metadata.Types["USRTYPE2"].ToString()
            );
        }
예제 #16
0
        public void Prld_MakePathsAbsolute()
        {
            var sProject = new Project_v3
            {
                Inputs =
                {
                    new DecompilerInput_v3
                    {
                        Filename = "foo.exe",
                    }
                }
            };

            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(@"c:/users/bob/projects/foo.project", sProject);
            Assert.AreEqual(@"c:\users\bob\projects\foo.exe", project.Programs[0].Filename);
        }
예제 #17
0
        public void SudLoadProgramOptions()
        {
            var sProject = new Project_v3
            {
                Inputs =
                {
                    new DecompilerInput_v3
                    {
                        User = new UserData_v3
                        {
                            Heuristics = { new Heuristic_v3 { Name="HeuristicScanning" } }
                        }
                    }
                }
            };
            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());
            mr.ReplayAll();

            var ploader = new ProjectLoader(sc, loader);
            var project = ploader.LoadProject(sProject);
            Assert.IsTrue(project.Programs[0].User.Heuristics.Contains("HeuristicScanning"));
        }
예제 #18
0
 /// <summary>
 /// Loads a Project object from its serialized representation. First loads the program
 /// and then any extra metadata.
 /// </summary>
 /// <param name="sp"></param>
 /// <returns></returns>
 public Project LoadProject(Project_v3 sp)
 {
     var typelibs = sp.Inputs.OfType<MetadataFile_v3>().Select(m => VisitMetadataFile(m));
     var programs = sp.Inputs.OfType<DecompilerInput_v3>().Select(s => VisitInputFile(s));
     var asm = sp.Inputs.OfType<AssemblerFile_v3>().Select(s => VisitAssemblerFile(s));
     project.Programs.AddRange(programs);
     project.MetadataFiles.AddRange(typelibs);
     return this.project;
 }