#!/usr/bin/python
# By Ryan Hileman, issue #16

from unicorn import *
from unicorn.arm_const import *
from unicorn.arm64_const import *

import regress


class WrongSPArm(regress.RegressTest):
    def test_32(self):
        with self.assertRaises(UcError):
            uc = Uc(UC_ARCH_ARM, UC_MODE_32)
            uc.reg_write(UC_ARM_REG_SP, 4)

    def test_64(self):
        uc = Uc(UC_ARCH_ARM64, UC_MODE_ARM)
        uc.reg_write(UC_ARM64_REG_SP, 4)
        self.assertEqual(0x4, uc.reg_read(UC_ARM64_REG_SP))

    def test_arm(self):
        uc = Uc(UC_ARCH_ARM, UC_MODE_ARM)
        uc.reg_write(UC_ARM_REG_SP, 4)
        self.assertEqual(0x4, uc.reg_read(UC_ARM_REG_SP))


if __name__ == '__main__':
    regress.main()
Exemplo n.º 2
0
CODE = open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "x86_self_modifying.elf")).read()
CODE_SIZE = len(CODE) + (0x1000 - len(CODE) % 0x1000)
STACK_SIZE = 0x8000

ENTRY_POINT = 0x8048074


def hook_intr(uc, intno, data):
    uc.emu_stop()


class SelfModifying(regress.RegressTest):
    def test_self_modifying(self):
        uc = Uc(UC_ARCH_X86, UC_MODE_32)

        uc.mem_map(CODE_ADDR, CODE_SIZE, 5)
        uc.mem_map(STACK_ADDR, STACK_SIZE, 7)
        uc.mem_write(CODE_ADDR, CODE)
        uc.reg_write(UC_X86_REG_ESP, STACK_ADDR + STACK_SIZE)

        uc.hook_add(UC_HOOK_INTR, hook_intr)

        uc.emu_start(ENTRY_POINT, -1)

        retcode = uc.reg_read(UC_X86_REG_EBX)
        self.assertEqual(retcode, 65)


if __name__ == "__main__":
    regress.main()