Ejemplo n.º 1
0
        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);
        }