public void Dfa2_Simple() { var pb = new ProgramBuilder(new FakeArchitecture()); pb.Add("test", m=> { var r1 = m.Reg32("r1"); var r2 = m.Reg32("r2"); m.Assign(r1, m.LoadDw(m.Word32(0x010000))); m.Assign(r2, m.LoadDw(m.Word32(0x010004))); m.Store(m.Word32(0x010008), m.IAdd(r1, r2)); m.Return(); }); var dfa = new DataFlowAnalysis(pb.BuildProgram(), new FakeDecompilerEventListener()); dfa.UntangleProcedures2(); var sExp = @"// test // Return size: 0 void test() test_entry: // succ: l1 l1: Mem6[0x00010008:word32] = Mem0[0x00010000:word32] + Mem0[0x00010004:word32] return // succ: test_exit test_exit: "; AssertProgram(sExp, pb); }
protected Program CompileTest(Action<ProcedureBuilder> m) { var mock = new ProcedureBuilder(); m(mock); var pmock = new ProgramBuilder(); pmock.Add(mock); return pmock.BuildProgram(); }
public void DpaSimple() { var prog = new ProgramBuilder(); prog.Add("test", m=> { var r1 = m.Register(1); m.Assign(r1, m.Load(PrimitiveType.Real32, m.Word32(0x10000000))); }); RunTest(prog.BuildProgram(), "Typing/DpaSimple.txt"); }
public void EP_TestCondition() { var p = new ProgramBuilder(); p.Add("main", (m) => { m.Label("foo"); m.BranchCc(ConditionCode.EQ, "foo"); m.Return(); }); var proc = p.BuildProgram().Procedures.Values.First(); var ctx = new SymbolicEvaluationContext(new IntelArchitecture(ProcessorMode.Protected32), proc.Frame); var simplifier = new ExpressionSimplifier(ctx); var ep = new ExpressionPropagator(null, simplifier, ctx, new ProgramDataFlow()); var newInstr = proc.EntryBlock.Succ[0].Statements[0].Instruction.Accept(ep); Assert.AreEqual("branch Test(EQ,Z) foo", newInstr.ToString()); }
public void TerComparison() { ProgramBuilder prog = new ProgramBuilder(new LoadedImage(Address.Ptr32(0x00100000), new byte[0x4000])); prog.Add("proc1", m => { Identifier p = m.Local32("p"); Expression fetch = m.Load(new Pointer(new StructureType("foo", 8), 4), m.IAdd(p, 4)); m.Assign(m.LocalBool("f"), m.Lt(fetch, m.Word32(0x00100028))); }); RunTest(prog.BuildProgram(), "Typing/TerComparison.txt"); }
public void Dfa2_FactorialReg() { pb = new ProgramBuilder(); pb.Add("fact", m => { var sp = m.Register(m.Architecture.StackRegister); var r1 = m.Register(1); var r2 = m.Register(2); var r3 = m.Register(3); var cc = m.Flags(0xF, "cc"); m.Assign(sp, m.Frame.FramePointer); m.Assign(r2, r1); m.Assign(r1, 1); m.Assign(cc, m.Cond(m.ISub(r2, r1))); m.BranchIf(m.Test(ConditionCode.LE, cc), "done"); m.Assign(sp, m.ISub(sp, 4)); m.Store(sp, r2); m.Assign(r1, m.ISub(r2, r1)); m.Call("fact", 0); m.Assign(r2, m.LoadDw(sp)); m.Assign(sp, m.IAdd(sp, 4)); m.Assign(r1, m.IMul(r1, r2)); m.Label("done"); m.Return(); }); var dfa = new DataFlowAnalysis(pb.BuildProgram(), new FakeDecompilerEventListener()); dfa.UntangleProcedures2(); var sExp = @"@@@"; AssertProgram(sExp, pb); }
public void DpaConstantPointer() { ProgramBuilder prog = new ProgramBuilder(); ProcedureBuilder m = new ProcedureBuilder(); Identifier r1 = m.Register(1); m.Assign(r1, 0x123130); m.Store(r1, m.Int32(0x42)); prog.Add(m); RunTest(prog.BuildProgram(), "Typing/DpaConstantPointer.txt"); }
public void DpaConstantMemberPointer() { ProgramBuilder prog = new ProgramBuilder(); ProcedureBuilder m = new ProcedureBuilder(); Identifier ds = m.Local16("ds"); ds.DataType = PrimitiveType.SegmentSelector; Identifier bx = m.Local16("bx"); m.Assign(bx, 0x1234); m.Store(m.SegMemW(ds, bx), m.Int16(0x0042)); prog.Add(m); RunTest(prog.BuildProgram(), "Typing/DpaConstantMemberPointer.txt"); }
public void Dfa2_CallProc() { pb = new ProgramBuilder(); pb.Add("test", m => { var sp = m.Register(m.Architecture.StackRegister); var fooProc = GivenFunction("foo", m.Architecture.GetRegister(1), 4, 8); m.Assign(sp, m.ISub(sp, 4)); m.Store(sp, 2); m.Assign(sp, m.ISub(sp, 4)); m.Store(sp, 1); m.Call(fooProc, 4); m.Assign(sp, m.IAdd(sp, 8)); m.Return(); }); var dfa = new DataFlowAnalysis(pb.BuildProgram(), new FakeDecompilerEventListener()); dfa.UntangleProcedures2(); var sExp = @"// test // Return size: 0 void test() test_entry: // succ: l1 l1: Mem9[0x00010008:word32] = Mem0[fp + 0x00000004:word32] + Mem0[fp + 0x00000008:word32] return // succ: test_exit test_exit: "; AssertProgram(sExp, pb); }
public void DtbSignedCompare() { ProcedureBuilder m = new ProcedureBuilder(); Identifier p = m.Local32("p"); Identifier ds = m.Local16("ds"); ds.DataType = PrimitiveType.SegmentSelector; Identifier ds2 = m.Local16("ds2"); ds.DataType = PrimitiveType.SegmentSelector; m.Assign(ds2, ds); m.Store( m.SegMem(PrimitiveType.Bool, ds, m.Word16(0x5400)), m.Lt(m.SegMemW(ds, m.Word16(0x5404)), m.Word16(20))); m.Store(m.SegMemW(ds2, m.Word16(0x5404)), m.Word16(0)); ProgramBuilder prog = new ProgramBuilder(); prog.Add(m); RunTest(prog.BuildProgram(), "Typing/DtbSignedCompare.txt"); }
public void DtbArrayConstantPointers() { ProgramBuilder pp = new ProgramBuilder(); pp.Add("Fn", m => { Identifier a = m.Local32("a"); Identifier i = m.Local32("i"); m.Assign(a, 0x00123456); // array pointer m.Store(m.IAdd(a, m.IMul(i, 8)), m.Int32(42)); }); RunTest(pp.BuildProgram(), "Typing/DtbArrayConstantPointers.txt"); }
public void DtbSegmentedPointer() { var m = new ProgramBuilder(); m.Add(new SegmentedPointerProc()); RunTest(m.BuildProgram(), "Typing/DtbSegmentedPointer.txt"); }
public void DtbFn1CallFn2() { ProgramBuilder pp = new ProgramBuilder(); pp.Add("Fn1", m => { Identifier loc1 = m.Local32("loc1"); Identifier loc2 = m.Local32("loc2"); m.Assign(loc2, m.Fn("Fn2", loc1)); m.Return(); }); pp.Add("Fn2", m => { Identifier arg1 = m.Local32("arg1"); Identifier ret = m.Register(1); m.Procedure.Signature = new ProcedureSignature(ret, new Identifier[] { arg1 }); m.Procedure.Signature.Parameters[0] = arg1; m.Assign(ret, m.IAdd(arg1, 1)); m.Return(ret); }); RunTest(pp.BuildProgram(), "Typing/DtbFn1CallFn2.txt"); }
public void TerAddNonConstantToPointer() { ProgramBuilder prog = new ProgramBuilder(); prog.Add("proc1", m => { Identifier i = m.Local16("i"); Identifier p = m.Local16("p"); m.Store(p, m.Word16(4)); m.Store(m.IAdd(p, 4), m.Word16(4)); m.Assign(p, m.IAdd(p, i)); }); RunTest(prog.BuildProgram(), "Typing/TerAddNonConstantToPointer.txt"); }
private void RunTest(ProgramBuilder p, string output) { SaveRunOutput(p.BuildProgram(), RunTest, output); }
public void TerArrayConstantPointers() { ProgramBuilder pp = new ProgramBuilder(new LoadedImage(Address.Ptr32(0x00123000), new byte[4000])); pp.Add("Fn", m => { Identifier a = m.Local32("a"); Identifier i = m.Local32("i"); m.Assign(a, 0x00123456); // array pointer m.Store(m.IAdd(a, m.IMul(i, 8)), m.Int32(42)); }); RunTest(pp.BuildProgram(), "Typing/TerArrayConstantPointers.txt"); }
public void TerSegMemPtr2() { ProgramBuilder mock = new ProgramBuilder(); mock.Add(new SegmentedMemoryPointerMock2()); RunTest(mock.BuildProgram(), "Typing/TerSegMemPtr2.txt"); }
public void TerVector() { ProgramBuilder mock = new ProgramBuilder(); mock.Add(new VectorFragment()); RunTest(mock.BuildProgram(), "Typing/TerVector.txt"); }
public void TerConstantUnion() { ProgramBuilder mock = new ProgramBuilder(); mock.Add(new ConstantUnionMock()); RunTest(mock.BuildProgram(), "Typing/TerConstantUnion.txt"); }
public void TerUnionIntReal() { ProgramBuilder mock = new ProgramBuilder(); mock.Add(new UnionIntRealMock()); RunTest(mock.BuildProgram(), "Typing/TerUnionIntReal.txt"); }
public void DtbSegMem3() { ProgramBuilder mock = new ProgramBuilder(); mock.Add(new SegMem3Mock()); RunTest(mock.BuildProgram(), "Typing/DtbSegMem3.txt"); }
public void TerUnionConstants() { ProgramBuilder prog = new ProgramBuilder(); prog.Add("proc1", m => { Identifier bx = m.Local16("bx"); m.Assign(bx, m.Shr(bx, 2)); // makes bx unsigned uint16 m.Assign(m.LocalBool("f"), m.Lt(bx, 4)); // makes bx also signed; assembler bug, but forces a union. m.Assign(bx, m.Word16(4)); // what type should 4 have? }); RunTest(prog.BuildProgram(), "Typing/TerUnionConstants.txt"); }
public void DtbSegmentedMemoryPointer() { ProgramBuilder m = new ProgramBuilder(); m.Add(new SegmentedMemoryPointerMock()); RunTest(m.BuildProgram(), "Typing/DtbSegmentedMemoryPointer.txt"); }
public void TerIntelIndexedAddressingMode() { ProgramBuilder m = new ProgramBuilder(); m.Add(new IntelIndexedAddressingMode()); RunTest(m.BuildProgram(), "Typing/TerIntelIndexedAddressingMode.txt"); }
public void DtbStructurePointerPassedToFunction() { ProgramBuilder pp = new ProgramBuilder(); pp.Add("Fn1", m => { Identifier p = m.Local32("p"); m.Store(m.IAdd(p, 4), m.Word32(0x42)); m.SideEffect(m.Fn("Fn2", p)); m.Return(); }); pp.Add("Fn2", m => { Identifier arg1 = m.Local32("arg1"); m.Procedure.Signature = new ProcedureSignature(null, new Identifier[] { arg1 }); m.Store(m.IAdd(arg1, 8), m.Int32(0x23)); m.Return(); }); RunTest(pp.BuildProgram(), "Typing/DtbStructurePointerPassedToFunction.txt"); }
public void TerSegmentedCall() { var pb = new ProgramBuilder(); pb.Add(new SegmentedCallFragment()); RunTest(pb.BuildProgram(), "Typing/TerSegmentedCall.txt"); }
public void DtbSequenceWithSegment() { ProcedureBuilder m = new ProcedureBuilder(); Identifier ds = m.Local16("ds"); ds.DataType = PrimitiveType.SegmentSelector; m.SegStore(ds, m.Word16(0x0100), m.Seq(ds, m.Word16(0x1234))); ProgramBuilder prog = new ProgramBuilder(); prog.Add(m); RunTest(prog.BuildProgram(), "Typing/DtbSequenceWithSegment.txt"); }
public void TerPointerChain() { var pb = new ProgramBuilder(); pb.Add(new PointerChainFragment()); RunTest(pb.BuildProgram(), "Typing/TerPointerChain.txt"); }
public void DtbCallTable() { var pb = new ProgramBuilder(); pb.Add(new IndirectCallFragment()); RunTest(pb.BuildProgram(), "Typing/DtbCallTable.txt"); }
public void TerStaggeredArrays() { ProgramBuilder prog = new ProgramBuilder(); prog.Add(new StaggeredArraysFragment()); RunTest(prog.BuildProgram(), "Typing/TerStaggeredArrays.txt"); }