@@ -577,6 +577,7 @@ struct VM {
577577 UNKNOWN_MANUFACTURER,
578578 OSXSAVE,
579579 NSJAIL_PID,
580+ PCI_VM,
580581 // ADD NEW TECHNIQUE ENUM NAME HERE
581582
582583 // start of settings technique flags (THE ORDERING IS VERY SPECIFIC HERE AND MIGHT BREAK SOMETHING IF RE-ORDERED)
@@ -10205,6 +10206,52 @@ struct VM {
1020510206#endif
1020610207 }
1020710208
10209+
10210+ /* *
10211+ * @brief Check for PCIe bridge names for known VM keywords and brands
10212+ * @category Linux
10213+ * @implements VM::PCI_VM
10214+ */
10215+ [[nodiscard]] static bool lspci () {
10216+ #if (!LINUX)
10217+ return false ;
10218+ #else
10219+ if (!(
10220+ (util::exists (" /usr/bin/lspci" )) ||
10221+ (util::exists (" /bin/lspci" )) ||
10222+ (util::exists (" /usr/sbin/lspci" ))
10223+ )) {
10224+ debug (" PCI_VM: " , " binary doesn't exist" );
10225+ return false ;
10226+ }
10227+
10228+ const std::unique_ptr<std::string> result = util::sys_result (" lspci 2>&1" );
10229+
10230+ if (result == nullptr ) {
10231+ debug (" PCI_VM: " , " invalid stdout output from lspci" );
10232+ return false ;
10233+ }
10234+
10235+ const std::string full_command = *result;
10236+
10237+ auto pci_finder = [&](const char * str) -> bool {
10238+ if (util::find (full_command, str)) {
10239+ debug (" PCI_VM: found " , str);
10240+ return true ;
10241+ } else {
10242+ return false ;
10243+ }
10244+ };
10245+
10246+ if (pci_finder (" QEMU PCIe Root port" )) { return core::add (brands::QEMU); }
10247+ if (pci_finder (" QEMU XHCI Host Controller" )) { return core::add (brands::QEMU); }
10248+ if (pci_finder (" QXL paravirtual graphic card" )) { return core::add (brands::QEMU); }
10249+ if (pci_finder (" Virtio" )) { return true ; } // could be used by a lot of brands, who knows
10250+
10251+ return false ;
10252+ #endif
10253+ }
10254+
1020810255 // ADD NEW TECHNIQUE FUNCTION HERE
1020910256
1021010257
@@ -11226,6 +11273,7 @@ struct VM {
1122611273 case UNKNOWN_MANUFACTURER: return " UNKNOWN_MANUFACTURER" ;
1122711274 case OSXSAVE: return " OSXSAVE" ;
1122811275 case NSJAIL_PID: return " NSJAIL_PID" ;
11276+ case PCI_VM: return " PCI_VM" ;
1122911277 // ADD NEW CASE HERE FOR NEW TECHNIQUE
1123011278 default : return " Unknown flag" ;
1123111279 }
@@ -11813,6 +11861,7 @@ std::pair<VM::enum_flags, VM::core::technique> VM::core::technique_list[] = {
1181311861 { VM::UNKNOWN_MANUFACTURER, { 50 , VM::unknown_manufacturer } },
1181411862 { VM::OSXSAVE, { 50 , VM::osxsave } },
1181511863 { VM::NSJAIL_PID, { 75 , VM::nsjail_proc_id } },
11864+ { VM::PCI_VM, { 100 , VM::lspci } },
1181611865 // ADD NEW TECHNIQUE STRUCTURE HERE
1181711866};
1181811867
0 commit comments