Architectural Registers API

Architectural Registers API

Access via ql.arch.regs. See source: qiling/arch/register.py.

Registers can be specified by name (e.g. 'eax') or Unicorn constant (e.g. UC_X86_REG_EAX).

Reading Registers

Two equivalent methods:

1# By name
2value = ql.arch.regs.read('eax')
3
4# By Unicorn constant
5value = ql.arch.regs.read(UC_X86_REG_EAX)
6
7# As property (preferred for readability)
8value = ql.arch.regs.eax

Writing Registers

1# By name
2ql.arch.regs.write('ecx', 0xdeadface)
3
4# By Unicorn constant
5ql.arch.regs.write(UC_X86_REG_ECX, 0xdeadface)
6
7# As property (enables read-modify-write)
8ql.arch.regs.ecx = 0xdeadface
9ql.arch.regs.eflags |= (0b1 << 6)  # set zero flag

Generic Cross-Architecture Aliases

These aliases work across all architectures:

1# Program counter
2pc = ql.arch.regs.arch_pc   # reads eip (x86), pc (ARM), rip (x86-64), etc.
3ql.arch.regs.arch_pc = 0x00400000
4
5# Stack pointer
6sp = ql.arch.regs.arch_sp   # reads esp (x86), sp (ARM), rsp (x86-64), etc.
7ql.arch.regs.arch_sp = 0x7ffff000

Architecture-Specific Resources

Intel MSR (Model Specific Registers)

Access via ql.arch.msr:

1IA32_BIOS_SIGN_ID = 0x8b
2bios_sig = ql.arch.msr.read(IA32_BIOS_SIGN_ID)
3
4IA32_APIC_BASE_MSR = 0x1b
5apic_base = 0xfee00000
6# Set APIC base with BSP flag (bit 8) and global enable (bit 11)
7ql.arch.msr.write(IA32_APIC_BASE_MSR, apic_base | (0b1 << 8) | (0b1 << 11))

ARM / AArch64 Coprocessors

AArch32 via ql.arch.cpr, AArch64 via ql.arch.cpr64:

1from qiling.arch.arm_const import CPACR
2
3# Read CPACR, then enable full access to cp10 and cp11 (VFP/NEON)
4cpacr = ql.arch.cpr.read(*CPACR)
5ql.arch.cpr.write(*CPACR, cpacr | (0b11 << 20) | (0b11 << 22))