示例#1
0
        private void RunTest(string sExp)
        {
            var ppf     = new ProcedurePaddingFinder(sr);
            var padding = ppf.FindPaddingBlocks();

            ppf.Remove(padding);
        }
示例#2
0
        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.");
        }
示例#3
0
        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.");
        }
示例#4
0
        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...");
        }
示例#5
0
        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());
        }
示例#6
0
        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());
        }