Example #1
0
        public void Usb_BuildSignatures_UserDefinedTypes()
        {
            program.EnvironmentMetadata.Types.Add(
                "PLATFORMDEF",
                PrimitiveType.Create(PrimitiveType.Byte.Domain, 8));
            program.EnvironmentMetadata.Types.Add(
                "USRDEF",
                PrimitiveType.Create(PrimitiveType.Int16.Domain, 16));
            Given_Procedure(0x1000);
            Given_UserSignature(0x01000, "int test(PLATFORMDEF a, USRDEF b)");

            var usb = new UserSignatureBuilder(program);

            usb.BuildSignatures(new FakeDecompilerEventListener());

            var sigExp =
                @"Register int32 test(Stack PLATFORMDEF a, Stack USRDEF b)
// stackDelta: 4; fpuStackDelta: 0; fpuMaxParam: -1
";

            Assert.AreEqual(sigExp, proc.Signature.ToString("test", FunctionType.EmitFlags.AllDetails));

            Assert.AreEqual(2, proc.Signature.Parameters.Length);
            Assert.AreEqual("int32", proc.Signature.ReturnValue.DataType.ToString());
            Assert.AreEqual("a", proc.Signature.Parameters[0].Name);
            Assert.AreEqual("byte", (proc.Signature.Parameters[0].DataType as TypeReference).Referent.ToString());
            Assert.AreEqual("b", proc.Signature.Parameters[1].Name);
            Assert.AreEqual("int16", (proc.Signature.Parameters[1].DataType as TypeReference).Referent.ToString());
        }
        public void Dfa2_UserDefinedStackArgs()
        {
            var arch = new X86ArchitectureFlat32(new ServiceContainer(), "x86-protected-32", new Dictionary <string, object>());
            var pb   = new ProgramBuilder(arch);
            var test = pb.Add(
                new UserProcedure(pb.NextAddress(), "test")
            {
                CSignature = "void test(int a, int b)"
            },
                m => {
                var r1 = m.Reg32("r1", 1);
                var r2 = m.Reg32("r2", 2);
                var fp = m.Frame.FramePointer;
                m.Assign(r1, m.Mem32(m.IAdd(fp, 4)));
                m.Assign(r2, m.Mem32(m.IAdd(fp, 8)));
                m.Assign(r1, m.IAdd(r1, r2));
                m.MStore(m.Ptr32(0x010008), r1);
                m.Return();
            });
            var program  = pb.BuildProgram();
            var platform = new Mock <IPlatform>();

            platform.Setup(p => p.Architecture).Returns(arch);
            platform.Setup(p => p.IsImplicitArgumentRegister(It.IsAny <RegisterStorage>()))
            .Returns(false);
            platform.Setup(p => p.DefaultCallingConvention).Returns("__cdecl");
            platform.Setup(p => p.GetCallingConvention(null))
            .Returns(new X86CallingConvention(4, 4, 4, true, false));
            platform.Setup(p => p.GetBitSizeFromCBasicType(CBasicType.Int)).Returns(32);
            platform.Setup(p => p.PointerType).Returns(PrimitiveType.Ptr32);
            platform.Setup(p => p.CreateCParser(It.IsAny <TextReader>(), It.IsAny <ParserState>()))
            .Returns(new Func <TextReader, ParserState, CParser>((r, s) =>
            {
                var lex = new CLexer(r, CLexer.MsvcKeywords);
                return(new CParser(s ?? new ParserState(), lex));
            }));

            var dynamicLinker = new Mock <IDynamicLinker>().Object;

            program.Platform = platform.Object;
            var usb = new UserSignatureBuilder(program);

            usb.BuildSignatures(new FakeDecompilerEventListener());
            var dfa = new DataFlowAnalysis(program, dynamicLinker, sc);

            dfa.AnalyzeProgram();
            var sExp = @"// test
// Return size: 4
void test(int32 a, int32 b)
test_entry:
	// succ:  l1
l1:
	Mem6[0x00010008<p32>:word32] = a + b
	return
	// succ:  test_exit
test_exit:
";

            AssertProgram(sExp, pb.Program);
        }
Example #3
0
        protected override void RunTest(Program program, TextWriter writer)
        {
            var eventListener = new FakeDecompilerEventListener();
            var sc            = new ServiceContainer();

            sc.AddService <DecompilerEventListener>(eventListener);
            var dfa = new DataFlowAnalysis(
                program,
                dynamicLinker.Object,
                sc);

            program.User.Procedures = userSigs;
            var usb = new UserSignatureBuilder(program);

            usb.BuildSignatures(eventListener);

            IntraBlockDeadRegisters.Apply(program, eventListener);

            var ssts = dfa.RewriteProceduresToSsa();

            // Discover ssaId's that are live out at each call site.
            // Delete all others.
            var uvr = new UnusedOutValuesRemover(
                program,
                ssts.Select(sst => sst.SsaState),
                dfa.ProgramDataFlow,
                dynamicLinker.Object,
                eventListener);

            uvr.Transform();
            DumpProcedureFlows(program, dfa, writer);
        }
Example #4
0
        public void Usb_EmptyUserSignature()
        {
            Given_Procedure(0x1000);

            var oldSig = proc.Signature;
            var usb    = new UserSignatureBuilder(program);

            usb.BuildSignatures(new FakeDecompilerEventListener());
            Assert.AreSame(oldSig, proc.Signature);
        }
Example #5
0
        public void Usb_EmptyUserSignature()
        {
            Given_Procedure(0x1000);

            var oldSig = proc.Signature;
            var usb    = new UserSignatureBuilder(program);

            usb.BuildSignatures();
            Assert.AreSame(oldSig, proc.Signature);
        }
Example #6
0
        public void Dfa2_UserDefinedStackArgs()
        {
            var arch = new X86ArchitectureFlat32(new ServiceContainer(), "x86-protected-32");
            var pb   = new ProgramBuilder(arch);
            var test = pb.Add(
                new Procedure_v1
            {
                CSignature = "void test(int a, int b)"
            },
                m => {
                var r1 = m.Reg32("r1", 1);
                var r2 = m.Reg32("r2", 2);
                var fp = m.Frame.FramePointer;
                m.Assign(r1, m.Mem32(m.IAdd(fp, 4)));
                m.Assign(r2, m.Mem32(m.IAdd(fp, 8)));
                m.Assign(r1, m.IAdd(r1, r2));
                m.MStore(m.Ptr32(0x010008), r1);
                m.Return();
            });
            var program  = pb.BuildProgram();
            var platform = new Mock <IPlatform>();

            platform.Setup(p => p.Architecture).Returns(arch);
            platform.Setup(p => p.CreateImplicitArgumentRegisters()).Returns(
                new HashSet <RegisterStorage>());
            platform.Setup(p => p.DefaultCallingConvention).Returns("__cdecl");
            platform.Setup(p => p.GetCallingConvention(null))
            .Returns(new X86CallingConvention(4, 4, 4, true, false));
            platform.Setup(p => p.GetByteSizeFromCBasicType(CBasicType.Int)).Returns(4);

            var dynamicLinker = new Mock <IDynamicLinker>().Object;

            program.Platform = platform.Object;
            var usb = new UserSignatureBuilder(program);

            usb.BuildSignatures(new FakeDecompilerEventListener());
            var dfa = new DataFlowAnalysis(program, dynamicLinker, sc);

            dfa.AnalyzeProgram();
            var sExp = @"// test
// Return size: 4
void test(int32 a, int32 b)
test_entry:
	// succ:  l1
l1:
	Mem6[0x00010008<p32>:word32] = a + b
	return
	// succ:  test_exit
test_exit:
";

            AssertProgram(sExp, pb.Program);
        }
Example #7
0
 private void SetCSignatures(Program program)
 {
     foreach (var addr in program.Procedures.Keys)
     {
         program.User.Procedures.Add(
             addr,
             new Procedure_v1
         {
             CSignature = this.CSignature
         });
     }
     if (this.CSignature != null)
     {
         var usb = new UserSignatureBuilder(program);
         usb.BuildSignatures(new FakeDecompilerEventListener());
     }
 }
Example #8
0
 private void SetCSignatures(Program program)
 {
     foreach (var proc in program.Procedures)
     {
         program.User.Procedures.Add(
             proc.Key,
             new UserProcedure(proc.Key, proc.Value.Name)
         {
             CSignature = this.CSignature
         });
     }
     if (this.CSignature != null)
     {
         var usb = new UserSignatureBuilder(program);
         usb.BuildSignatures(new FakeDecompilerEventListener());
     }
 }