示例#1
0
class DriverUpgradeTestCase(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        self.kdbg = LocalKernelDebugger()
        
    def test_alloc_memory(self):
        addr = self.kdbg.alloc_memory(0x1000)
        self.kdbg.write_byte(addr, 0x42)
        self.assertEqual(self.kdbg.read_byte(addr), 0x42)

        self.kdbg.write_byte(addr + 0xfff, 0x42)
        self.assertEqual(self.kdbg.read_byte(addr + 0xfff), 0x42)

    def test_full_driver_upgrade(self):
        upgrader = self.kdbg.upgrader
        upgrader.registered_ioctl = []
        upgrader.full_driver_upgrade()
        self.test_alloc_memory()
        
    def test_retrieve_driver_upgrade(self):
        # Get current registered IO
        registered_io = self.kdbg.upgrader.registered_ioctl
        # Verif that some IO are registered
        self.assertTrue(registered_io)
        new_upgrader = type(self.kdbg.upgrader)(self.kdbg)
        # Verif that new upgrader see that driver is upgraded
        self.assertTrue(new_upgrader.is_driver_already_upgraded())
        # Verif IOCTL retrieving
        new_upgrader.retrieve_upgraded_info()
        self.assertItemsEqual(registered_io, new_upgrader.registered_ioctl)
        
    def test_map_page_to_userland(self):
        kpage = self.kdbg.alloc_memory(0x1000)
        userpage = self.kdbg.map_page_to_userland(kpage, 0x1000)
        
        self.kdbg.write_dword(kpage, 0x11223344)
        self.assertEqual(ctypes.c_uint.from_address(userpage).value, 0x11223344)
        
        ctypes.c_uint.from_address(userpage + 4).value = 0x12345678
        self.assertEqual(self.kdbg.read_dword(kpage + 4), 0x12345678)