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); }
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); }
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); }
public void Usb_EmptyUserSignature() { Given_Procedure(0x1000); var oldSig = proc.Signature; var usb = new UserSignatureBuilder(program); usb.BuildSignatures(); Assert.AreSame(oldSig, proc.Signature); }
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); }
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()); } }
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()); } }