private void RunTest(string sExp) { var ppf = new ProcedurePaddingFinder(sr); var padding = ppf.FindPaddingBlocks(); ppf.Remove(padding); }
public void Ppf_SimplePadding_Remove() { Ret(0x1000, 1); // end of preceding function. Pad(0x1001, 1); Pad(0x1002, 1); Lin(0x1003, 1); BuildTest(); var ppf = new ProcedurePaddingFinder(sr); var padding = ppf.FindPaddingBlocks(); ppf.Remove(padding); Assert.IsFalse(sr.ICFG.Nodes.Any(block => block.Address.ToLinear() == 0x1001), "Padding block should be gone."); }
public void Ppf_ConnectedPadding() { Ret(0x1000, 1); // end of preceding function. Pad(0x1001, 1); // Unreachable padding. Pad(0x1002, 1); Lin(0x1003, 1); BuildTest(); var ppf = new ProcedurePaddingFinder(sr); var padding = ppf.FindPaddingBlocks().ToList(); Assert.AreEqual(1, padding.Count, "There should be one padding block..."); Assert.AreEqual(2, padding[0].Instructions.Count, "...with two instructions inside."); }
public void Ppf_OverlappingPadding() { Lin(0x1000, 2); // Lin(0x1001, 2); // Garbage translation Ret(0x1002, 1); // end of preceding function. Pad(0x1003, 1); // Unreachable padding. Lin(0x1004, 1); BuildTest(); RemoveConflictingBlocks(0x1000); var ppf = new ProcedurePaddingFinder(sr); var padding = ppf.FindPaddingBlocks().ToList(); Assert.AreEqual(1, padding.Count, "There should be one padding block..."); Assert.AreEqual(0x1003, padding[0].Address.ToLinear()); Assert.AreEqual(1, padding[0].Instructions.Count, "...with two instructions inside..."); }
public void Ppf_JumpIntoPadding() { Bra(0x1000, 0x1005, 2); // Jump into padding --. Ret(0x1002, 1); // end of preceding function. | // | Pad(0x1003, 1); // Unreachable padding. | Pad(0x1004, 1); // | Pad(0x1005, 1); // jump target <-------------' Pad(0x1006, 1); Lin(0x1007, 1); BuildTest(); var ppf = new ProcedurePaddingFinder(sr); var padding = ppf.FindPaddingBlocks().ToList(); Assert.AreEqual(1, padding.Count, "There should be one padding block..."); Assert.AreEqual(2, padding[0].Instructions.Count, "...with two instructions inside..."); Assert.AreEqual(0x1003, padding[0].Address.ToLinear()); }
public void Ppf_CallIntoPadding() { sr.DirectlyCalledAddresses.Add(Address.Ptr32(0x1005), 1); Lin(0x1000, 2); // Ret(0x1002, 1); // end of preceding function. Pad(0x1003, 1); // Unreachable padding. Pad(0x1004, 1); // Pad(0x1005, 1); // call target Pad(0x1006, 1); Lin(0x1007, 1); BuildTest(); var ppf = new ProcedurePaddingFinder(sr); var padding = ppf.FindPaddingBlocks().ToList(); Assert.AreEqual(1, padding.Count, "There should be one padding block..."); Assert.AreEqual(2, padding[0].Instructions.Count, "...with two instructions inside..."); Assert.AreEqual(0x1003, padding[0].Address.ToLinear()); }