#qemu #check #virtual-machine #platform #running #binary #x86

no-std runs_inside_qemu

Small no_std-lib that checks if the binary is running inside a QEMU virtual machine. Only works on x86/x86_64 platforms

8 stable releases

1.2.1 Nov 10, 2021
1.1.0 Oct 14, 2021
1.0.4 Aug 11, 2021
1.0.2 Jul 7, 2021

#173 in No standard library

MIT license

10KB
80 lines

Rust lib runs_inside_qemu

runs_inside_qemu is a small no_std-lib that checks if the binary is running inside a QEMU virtual machine. It doesn't need heap allocations and only works on x86/x86_64 platform.

Under the hood, this is a wrapper around the awesome crate https://crates.io/crates/raw-cpuid.

This crate was build/tested with rustc 1.55.0-nightly. It won't work on stable as long as inline assembly is not part of stable rust.

Example Code

use runs_inside_qemu::runs_inside_qemu;

fn main() {
    // If we are in QEMU, we use the nice "debugcon"-feature which maps
    // the x86 I/O-port `0xe9` to stdout or a file.
    if runs_inside_qemu() {
        unsafe {
            x86::io::outb(0xe9, b'H');
            x86::io::outb(0xe9, b'e');
            x86::io::outb(0xe9, b'l');
            x86::io::outb(0xe9, b'l');
            x86::io::outb(0xe9, b'o');
            x86::io::outb(0xe9, b'\n');
        }
    }
}

Limitations

This doesn't work if you pass -cpu host to QEMU, because in this case the CPU brand string is not "QEMU Virtual CPU version 2.5+".

Rust version / MSRV

This crate needs the nightly toolchain. With Rust 1.56.1 stable, it doesn't build.

Dependencies

~675KB
~12K SLoC