SimpleAtor ("Simple-Fath") عبارة عن محاكي تطبيق X64 الذي يركز على Windows يركز على Windows والذي يستفيد من العديد من الميزات الجديدة التي تمت إضافتها في Windows 10 Spring Update (1803) ، وتسمى أيضًا "Redstone 4" ، مع تحسينات إضافية تم إجراؤها في Windows 10 October (1809) ، AKA "Redstone 5".
وهي Simpleator تعتمد على:
يُقصد به بمثابة إثبات المفهوم حول كيفية بناء بيئات التفجير الأكثر بساطة وأسرع ، بالإضافة إلى المزيد من الحاويات المحدودة للموارد التي يمكن أن تشغل أعباء عمل بدون خادم (وظائف AWS Lambdas / Azure) دون الحاجة إلى نظام تشغيل ضيف.
يمكن بناء SimpleAtor مع Visual Studio 2017 وأحدث Windows SDK (1809). لاحظ أنه لا يمكن استخدام SDKs الأقدم ، لأنها لا تدعم تعريفات WHVP الأحدث ، وأن تبسيط نفسه يدعم فقط أنظمة Windows 64 بت التي تعمل ببناء 17763 أو أعلى (Redstone 5/1809).
نافذة الشاشة الرئيسية التي تتتبع مكالمات النظام ، الموضحة هنا تعرض إخراج وحدة التحكم من تطبيق ضيف الاختبار:
نافذة التسجيل ، التي يمكن استخدامها عندما يكون هناك تأكيد/مشكلة مع المحاكي (سوف يتجمد مؤشر ترابط واجهة المستخدم ، وبالتالي الرسالة "غير المستجيبة"):
وأخيراً ، إذا تمكين علامة FLG_SHOW_LDR_SNAPS في PEB ، فإن نافذة التصحيح تعرض مكالمات إلى DbgPrint من المحمل (وإلا
TBD TBD إضافة روابط
كان المطورون يكتبون ، ويستفيدون من تقنيات المحاكاة لعقود ، فلماذا تكتب محاكيًا آخر؟
أولاً ، يعد إدخال واجهة برمجة تطبيقات المحاكاة الافتراضية الفعلية في قلب النوافذ تحولًا دراماتيكيًا ضعيفًا (بطريقة إيجابية) إلى الطبيعة المغلقة السابقة لمنصة Hyper-V. على الرغم من وجود واجهات برمجة التطبيقات و IOCTLs غير الموثقة من خلال مكتبة جهاز البنية التحتية الافتراضية (VID) ، فإن طبقة Win32 المدعومة والمستقرة هي تحسن موضع ترحيب. بالفعل ، تدعم QEMU الآن استخدام WHVP لتسارعها ، ومن المحتمل أن تشحن VirtualBox 6.0 مع هذا الدعم أيضًا (تم تنفيذه بالفعل في المستودع). فقط VMware يقف بمفرده ويتحدى. فيما يتعلق بهذا الموضوع ، فإن تعلم كيفية الاستفادة من واجهة برمجة التطبيقات الجديدة هذا ليس بالضرورة موضوعًا سهلًا ، لذلك أردت أن أتعلم - ومشاركته مع الآخرين - كيف تعمل هذه الواجهات الجديدة.
ثانياً ، عند النظر إلى تقنيات المحاكاة ، عادة ما يكون هناك ثلاث قوى قيادة حديثة لاستخدامها:
كان اهتمامي الرئيسي هو النظر إلى الرصاصة الثالثة-التي تم تحقيقها حتى الآن من خلال مضاهاة للنظام الكامل ، مع بعض التطبيقات المخصصة التي تستخدم نماذج الإفراط في التوصية ، ولكن لا تزال تجلب الكثير من التعقيد-وهي مثال على ذلك كونه معظم محكمة مكافحة الفيروسات ، مثل تلك التي تم تنفيذها في Windows Defender (انظر بعض الأبحاث العظيمة [هنا] و [هنا]). علاوة على ذلك ، من المحتمل أن يكون الباحثون المطلعون على Qilin قد رأوا بالفعل العديد من روابط Python البسيطة التي تبني عليها بسهولة من أجل "تدوير" عملية Windows بسرعة باستخدام طراز Over-subscription من خلال الاستفادة من QEMU كمحاكي نظام كامل ولكن بدون صورة OS الأساسية.
قررت متابعة وسيلة أخرى-نوع من تطبيق "Windows" ، حيث تكون الثنائيات الوحيدة المعينة في مساحة عنوان الضيف هي محمل OS للمضيف (ntdll.dll) والثنائي المستهدف ، وحيث سيتم توفير مساحة للعنوان 256 GB (لا يوجد أي شيء لا يتم توفيره بين Appconts بين الأدوات الواضحة بين الخطة الافتراضية بين الضيف ، في "Sandbox". sandboxing). طالما أن المحاكي سيوفر هياكل البيانات الأساسية التي تم إنشاؤها في kernel لمحملات المحمل والنظام ، يمكن أن يعمل المضيف بسرعات أصلية ، مع انتقالات حلقة متميزة فقط تسبب المخارج.
بعد ذلك ، من أجل البساطة ، يعترض مزود استدعاء النظام على مكالمات النظام التي يتم إجراؤها بواسطة الضيف VM ، ويمكنها العمل بإحدى الطرق الثلاث:
اعتمادًا على المكان الذي تقع فيه الاحتياجات بين الأداء والتعقيد والتوافق والأمان ، هناك حاجة إلى أقل من 500 سطر من التعليمات البرمجية لتنفيذ ما يكفي من الرصاص 1 و 2 أعلاه للحصول على تطبيق اختبار بسيط للتحميل ، وعرض رسالة "Hello World" ، والخروج ، مع الكثير من مشكلات الأمن المحتملة في التعامل مع مكالمات النظام. ربما يمكن أن يخفف مضاعفة قاعدة البيانات بشكل واقعي لمعظم مشكلات الأمان في مكالمات النظام (ناقص نقاط الضعف الفعلية في kernel OS Host - والتي يمكن أن يخففها صندوق الرمل).
ولكن حتى في 1000 سطر من التعليمات البرمجية ، نظرًا لأن جميع مكالمات النظام يتم إرسالها في النهاية إلى نظام التشغيل ، فإن SimpleAtor يتصرف أشبه بتنفيذ "Seccomp" أعلى مجموعة CGROUP على Linux ، بدلاً من المحاكمات الأكثر تعقيدًا التي نراها اليوم.
أخيرًا ، تجدر الإشارة إلى أن هناك اهتمامًا متجددًا بمساحة الحوسبة/الحاويات السحابية لتقليل الموارد اللازمة لتشغيل أعباء العمل مثل Amazon Lambdas أو وظائف Azure ، وهي قطع من الكود بدون خادم تعمل في الحاويات ، والتي لا تزال تتطلب تدوير نظام تشغيل ضيف كامل. من خلال التحكم الأكثر صرامة في حدود الأمان التي توفرها SimpleAtor ، يمكن للمرء أن يتخيل القدرة على تشغيل JVM أو .NET Core كتطبيق مخصص دون الحاجة إلى نظام تشغيل كامل للضيف.
TBD TBD
هناك 3 أجزاء رئيسية مثيرة للاهتمام (بالنسبة لي) حول كيف يحقق Simpleator بيئة تنفيذ ضيف فريدة تجعل من أبسط بكثير تشغيل تطبيقات Windows:
إنشاء PEB و TEB مع نفس النوع من البيانات التي سيتم إعداد وظائف MiCreatePebOrTeb في kernel ، ولكن مع أعلام محددة لتسهيل التشغيل تحت بيئة الضيف ، بما في ذلك
إنشاء رسم خرائط 1: 1 بين عناوين الضيف والعناوين ، والاستفادة من ميزات "متطلبات العنوان" الجديدة لقفل المخصصات لهذا النطاق. لاحظ أنه في الوقت الحالي ، يقوم Simpleator بتعيين منطقة KUSER_SHARED_DATA الأصلية على 0x7FFE0000 مما يعني أن مرور الوقت "ينظر إليه" من قبل الضيف بفضل تحديث حقول SystemTime و InterruptTime التي يتم الاحتفاظ بها من قبل المضيف. سيتطلب عزل هذه المنطقة مؤقتًا دوريًا لمحاكاة تحديث هذه القيمة.
تعيين صورة Ntdll.dll الأصلية والاستفادة من مكالمات نظام OS المضيف لتنفيذ معظم عمليات التحميل أصليًا ، مما يوفر الوصول إلى التحولات الحلقية INT 2E و SYSCALL و INT 2C .
بالإضافة إلى ذلك ، من أساس الشكل ، يتكون Simpleator من ثلاث ثنائيات:
Simpleator.exe الذي ينفذ شاشة التصحيح. هذا المكون مسؤول عن عرض واجهة المستخدم لشاشة وتصحيح وتسجيل Windows ، واستضافة أنبوب اسمه يسمح للمحاكي بالتواصل معه ، وتحميل المحاكي ببيئة مناسبة (اليوم ، هذا يعني إعداد مساحة عنوان 256 جيجابايت ، في المستقبل ، وهذا يعني أيضًا صندوق الرمل).Provider.dll الذي ينفذ مزود استدعاء النظام لنظام التشغيل Windows 10 1809 (RS5) و Windows 10 1903 (19H1) ، فإن الإنشاءات الحالية مدعومة.Emulator.exe . إنه مسؤول بشكل أساسي عن التواصل مع مراقبة التصحيح عبر الأنبوب ، والتعامل مع رمز انتقال الحلقة للتحدث من وإلى مزود استدعاء النظام ، والقيام بإعداد مساحة العنوان الأولي وتحميل PE لمكتبة لوادر Ntdll.dll والتطبيق المستهدف الثنائي. أولاً ، يجب عليك تثبيت نظام Windows Hypervisor ، والذي يتطلب أيضًا تثبيت وتمكين Hyper-V وتمكينه. يمكنك القيام بذلك إما باستخدام سطر الأوامر التالي:
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
أو عن طريق إطلاق واجهة المستخدم الرسومية على النحو التالي:
OptionalFeatures.exe
ثم التحقق من مربعات الاختيار "Hyper-V" و "Windows Hypervisor Platform" ، كما هو موضح في لقطة الشاشة أدناه.
يجب أن يكون لديك حقوق إدارية لاستخدام أي من هذه الأوامر.
من الواضح ، يرجى التأكد من أن الأجهزة تدعم تقنية المحاكاة الافتراضية للأجهزة (مثل Intel VT-X).
إذا كنت ترغب في معرفة المزيد عن بحثي أو عملي ، فأنا أدعوك إلى مراجعة مدونتي على http://www.alex-ionescu.com بالإضافة إلى شركة التدريب والاستشارات الخاصة بي ، ويندري ندوي و Solutions Inc. ، على الموقع http://www.windows-nternals.com.
TBD TBD
تم تصميم SimpleAtor لتقليل حجم الرمز وتعقيدها - وهذا يأتي بتكلفة من المتانة والأهم من ذلك ، الأمن. على سبيل المثال ، في التنفيذ الحالي ، يتم تمرير NtCreateFile و NtOpenFile و NtWriteFile بالكامل إلى kernel المضيف ، مما يعني أن الحمولة "الخبيثة" يمكن أن تكتب أي ملفات على القرص التي يمكن لعملية المحاكي المضيفة الوصول إليها ، نظرًا لعدم وجود صندوق رمل إضافي حول المضيف.
علاوة على ذلك ، لاحظ أنه تم تطبيق الحد الأدنى الصارم لمكالمات النظام فقط للحصول على تطبيق Testapp.exe لإطلاق النص وطباعته وخروجه. سيتطلب تشغيل تطبيق أكثر تعقيدًا مثل Cmd.exe المزيد من العمل ، خاصة وأن بعض واجهات برمجة التطبيقات تتوقع إجراء اتصال مع CSRSs عبر LPC وإعادة بيانات معينة مرة أخرى. في الوقت الحالي ، يتظاهر SimpleAtor بأنها عملية محمية آمنة VTL-1 ، والتي تحد بشكل كبير مما تحاول بعض واجهات برمجة تطبيقات الضيوف القيام به ، وبالتالي ، تعطل بعض المكالمات الصريحة (مثل ، على سبيل المثال ، بعض من حولهم).
ستكون هناك حاجة إلى المزيد من المحاكاة وتعديل مساحة عنوان الضيف لإلغاء حظر استخدام واجهة برمجة التطبيقات هذه.
SimpleAtor لا يفعل الكثير من التحقق من الأخطاء والتحقق من صحة ومعالجة الاستثناءات. إنه ليس برنامجًا قويًا مصممًا لاستخدام الإنتاج ، بل هو قاعدة رمز مرجعية .
Copyright 2018 Alex Ionescu. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided
that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and
the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions
and the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS SOFTWARE IS PROVIDED BY ALEX IONESCU ``AS IS'' AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ALEX IONESCU
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The views and conclusions contained in the software and documentation are those of the authors and
should not be interpreted as representing official policies, either expressed or implied, of Alex Ionescu.