طريقة بسيطة لاكتشاف النظام الوهمي

تم تحميل الصفحة في 0,8951994 ثانية
طريقة بسيطة لاكتشاف النظام الوهمي
إنضم
27 يناير 2018
المشاركات
567
الإعجابات
506
النقاط
93
هذه طريقة بسيطة لمعرفة إذا كان البرنامج يعمل علي نظام وهمي أو لا
الطريقة رأيتها علي ستاك أوفر فلاو وجيت هاب وبعض المواقع
والذي يميزها أنها بسيطة ولا تحتاج التعامل مع الريجستري أو الملفات أو مكاتب dll

هذا كود كتبته للتطبيق

C++:
#include <iostream>
#include <TerminalColors.h>
#include <irange.h>

using namespace rad::color;
using rad::range;

__forceinline bool IsVm()
{
    uint64_t average = 0;
    for (auto i : range(0, 20))
    {
        uint64_t t1 = __rdtsc();
        uint64_t t2 = __rdtsc();
        average += t2 - t1;
    }
    average /= 20;
    return average > 500;
}

int main()
{

    if (IsVm())
        cout << red << "[!] running in a virtual machine" << endl;
    else
        cout << green << "[*] not running in a virtual machine" << endl;
    cout << aquoa << "press any key to exit ..." << endl;
    getchar();
    return 0;   
}
وهذا البرنامج الناتج من الكومبايل 64 bit

IsVm | تحميل
 

Ahmed Al'jabari

إداري أقسام البرمجة
rankrankrankrank
إنضم
24 يونيو 2017
المشاركات
1,616
الإعجابات
1,319
النقاط
123
الإقامة
Turkey
سلام عليكم .. توجد طريقه تخلي برنامجك يضهر كانه نيتف وليس دوت نت هل عندك علم عنها
 
إنضم
18 أغسطس 2010
المشاركات
88
الإعجابات
67
النقاط
18
سلام عليكم .. توجد طريقه تخلي برنامجك يضهر كانه نيتف وليس دوت نت هل عندك علم عنها
عليكم السلام
بعيدا عن فكرة استخدام PACKER

برامج الدوت نت يتم عمل compile لها اثناء run time وذلك عن طريق الـ jitter
او just in time compilation

الفكره ان تقوم بتحويل البرنامج الي aot
ahead of time compilation
ويكون لديك برنامج native

يمكنك استخدام SharpNative

يوجد ايضا crossnet
 
إنضم
27 يناير 2018
المشاركات
567
الإعجابات
506
النقاط
93
ممكن تشرح الكود ؟
الفكرة هي حساب الزمن المستغرق بين تنفيذ التعلمتين __rdtsc ووحدة القياس هي عدد دورات المعالج
يقولون إنه في النظام الحقيقي غالبا لا يتخطي 100 دورة وممكن أقل من 30 دورة
أما في النظام الوهمي فقد يزيد عن 500 وربما يصل إلي بضعة آلاف

وأنا أقوم بحساب المتوسط لعشرين مرة لتقليل نسبة الخطأ
ودالة range تجدها هنا
c++ python like range function to use in for loops
 
إنضم
27 يناير 2018
المشاركات
567
الإعجابات
506
النقاط
93
سلام عليكم .. توجد طريقه تخلي برنامجك يضهر كانه نيتف وليس دوت نت هل عندك علم عنها
لا أعلم ماذا تقصد بأن برنامج دوت نت يظهر كأنه ناتيف

لو تريد فقط تشغيل دوت نت داخل برنامج ناتيف فيمكنك ذلك حتي بدون وجود الملف علي الهارد لكن البروسس هاكر يعرف أنه يشغل دوت نت

لو بتتكلم عن ملف البرنامج علي الهارد فأي شخص يفحصه هيعرف إنه دوت نت
أما لو تقصد تخفيه من البروسس هاكر
فالبروسس هاكر يكتشفه بسبب مكتبات الدوت نت

طريقة عمل الدوت نت هي مثل جافا حيث يتم تلويد بعض المكتبات المكتوبة بالسي ++ في الذاكرة
وهذه المكتبات تعمل كما يسمي jit وتحول il assembly إلي كود asm ينفذه المعالج
لذلك البروسس هاكر يستخدم دالة اسمها PhGetProcessIsDotNetEx
مكتوبة هنا
https://github.com/processhacker/processhacker/blob/master/phlib/native.c

ليعرف هل البروسس فيه المكتبات هذه أم لا

وستلاحظ أنه أيضا يوجد فحص بالكشف عن وجود مقبض معين تستخدمه مكتبات الدوت نت
ولكن إذا تحقق هذا الشرط :
C++:
if (InFlags & PH_CLR_USE_SECTION_CHECK)
لكن بعد بحث بسيط باستخدام ميزة البحث في جيت هاب ظهر لي أن البارامتر InFlags دائما يدخل 0 لذا فالشرط لا يتحقق
وهنا ينتقل إلي الفرع هذا :

C++:
    else
    {
        NTSTATUS status;
        HANDLE processHandle = NULL;
        ULONG flags = 0;
#ifdef _WIN64
        BOOLEAN isWow64;
#endif

        if (!ProcessHandle)
        {
            if (!NT_SUCCESS(status = PhOpenProcess(&processHandle, PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ, ProcessId)))
                return status;

            ProcessHandle = processHandle;
        }

#ifdef _WIN64
        if (InFlags & PH_CLR_NO_WOW64_CHECK)
        {
            isWow64 = !!(InFlags & PH_CLR_KNOWN_IS_WOW64);
        }
        else
        {
            isWow64 = FALSE;
            PhGetProcessIsWow64(ProcessHandle, &isWow64);
        }

        if (isWow64)
        {
            flags |= PH_CLR_PROCESS_IS_WOW64;
            status = PhEnumProcessModules32(ProcessHandle, PhpIsDotNetEnumProcessModulesCallback, &flags);
        }
        else
        {
#endif
            status = PhEnumProcessModules(ProcessHandle, PhpIsDotNetEnumProcessModulesCallback, &flags);
#ifdef _WIN64
        }
#endif

        if (processHandle)
            NtClose(processHandle);

        if (IsDotNet)
            *IsDotNet = (flags & PH_CLR_VERSION_MASK) && (flags & (PH_CLR_MSCORLIB_PRESENT | PH_CLR_JIT_PRESENT));

        if (Flags)
            *Flags = flags;

        return status;
    }
البروسس هاكر يقرأ الموديولس أو مكتبات الدلل باستخدام ReadProcessMemory ولا يستخدم سناب شوت
المهم أنه إذا عثر علي مكتبات clr أو mscore مثل mscoree.dll فسيعلم أن البروسس فيه .net

هناك طريقان أعرفهما لتخطي مثل هذا الفحص وهما
- تلويد هذه المكتبات بعمل manual mapping ولكنه صعب جدا خصوصا لمثل هذه المكتبات
- استخدام LoadLibraryA وبعدها تحذف الموديول من القائمة المرتبطة في peb وهذه أضمن وأسهل من الأولي وغالبا قد تعمل المكتبات بشكل صحيح
فقط قد تحتاج لعمل هوكات لدالة أو دالتين معينتين ثم تعمل المكتبة بشكل عادي

أو عمل هوكات لحماية البروسس ومنع فتح مقبض له مثلا user mode rootkit

أما afrog33k/SharpNative و CodePlex Archive
فيقولون إنهم يحولون سورس السي شارب إلي لغة الدي أو لغة السي وهي لغات تترجم للغة الآلة

وهناك أداة من مايكروسوفت اسمها ngen وتقوم بتحويل الملف الدوت نت إلي ناتف
ولكن انتبه كيف تعمل :

إنها تقوم بعمل jit لكن أثناء الكومبايل ولا تحول البرنامج فقط إلي ناتيف بل تحول و تدمج معه ملفات
ومكتبات الدوت نت إلي ناتيف لذا قد يكبر حجم البرنامج من عدة كيلو بايتات إلي 60 ميجا أو أكثر بكثير
 
الإعجابات: 4w1il
إنضم
27 يناير 2018
المشاركات
567
الإعجابات
506
النقاط
93
وهذا مثال علي ملف الفيجوال ستوديو deven.exe

الملف ناتيف مكتوب بالس ++ كما هو موضح بأداة dumpbin.exe





لكنه يستخدم مكتبات الدوت نت بعد تشغيله مثل ما في هذه الصورة






لذا قام البروسس هاكر بتعليمه كملف دوت نت

 
الإعجابات: 4w1il
إنضم
18 أغسطس 2010
المشاركات
88
الإعجابات
67
النقاط
18
من الجدير بالذكر ايضا ان هذه الطريقه ليست فعاله لان معظم ال hypervisors
تعمل تقريبا مثل الاجهزه العاديه في الوضع الطبيعي حاليا
وايضا مع اختلاف انواع المعالجات

قمت بتعديل الكود في الاعلي ليعمل علي لينكس

وهنا صوره VT-x disabled




لاحظ فرق التوقيت

الان لنقلل الفرق ليطابق الجهاز الحفيقي
vt-x enabled





وطبعا هذا اختبار فقط للـ virtualization
في حالة الـ emulation
لن يتم التعرف علي الفرق سيكون مطابق للجهاز الحقيقي بغض النظر عن دعم الجهاز للـ vt-x او لا

-
يوجد طرق اعقد قليلا تعمل بدون الحاجه الي ريجستري وهكذا
عن طريق استخدام هذه الطريقه مع اشياء اخري
 
الإعجابات: 4w1il

DunK77

Beginner Developer
rank
إنضم
4 سبتمبر 2019
المشاركات
3
الإعجابات
0
النقاط
1
الإقامة
Canada
لا يمكن الاعتماد على هذه الطريقة بحساب الفترة الزمنية لتنفيذ كود معين لانها ستعطي False positive كثير.
لا يوجد طريقة فعالة لكشف النظام الافتراضي من النظام الحقيقي لانه يمكن جعل هذا الاول مطابق بنسبة 99.9% للأخير.
 

الأعضاء النشطين حاليآ الذين يشاهدون هذا الموضوع (1 عضو و 1 ضيف)

خيارات الاستايل

نوع الخط
مودك
اخفاء السايدر بار OFF
توسيط المنتدى OFF
فصل الأقسام OFF
الأقسام الفرعية OFF
عرض المشاركات
حجم الخط
معلومات العضو OFF
إخفاء التوقيع OFF

إرجاع خيارات الإستايل