سؤال

هل هناك طريقة لتحديد من داخل VM أن تشغيل التعليمات البرمجية داخل VM ؟

أعتقد أن هناك أكثر أو أقل طرق سهلة لتحديد معين VM أنظمة خاصة إذا كان VM لديه مزود ملحقات المثبتة (مثل VirtualBox أو VMWare).ولكن هل هناك طريقة عامة إلى تحديد أن كنت لا تعمل مباشرة على وحدة المعالجة المركزية ؟

هل كانت مفيدة؟

المحلول

الكثير من البحوث حول هذا مخصص للكشف عن ما يسمى "الحبة الزرقاء" الهجمات ، وهو الخبيثة hypervisor فعليا محاولة للتهرب من الكشف.

الكلاسيكية خدعة لكشف VM هو لملء ITLB, تشغيل التعليمات التي يجب أن يكون الافتراضية (التي بالضرورة يزيل من هذا المعالج الدولة عندما يعطي تحكم hypervisor) ثم تشغيل بعض رمز للكشف إذا كان ITLB لا تزال مأهولة بالسكان.الورقة الأولى على أنه يقع هنا, و بدلا الملونة التفسير من الباحث بلوق و البديل آلة ايباك ارتباط إلى بلوق المادة (صور مكسورة).

خلاصة القول من المناقشات بشأن هذا هو أن هناك دائما وسيلة للكشف عن البرمجيات الخبيثة hypervisor و هو أبسط من ذلك بكثير لاكتشاف واحد هو أن لا تحاول إخفاء.

نصائح أخرى

القبعة الحمراء لديه البرنامج الذي يكتشف (إن وجد) الافتراضية المنتج يتم تشغيل تحت: virt-what.

باستخدام طرف ثالث-الحفاظ على أداة هذا هو هذا هو أفضل استراتيجية على المدى الطويل من محاولة لفة الخاص بك والكشف عن المنطق:أكثر العيون (اختبار ضد المزيد من المنتجات الافتراضية) ، الخ.

نهج تجريبي أكثر هو للتحقق من المعروف VM برامج تشغيل الأجهزة.هل يمكن كتابة استعلامات WMI لتحديد أقول وير محول العرض, محرك الأقراص, محول الشبكة ، وما إلى ذلك.هذا من شأنه أن يكون مناسبا إذا كنت تعرف أنك كان عليك أن تقلق حيال المعروف VM المضيف الأنواع في البيئة الخاصة بك.هنا مثال على القيام بذلك في بيرل, التي يمكن تصديرها إلى اللغة التي تختارها.

ذلك يعتمد على ما كنت بعد:

  • إذا VM لا يختبئ منك على الغرض يمكنك استخدام بعض المعروف هوك.مثل البحث عن VmWare السائقين أو وجود بعض السلاسل في الذاكرة أو بعض العلامات المنذرة الأخرى.

  • إذا VM هو حقا يريد لك أن تفعل أشياء خاصة على بعض واضح هوك في المكان ، مثل تعديل معرف المعالج أو إضافة بعض سجلات خاصة أنه يمكنك الوصول إلى الكشف عن ذلك.أو s جهاز خاص في مكان معروف في الذاكرة (على افتراض يمكنك الحصول على الخام الوصول إلى الذاكرة الفعلية مساحة من العالم).علما بأن الحديثة آلة التصاميم مثل IBM Power6 والشمس UltraSparc T1/T2 تهدف إلى تشغيل دائما hypervisor و ابدأ مباشرة على الأجهزة الخام.واجهة "الأجهزة" أن نظام التشغيل يستخدم في الواقع واجهة ot a hypervisor طبقة البرامج مع أي طريقة للحصول على من حوله.في هذه الحالة الكشف تافهة لأنه ثابت هو "نعم".هذا هو المستقبل المحتمل اتجاه لجميع أنظمة الكمبيوتر التي يمكن أن تحمل النفقات العامة ، نظرة على الدعم في التصاميم الأخيرة مثل فريسكالي QorIQ P4080 رقاقة ، على سبيل المثال (www.freescale.com/qoriq).

  • إذا VM عمدا في محاولة لإخفاء وأنت تطارد وجوده ، بل هو لعبة القط والفأر حيث توقيت واضطراب الأداء المختلفة الملف الشخصي VM هو تقريبا دائما ما تعطيه بعيدا.ومن الواضح أن هذا يعتمد على كيفية VM تنفيذ وكم دعم الأجهزة هناك في مكان في العمارة (أعتقد بيئات تشغيل zseries المركزية هو أفضل بكثير في إخفاء وجود VM أو كومة من نظام رصد السفن في إطار معين من نظام التشغيل العادية x86 الجهاز ، على سبيل المثال).انظر http://jakob.engbloms.se/archives/97 عن بعض المناقشات حول هذا الموضوع.فمن الممكن أن تحاول إخفاء مثل VM, ولكن الكشف من المحتمل جدا أن يفوز دائما إذا كان يحاول من الصعب بما فيه الكفاية.

لقد ركض مرة واحدة عبر تجميع التعليمات البرمجية المتكررة التي قلت لك لو كنت في VM....لقد بحثت ولكن لم أستطع العثور على المقالة الأصلية.

لم أجد هذا على الرغم من: الكشف عن ما إذا كان البرنامج يعمل داخل الجهاز الظاهري.

آمل أن يساعد.

في معظم الحالات, لا يجب أن تحاول.يجب أن لا نهتم إذا كان شخص ما يتم تشغيل التعليمات البرمجية الخاصة بك في VM, ما عدا في حالات قليلة ومحددة.

إذا كنت بحاجة إلى, في لينكس الطريقة الأكثر شيوعا هو أن ننظر إلى /sys/devices/virtual/dmi/id/product_name, التي سيتم سرد اسم الكمبيوتر المحمول/اللوحة الرئيسية على معظم أنظمة حقيقية ، hypervisor على معظم أنظمة افتراضية. dmidecode | grep Product هو طريقة أخرى شائعة ، ولكن أعتقد أن هذا يتطلب وصول الجذر.

هنا هو (جافا + ويندوز) حل لتحديد ما إذا كان وراء آلة الفعلية أو الظاهرية.

الأجهزة الظاهرية الأمثلة:

الشركة المصنعة

  • كسين
  • Microsoft Corporation
  • innotek GmbH
  • القبعة الحمراء
  • VMware, Inc.

نموذج

  • HVM domU
  • الجهاز الظاهري
  • فيرتثلبوإكس
  • KVM
  • VMware Virtual منصة

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class OSUtil {
    
    public static final List<String> readCmdOutput(String command) {
        List<String> result = new ArrayList<>();
    
        try {
            Process p=Runtime.getRuntime().exec("cmd /c " + command);
            p.waitFor();
            BufferedReader reader=new BufferedReader(
                    new InputStreamReader(p.getInputStream())
                    );
            String line;
            while((line = reader.readLine()) != null) {
                if(line != null && !line.trim().isEmpty()) {
                    result.add(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return result;
    }
    
    public static final String readCmdOutput(String command, int lineNumber) {
        List<String> result = readCmdOutput(command);
        if(result.size() < lineNumber) {
            return null;
        }
    
        return result.get(lineNumber - 1);
    }
    
    public static final String getBiosSerial() {
        return readCmdOutput("WMIC BIOS GET SERIALNUMBER", 2);
    }
    
    public static final String getHardwareModel() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MODEL", 2);
    }
    
    public static final String getHardwareManufacturer() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MANUFACTURER", 2);
    }
    
    public static void main(String[] args) {
        System.out.println("BIOS Serial: " + getBiosSerial());
        System.out.println("Hardware Model: " + getHardwareModel());
        System.out.println("Hardware Manufacturer: " + getHardwareManufacturer());
    }
    }
    

يمكنك استخدام إخراج أن تقرر ما إذا كان VM أو آلة المادية:

آلة المادية الإخراج:

BIOS المسلسل:2HC3J12
نموذج الأجهزة:Inspiron 7570
الشركة المصنعة للجهاز:شركة Dell Inc.

الجهاز الظاهري الناتج:

BIOS المسلسل:0
نموذج الأجهزة:Innotec GmBH
الشركة المصنعة للجهاز:مربع الظاهري

أحد الأمثلة الجيدة على ذلك على ما يبدو يقوم استعلام WMI عن الشركة المصنعة اللوحة الأم, و في حال عودة "مايكروسوفت" كنت في VM.يعتقد أعتقد أن هذا هو فقط من أجل وير.هناك طرق مختلفة أن أقول لكل VM البرنامج المضيف.

هذه المقالة هنا http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx لديه بعض الاقتراحات الجيدة وروابط عدة طرق للكشف عن إذا كنت في VM (VMWare و VirtualPC على الأقل).

كنت قد تكون قادرة على تحديد ما إذا كنت في جهاز ظاهري من خلال النظر في عنوان MAC الخاص بالشبكة.كسين على سبيل المثال عادة ما يوصي باستخدام نطاق معين من عناوين 00:16:3e:xx:xx:xx.

هذه ليست مضمونة كما أنها تصل إلى مسؤول نظام تحديد عنوان MAC يحلو لهم.

في أنظمة لينكس ، يمكنك محاولة البحث عن الملفات المشتركة على /proc.

سبيل المثال ، existente من /proc/vz/ أقول لك هو OpenVZ.

هنا هو دليل كامل للكشف عن VM environent تحت لينكس دون أن "شرب حبوب منع الحمل" :)

TrapKIT يوفر ScoopyNG ، أداة تحديد وير - أنها محاولات للتغلب على التهرب التقنيات ولكن ليس بالضرورة ان الهدف أي البرمجيات الافتراضية الأخرى من VMware.المصدر الثنائيات المتاحة.

إذا كان VM لا وظيفة جيدة ، يجب أن تكون غير مرئية إلى العميل أنه يجري الافتراضية.ومع ذلك ، يمكن للمرء أن ننظر إلى القرائن الأخرى.

أتصور أن تبحث عن المعروف أو برامج محددة VM البيئة أن يكون أفضل طريقة ممكنة.

على سبيل المثال ، على VMWare العميل تشغيل ويندوز ، vmxnet.sys قد يكون برنامج تشغيل شبكة الاتصال, عرض وير تسارع AMD PCNet محول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top