libmwemu 0.24.4

x86 32/64bits and system internals emulator, for securely emulating malware and other stuff.
Documentation
use crate::emu::decoded_instruction::DecodedInstruction;
use crate::emu::Emu;

impl Emu {
    /// display 32bits main registers
    pub fn featured_regs32(&self) {
        self.regs().show_eax(&self.maps, 0);
        self.regs().show_ebx(&self.maps, 0);
        self.regs().show_ecx(&self.maps, 0);
        self.regs().show_edx(&self.maps, 0);
        self.regs().show_esi(&self.maps, 0);
        self.regs().show_edi(&self.maps, 0);
        log::trace!("\tesp: 0x{:x}", self.regs().get_esp() as u32);
        log::trace!("\tebp: 0x{:x}", self.regs().get_ebp() as u32);
        log::trace!("\teip: 0x{:x}", self.regs().get_eip() as u32);
    }

    /// display 64bits main registers
    pub fn featured_regs64(&self) {
        self.regs().show_rax(&self.maps, 0);
        self.regs().show_rbx(&self.maps, 0);
        self.regs().show_rcx(&self.maps, 0);
        self.regs().show_rdx(&self.maps, 0);
        self.regs().show_rsi(&self.maps, 0);
        self.regs().show_rdi(&self.maps, 0);
        log::trace!("\trsp: 0x{:x}", self.regs().rsp);
        log::trace!("\trbp: 0x{:x}", self.regs().rbp);
        log::trace!("\trip: 0x{:x}", self.regs().rip);
        self.regs().show_r8(&self.maps, 0);
        self.regs().show_r9(&self.maps, 0);
        self.regs().show_r10(&self.maps, 0);
        self.regs().show_r11(&self.maps, 0);
        self.regs().show_r12(&self.maps, 0);
        self.regs().show_r13(&self.maps, 0);
        self.regs().show_r14(&self.maps, 0);
        self.regs().show_r15(&self.maps, 0);
    }

    /// display aarch64 main registers
    pub fn featured_regs_aarch64(&self) {
        let regs = self.regs_aarch64();
        for i in (0..31).step_by(2) {
            if i + 1 < 31 {
                log::trace!("\tx{:<2}: 0x{:016x}  x{:<2}: 0x{:016x}", i, regs.x[i], i + 1, regs.x[i + 1]);
            } else {
                log::trace!("\tx{:<2}: 0x{:016x}", i, regs.x[i]);
            }
        }
        log::trace!("\tsp:  0x{:016x}", regs.sp);
        log::trace!("\tpc:  0x{:016x}", regs.pc);
        log::trace!("\tlr:  0x{:016x} (x30)", regs.x[30]);
        log::trace!("\tfp:  0x{:016x} (x29)", regs.x[29]);
        log::trace!("\tNZCV: N={} Z={} C={} V={}", regs.nzcv.n, regs.nzcv.z, regs.nzcv.c, regs.nzcv.v);
    }

    #[inline]
    pub fn show_instruction_comment(&mut self, color: &str, ins: &DecodedInstruction, comment: &str) {
        if self.cfg.verbose < 2 {
            return;
        }
        let out = self.format_instruction(ins);
        let addr = if ins.is_x86() { ins.address() } else { self.pc() };
        if self.cfg.verbose >= 2 {
            if self.cfg.nocolors {
                log::trace!("{} 0x{:x}: {} ; {}", self.pos, addr, out, comment);
            } else {
                log::trace!(
                    "{}{} 0x{:x}: {} ; {}{}",
                    color,
                    self.pos,
                    addr,
                    out,
                    comment,
                    self.colors.nc
                );
            }
            self.show_definition();
        }
    }

    #[inline]
    pub fn show_instruction(&mut self, color: &str, ins: &DecodedInstruction) {
        if self.cfg.verbose < 2 {
            return;
        }
        let out = self.format_instruction(ins);
        let addr = if ins.is_x86() { ins.address() } else { self.pc() };
        if self.cfg.verbose >= 2 {
            if self.cfg.nocolors {
                log::trace!("{} 0x{:x}: {}", self.pos, addr, out);
            } else {
                log::trace!(
                    "{}{} 0x{:x}: {}{}",
                    color,
                    self.pos,
                    addr,
                    out,
                    self.colors.nc
                );
            }
            self.show_definition();
        }
    }

    #[inline]
    pub fn show_instruction_ret(&mut self, color: &str, ins: &DecodedInstruction, ret_addr: u64) {
        if self.cfg.verbose < 2 {
            return;
        }
        let out = self.format_instruction(ins);
        let addr = if ins.is_x86() { ins.address() } else { self.pc() };
        if self.cfg.verbose >= 2 {
            if self.cfg.nocolors {
                log::trace!(
                    "{} 0x{:x}: {} ; ret-addr: 0x{:x} ret-value: 0x{:x}",
                    self.pos,
                    addr,
                    out,
                    ret_addr,
                    self.regs().rax
                );
            } else {
                log::trace!(
                    "{}{} 0x{:x}: {} ; ret-addr: 0x{:x} ret-value: 0x{:x} {}",
                    color,
                    self.pos,
                    addr,
                    out,
                    ret_addr,
                    self.regs().rax,
                    self.colors.nc
                );
            }
            self.show_definition();
        }
    }

    #[inline]
    pub fn show_instruction_pushpop(&mut self, color: &str, ins: &DecodedInstruction, value: u64) {
        if self.cfg.verbose < 2 {
            return;
        }
        let out = self.format_instruction(ins);
        let addr = if ins.is_x86() { ins.address() } else { self.pc() };
        if self.cfg.verbose >= 2 {
            if self.cfg.nocolors {
                log::trace!("{} 0x{:x}: {} ;0x{:x}", self.pos, addr, out, value);
            } else {
                log::trace!(
                    "{}{} 0x{:x}: {} ;0x{:x} {}",
                    color,
                    self.pos,
                    addr,
                    out,
                    value,
                    self.colors.nc
                );
            }
            self.show_definition();
        }
    }

    #[inline]
    pub fn show_instruction_taken(&mut self, color: &str, ins: &DecodedInstruction) {
        if self.cfg.verbose < 2 {
            return;
        }
        let out = self.format_instruction(ins);
        let addr = if ins.is_x86() { ins.address() } else { self.pc() };
        if self.cfg.verbose >= 2 {
            if self.cfg.nocolors {
                log::trace!("{} 0x{:x}: {} taken", self.pos, addr, out);
            } else {
                log::trace!(
                    "{}{} 0x{:x}: {} taken {}",
                    color,
                    self.pos,
                    addr,
                    out,
                    self.colors.nc
                );
            }
            self.show_definition();
        }
    }

    pub fn show_instruction_not_taken(&mut self, color: &str, ins: &DecodedInstruction) {
        if self.cfg.verbose < 2 {
            return;
        }
        let out = self.format_instruction(ins);
        let addr = if ins.is_x86() { ins.address() } else { self.pc() };
        if self.cfg.verbose >= 2 {
            if self.cfg.nocolors {
                log::trace!("{} 0x{:x}: {} not taken", self.pos, addr, out);
            } else {
                log::trace!(
                    "{}{} 0x{:x}: {} not taken {}",
                    color,
                    self.pos,
                    addr,
                    out,
                    self.colors.nc
                );
            }
            self.show_definition();
        }
    }
}