วันนี้ฉันจะแนะนำคุณสมบัติใหม่ของ Windows 7 / Windows Server 2008 R2 - โฮสต์คอนโซล (ConHost.exe)
ในความเป็นจริง ไม่ว่าจะเป็นผู้ใช้ทั่วไปหรือผู้ดูแลระบบขององค์กร เราจะใช้แอปพลิเคชันคอนโซลไม่มากก็น้อยในแอปพลิเคชัน Windows รายวันและกระบวนการดำเนินการและบำรุงรักษา แอปพลิเคชันคอนโซลไม่มีส่วนต่อประสานกับผู้ใช้ เราจำเป็นต้องดำเนินการอินพุตและเอาต์พุตผ่านพรอมต์คำสั่ง (CMD นี่ไม่ใช่ DOS หลายคนสับสน)
ลองคิดดูว่า Windows มาพร้อมกับแอปพลิเคชันคอนโซลใดบ้าง
อันที่จริงโปรแกรมทั่วไปส่วนใหญ่ ได้แก่ cmd.exe, nslookup.exe และ telnet.exe
ใน Windows เวอร์ชันก่อนหน้า แอปพลิเคชันทั้งหมดที่แสดงกิจกรรมที่ไม่ใช่ GUI (เช่น แอปพลิเคชันคอนโซล) ได้รับการประสานงานผ่านกระบวนการระบบ Csrss.exe เมื่อพวกเขาต้องการทำงานบนเดสก์ท็อป เมื่อแอปพลิเคชันคอนโซลจำเป็นต้องรับอักขระ มันจะเรียก "console APIs" ขนาดเล็กใน Kernel32.dll เพื่อให้ Kernel32 สร้าง LPC เพื่อเรียก CSRSS ในขณะนี้ CSRSS จะตรวจสอบและตรวจสอบคิวอินพุตของหน้าต่างคอนโซล และส่งคืนผลลัพธ์โหมดอักขระไปยังแอปพลิเคชันคอนโซลผ่าน Kernel32 เพื่อการเชื่อมโยง กลไกการประมวลผลข้อความของแอปพลิเคชันคอนโซลใน Windows เวอร์ชันต้น ๆ แสดงในรูปด้านล่าง:
กลไกการประมวลผลนี้ได้สร้างปัญหา: แม้ว่าแอปพลิเคชันคอนโซลจะถูกดำเนินการในบริบทของผู้ใช้ปกติ Csrss.exe จะทำงานภายใต้สิทธิ์ของบัญชีระบบภายในเครื่องเสมอ ดังนั้นในบางกรณี มัลแวร์ที่พัฒนาโดย "คนร้าย" อาจได้รับสิทธิ์เพิ่มเติมผ่าน Csrss.exe ซึ่งดำเนินการด้วยสิทธิ์ของบัญชีระบบในเครื่อง โหมดการโจมตีนี้เรียกว่า Shatter Attack
ในยุคของ Win7 และ Windows Server 2008 R2 แอปพลิเคชันคอนโซลทั้งหมดจะถูกวางไว้ในกระบวนการบริบทใหม่ ConHost.exe สำหรับการดำเนินการและ ConHost (โฮสต์คอนโซล) และโปรแกรมคอนโซลจะทำงานในบริบทระดับความปลอดภัยเดียวกันแทนที่จะออก คำขอข้อความ LPC ไปยัง CSRSS เพื่อดำเนินการ แต่จะขอ ConHost แทน ดังนั้น ความพยายามของแอปพลิเคชันใดๆ ที่จะใช้ประโยชน์จากคำขอข้อความเพื่อทำให้การยกระดับสิทธิ์โดยอัตโนมัติจะไม่สำเร็จ รูปต่อไปนี้เป็นแผนผังของกลไกใหม่ที่ใช้ใน Windows 7 และ Windows Server 2008 R2:
ConHost แทนที่การเปลี่ยนแปลงถาวรในวิธีจัดการ I/O โดยแอปพลิเคชันคอนโซล ผู้ใช้ไม่สามารถบังคับให้ Windows เปลี่ยนกลับเป็นลักษณะการทำงานของคอนโซล "โหมดดั้งเดิม" ผ่านทางรีจิสทรีหรือนโยบายกลุ่ม ดังนั้นผู้ใช้จำเป็นต้องทดสอบแอปพลิเคชันอย่างละเอียดก่อนอัปเกรดเป็น Windows 7 หรือ Windows Server 2008 R2 โปรดอย่าลืมว่าแม้ว่าฟังก์ชันส่วนใหญ่ของบางแอปพลิเคชันจะใช้งานผ่าน GUI แต่ข้อมูลยังคงได้รับการประมวลผลเป็นชุดผ่านคอนโซลหรืออินเทอร์เฟซการทำงานอื่นๆ ในเบื้องหลัง ดังนั้นจึงจำเป็นอย่างยิ่งที่ต้องทำการทดสอบการทำงานของแอปพลิเคชันอย่างครอบคลุมก่อนที่จะย้ายหรือปรับระดับ
เมื่อแอปพลิเคชันไม่สามารถใช้งานได้ตามปกติใน Windows 7 เราควรทดสอบและดำเนินการอีกครั้งด้วยสิทธิ์ของผู้ดูแลระบบเพื่อดูว่าปัญหาเกิดขึ้นหรือไม่ ที่จริงแล้วเราสามารถใช้ Process Monitor เพื่อตรวจสอบว่าแอปพลิเคชันมีสิทธิ์การเข้าถึงไฟล์หรือรีจิสทรีหรือไม่ เป็นเรื่องปกติ หากแอปพลิเคชันยังคงไม่สามารถทำงานได้ตามปกติหลังจากแก้ไขปัญหาข้างต้นแล้ว คุณต้องพิจารณาติดต่อ ISV หรือผู้พัฒนา
หากแอปพลิเคชันขัดข้อง ไฟล์การถ่ายโอนข้อมูลข้อขัดข้องที่เกี่ยวข้องจะมีประโยชน์มากที่สุดสำหรับนักพัฒนาและ ISV ในการค้นหาปมของปัญหา หากแอปพลิเคชันหยุดตอบสนอง คุณสามารถลองใช้ ADPlus เพื่อคว้ามันและการถ่ายโอนข้อมูลกระบวนการ ConHost.exe ที่เกี่ยวข้อง แอปพลิเคชันคอนโซลสามารถใช้กระบวนการย่อยของคอนโซล Windows ร่วมกันได้ ตัวอย่างเช่น เมื่อผู้ใช้เริ่ม Telnet จากหน้าต่าง CMD Telnet.exe จะกลายเป็นกระบวนการย่อยของ Cmd.exe ในกรณีนี้ โฮสต์ ConHost.exe ประมวลผลอินสแตนซ์ข้อความของทั้งกระบวนการหลักและกระบวนการลูก ด้วยการใช้ Process Explorer เราสามารถยืนยันได้ว่ากระบวนการใดที่ ConHost.exe จัดการอยู่:
คุณยังสามารถใช้ฟังก์ชัน "วิเคราะห์ลูกโซ่รอ" ในการตรวจสอบทรัพยากร Windows 7 เพื่อดูกระบวนการแอปพลิเคชันของกระบวนการ ConHost.exe:
สุดท้ายนี้ อย่าลืมทดสอบแอปพลิเคชันให้สมบูรณ์ก่อนการโยกย้าย!