Simpleator ("Simple-ator") เป็นแอปพลิเคชันแอปพลิเคชันผู้ใช้โหมดผู้ใช้ Windows-Imfentric-Imflement ที่เป็นนวัตกรรมซึ่งใช้ประโยชน์จากคุณสมบัติใหม่ ๆ ที่เพิ่มเข้ามาใน Windows 10 Spring Update (1803) หรือที่เรียกว่า "Redstone 4" พร้อมการปรับปรุงเพิ่มเติมที่ทำใน Windows 10 ตุลาคม (1809)
กล่าวคือง่ายขึ้นอยู่กับ:
มันหมายถึงการพิสูจน์แนวคิดเกี่ยวกับวิธีการสร้างสภาพแวดล้อมการระเบิดของ Sandboxed ที่ง่ายขึ้นและเร็วขึ้นรวมถึงคอนเทนเนอร์ที่ จำกัด ทรัพยากรมากขึ้นซึ่งสามารถเรียกใช้เวิร์กโหลดที่ไม่มีเซิร์ฟเวอร์ (AWS Lambdas / Azure) โดยไม่ต้องใช้ระบบปฏิบัติการแขก
Simpleator สามารถสร้างได้ด้วย Visual Studio 2017 และ Windows SDK ล่าสุด (1809) โปรดทราบว่าไม่สามารถใช้ SDK ที่มีอายุมากกว่าได้เนื่องจากไม่สนับสนุนคำจำกัดความของ WHVP ที่ใหม่กว่าและตัวง่าย ๆ นั้นรองรับระบบ Windows 10 64 บิตที่ใช้งานสร้าง 17763 หรือสูงกว่า (Redstone 5 /1809)
หน้าต่างจอภาพหลักที่ติดตามการโทรของระบบแสดงที่นี่แสดงเอาต์พุตคอนโซลจากแอปพลิเคชันทดสอบแขก:
หน้าต่างการลงทะเบียนซึ่งสามารถใช้งานได้เมื่อมีการยืนยัน/ปัญหากับ emulator (เธรด UI จะแข็งตัวดังนั้นข้อความ "ไม่ตอบกลับ"):
และในที่สุดหากเปิดใช้งานการตั้งค่าสถานะ FLG_SHOW_LDR_SNAPS ใน PEB หน้าต่างการดีบักจะแสดงการโทรไปยัง DbgPrint จากตัวโหลด (มิฉะนั้นการโทร DBGPRINT อื่น ๆ จะปรากฏขึ้นโดยไม่คำนึงถึง):
tbd tbd เพิ่มลิงค์
นักพัฒนาได้เขียนและใช้ประโยชน์จากเทคโนโลยีการจำลองมานานหลายทศวรรษแล้วทำไมต้องเขียน emulator อื่น?
ขั้นแรกการแนะนำ API การจำลองเสมือนจริงที่แท้จริงในใจกลาง Windows เป็นการเปลี่ยนแปลงอย่างน่าทึ่ง (ในทางบวก) ที่เป็นที่สาธารณะ ในขณะที่มี API ที่ไม่มีเอกสารและ IOCTLs ผ่านห้องสมุดอุปกรณ์โครงสร้างพื้นฐานเสมือนจริง (VID) ห้องสมุด Win32 ชั้นที่รองรับและเสถียรเป็นการปรับปรุงที่ได้รับการต้อนรับ ตอนนี้ QEMU รองรับการใช้ WHVP สำหรับการเร่งความเร็วและ VirtualBox 6.0 มีแนวโน้มที่จะจัดส่งด้วยการสนับสนุนนี้เช่นกัน (มันถูกนำไปใช้ในที่เก็บแล้ว) VMware เท่านั้นที่ยืนอยู่คนเดียวและท้าทาย ในหัวข้อนี้การเรียนรู้วิธีการใช้ประโยชน์จาก API ใหม่นี้ไม่จำเป็นต้องเป็นหัวข้อที่ง่ายดังนั้นฉันจึงต้องการเรียนรู้ - และแบ่งปันกับผู้อื่น - อินเทอร์เฟซใหม่เหล่านี้ทำงานอย่างไร
ประการที่สองเมื่อดูเทคโนโลยีการจำลองมักจะมีแรงผลักดันที่ทันสมัยสามประการสำหรับการใช้งาน:
ความสนใจหลักของฉันคือการดูกระสุนที่สาม-ซึ่งจนถึงขณะนี้ประสบความสำเร็จด้วยการจำลองระบบเต็มรูปแบบด้วยการใช้งานที่กำหนดเองบางอย่างที่ใช้แบบจำลองการสมัครมากกว่า แต่ยังคงนำความซับซ้อนจำนวนมาก-กรณีที่เป็นอีมูเลเตอร์ป้องกันไวรัสส่วนใหญ่เช่นที่นำไปใช้ใน Windows Defender (ดูการวิจัยที่ยอดเยี่ยม นอกจากนี้นักวิจัยที่คุ้นเคยกับ Qilin อาจเห็นการผูก python อย่างง่าย ๆ มากมายที่สร้างขึ้นได้อย่างง่ายดายเพื่อ 'หมุน' กระบวนการ Windows โดยใช้แบบจำลองการสมัครมากเกินไปโดยใช้ประโยชน์จาก QEMU เป็นเครื่องจำลองระบบเต็มรูปแบบ แต่ยังไม่มีภาพระบบปฏิบัติการหลัก
ฉันตัดสินใจที่จะไล่ตามหนทางอื่น-การติดตั้ง 'Windows โหมดผู้ใช้' ซึ่งมีไบนารีเพียงอย่างเดียวที่แมปในพื้นที่ที่อยู่ของแขกจะเป็นตัวโหลด OS ของโฮสต์ (NTDLL.DLL) และไบนารีเป้าหมาย Sandboxing) ตราบใดที่อีมูเลเตอร์จะให้โครงสร้างข้อมูลพื้นฐานที่สร้างขึ้นเคอร์เนลสำหรับตัวโหลดและระบบ DLLs โฮสต์สามารถทำงานได้ด้วยความเร็วดั้งเดิม
จากนั้นเพื่อความง่ายผู้ให้บริการโทรระบบจะสกัดกั้นการโทรของระบบที่ผู้เยี่ยมชม VM ทำและสามารถทำงานได้ในหนึ่งในสามวิธี:
ขึ้นอยู่กับความต้องการที่อยู่ระหว่างประสิทธิภาพความซับซ้อนความเข้ากันได้และความปลอดภัยจำเป็นต้องใช้รหัสน้อยกว่า 500 บรรทัดในการใช้งานกระสุน 1 และ 2 ด้านบนเพื่อให้ได้แอปพลิเคชันทดสอบง่าย ๆ เพื่อโหลดแสดงข้อความ "Hello World" และออกพร้อมกับปัญหาด้านความปลอดภัยจำนวนมากในการจัดการการโทรของระบบ การเพิ่มขึ้นของ codebase เป็นสองเท่าอาจช่วยลดปัญหาด้านความปลอดภัยส่วนใหญ่ในการโทรของระบบ (ลบช่องโหว่ที่แท้จริงในเคอร์เนลโฮสต์ OS - ซึ่ง Sandbox สามารถลดลงได้)
แต่ถึงแม้จะอยู่ที่ 1,000 บรรทัดของรหัสเนื่องจากการโทรทั้งหมดของระบบทั้งหมดจะถูกส่งไปยังระบบปฏิบัติการในที่สุดจึงมีการใช้งานง่ายขึ้นเหมือนการใช้งาน 'SECCOMP' ที่ด้านบนของ CGROUP บน Linux มากกว่าอีมูเลเตอร์ที่ซับซ้อนกว่าที่เราเห็นในวันนี้
ในที่สุดมันก็คุ้มค่าที่ชี้ให้เห็นว่ามีความสนใจในพื้นที่คลาวด์คอมพิวติ้ง/คอนเทนเนอร์เพื่อลดทรัพยากรที่จำเป็นสำหรับการทำงานของเวิร์กโหลดเช่นฟังก์ชั่น Amazon Lambdas หรือ Azure ซึ่งเป็นรหัสที่ไม่มีเซิร์ฟเวอร์ที่ทำงานในคอนเทนเนอร์ซึ่งยังคงต้องหมุนระบบปฏิบัติการแขกทั้งหมด ด้วยการควบคุมที่เข้มงวดของขอบเขตความปลอดภัยที่ง่ายขึ้นให้ใครสักคนสามารถจินตนาการถึงความสามารถในการเรียกใช้ JVM หรือ. NET Core เป็นแอปพลิเคชันเฉพาะโดยไม่ต้องใช้ระบบปฏิบัติการแขกเต็มรูปแบบ
tbd tbd
มี 3 ส่วนที่น่าสนใจหลัก (สำหรับฉัน) เกี่ยวกับวิธีการที่ง่ายขึ้นในสภาพแวดล้อมการดำเนินการของแขกที่ไม่เหมือนใครซึ่งทำให้การใช้งานแอพพลิเคชั่น Windows ง่ายขึ้น:
การสร้าง PEB และ TEB ที่มีข้อมูลชนิดเดียวกับที่ฟังก์ชั่น MiCreatePebOrTeb ของเคอร์เนลจะตั้งค่า แต่ด้วยธงที่เฉพาะเจาะจงเพื่อให้ง่ายต่อการทำงานภายใต้สภาพแวดล้อมของแขก
การสร้างการแมป 1: 1 ระหว่างที่อยู่ของแขกและโฮสต์และใช้ประโยชน์จากคุณสมบัติ "ที่อยู่ข้อกำหนด" ใหม่เพื่อล็อคการจัดสรรในช่วงนั้น โปรดทราบว่าในขณะนี้ Simpleator แมปภูมิภาค KUSER_SHARED_DATA ที่แท้จริงที่ 0x7FFE0000 ซึ่งหมายความว่าเวลาผ่านไปเป็น 'เห็น' โดยแขกรับเชิญ VM ด้วยการอัปเดตของ SystemTime และ InterruptTime Field การแยกภูมิภาคนี้จะต้องใช้ตัวจับเวลาเป็นระยะเพื่อเลียนแบบการอัปเดตค่านี้
การแม็พรูปภาพ Ntdll.dll ที่แท้จริงและใช้ประโยชน์จากการเรียกระบบระบบปฏิบัติการโฮสต์เพื่อดำเนินการตามกระบวนการโหลดส่วนใหญ่โดยให้การเข้าถึง INT 2E , SYSCALL และ INT 2C Transitions
นอกจากนี้จากแบบแยกส่วนที่เรียบง่ายประกอบด้วยสามไบนารี:
Simpleator.exe ซึ่งใช้การตรวจสอบการดีบัก ส่วนประกอบนี้มีหน้าที่แสดง UI สำหรับจอภาพการดีบักและลงทะเบียน Windows โฮสติ้งท่อที่มีชื่อซึ่งช่วยให้อีมูเลเตอร์สื่อสารกับมันและโหลดอีมูเลเตอร์ด้วยสภาพแวดล้อมที่เหมาะสม (วันนี้หมายถึงการตั้งค่าการจองพื้นที่ที่อยู่ 256 GB ในอนาคตProvider.dll ซึ่งใช้ผู้ให้บริการการโทรสำหรับ Windows 10 1809 (RS5) และ Windows 10 1903 (19H1) ซึ่งเป็นปัจจุบันที่รองรับEmulator.exe ซึ่งใช้รหัสอีมูเลเตอร์ที่เร่งความเร็ว WHVP จริง ส่วนใหญ่มีหน้าที่รับผิดชอบในการสื่อสารกับจอภาพการดีบักผ่านท่อจัดการรหัสการเปลี่ยนวงแหวนเพื่อพูดคุยและจากผู้ให้บริการการโทรระบบและทำการตั้งค่าพื้นที่ที่อยู่เริ่มต้นและการโหลด PE ของไลบรารี Loader Ntdll.dll และแอปพลิเคชันไบนารีแอปพลิเคชันเป้าหมาย ก่อนอื่นคุณต้องติดตั้งแพลตฟอร์ม Windows Hypervisor ซึ่งต้องการให้ติดตั้งและเปิดใช้งาน Hyper-V คุณสามารถทำได้โดยใช้บรรทัดคำสั่งต่อไปนี้:
Dism /Online /Enable-Feature /FeatureName:HypervisorPlatform
หรือโดยการเปิดตัว GUI ดังต่อไปนี้:
OptionalFeatures.exe
จากนั้นตรวจสอบช่องทำเครื่องหมาย "Hyper-V" และ "Windows Hypervisor Platform" ดังที่เห็นในภาพหน้าจอด้านล่าง
คุณต้องมีสิทธิ์ในการบริหารสำหรับการใช้คำสั่งใด ๆ เหล่านี้
เห็นได้ชัดว่าโปรดตรวจสอบให้แน่ใจว่าฮาร์ดแวร์ของคุณรองรับเทคโนโลยีการจำลองเสมือนฮาร์ดแวร์ (เช่น Intel VT-X)
หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการวิจัยหรือที่ทำงานของฉันฉันขอเชิญคุณตรวจสอบบล็อกของฉันที่ http://www.alex-ionescu.com รวมถึง บริษัท ฝึกอบรมและที่ปรึกษาของฉัน Winsider Seminars & Solutions Inc. ที่ http://www.windows-internals.com
tbd tbd
Simpleator ได้รับการออกแบบมาเพื่อลดขนาดและความซับซ้อนของรหัส - ซึ่งมาจากค่าใช้จ่ายของความแข็งแกร่งและที่สำคัญที่สุดคือความปลอดภัย ตัวอย่างเช่นในการใช้งานปัจจุบัน NtCreateFile , NtOpenFile และ NtWriteFile ถูกส่งผ่านไปยังเคอร์เนลโฮสต์ OS ซึ่งหมายความว่าน้ำหนักบรรทุก 'อันตราย' สามารถเขียนทับไฟล์ใด ๆ บนดิสก์ที่กระบวนการจำลองโฮสต์สามารถเข้าถึงได้เนื่องจากไม่มีทรายเพิ่มเติมรอบโฮสต์
นอกจากนี้โปรดทราบว่ามีการใช้งาน การโทรขั้นต่ำขั้นต่ำอย่างเข้มงวด เพื่อให้แอปพลิเคชัน Testapp.exe เปิดใช้งานพิมพ์ข้อความและออก การใช้งานแอปพลิเคชันที่ซับซ้อนมากขึ้นเช่น Cmd.exe จะต้องใช้งานได้มากขึ้นอย่างมีนัยสำคัญโดยเฉพาะอย่างยิ่ง API บางตัวคาดว่าการเชื่อมต่อกับ CSRS จะทำผ่าน LPC และข้อมูลเฉพาะที่จะส่งคืน ในปัจจุบัน Simpletor แกล้งทำเป็นว่ามันเป็นกระบวนการป้องกัน VTL-1 ที่ปลอดภัยซึ่ง จำกัด อย่างมีนัยสำคัญว่า API ของแขกรับเชิญบางคนพยายามทำดังนั้นการโทรบางอย่างจะเกิดความผิดพลาดทันที (เช่นตัวอย่างเช่นบางคนรอบ ๆ สถานที่)
การจำลองและการปรับเปลี่ยนพื้นที่ที่อยู่ของแขกจะต้องปลดบล็อกการใช้ API ดังกล่าว
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.