Sự cố màn hình xanh hoặc dòng lệnh trong Windows 10 hoặc Server 2016 khi ứng dụng đã tắt

Môi trường dữ liệu

  • McAfee Application and Change Control (MACC) 8.x.x
  • Microsoft Windows 8, 10
  • Microsoft Server 2012, 2016

Vấn đề

Hệ thống có thể gặp các vấn đề sau đây sau khi MACC đã được cài đặt và được đặt trong kích hoạt, cập nhật, hoặc quan sát chế độ:

  • Hệ thống gặp sự cố mà không có một màn hình màu xanh
  • Giao diện dòng lệnh (CLI )

LƯU Ý: Những sự cố này xảy ra trên hệ thống Windows 8, Windows 10, Server 2012 hoặc Server 2016. Chúng không xảy ra khi MACC được đặt ở chế độ Tắt trên hệ thống có các môi trường này.

Nguyên nhân

Cơ chế phát hiện khi một tiến trình đang tải một thư viện (dll). Việc phát hiện yêu cầu kiến ​​thức về RVA (Địa chỉ ảo tương đối), cho chức năng LoadLibrary. Khi đặt vào Kernel32.dll, xung đột xảy ra giữa MACC và Windows 10, vì hệ điều hành cố gắng tải và chạy các tập lệnh. Xem các ghi chú cài đặt sau:

DisableDeviceGuardCompat bị vô hiệu hóa (“DisableDeviceGuardCompat = 0”) MACC tìm kiếm LoadLibraryW trong Kernel32.dll. Đây là cài đặt mặc định hiện tại.

Đã bật DisableDeviceGuardCompat (“DisableDeviceGuardCompat = 1”), RVA mà MACC đang tìm kiếm là “LdrLoadDll” nhưng trong NTDLL.dll.

Giải pháp

Nếu bạn đang gặp sự cố CLI:

  1. Chạy bộ cấu hình SC: Run Command Client Task DisableDeviceGuardCompat = 1.
  2. Khởi động lại hệ thống, để thay đổi có hiệu lực.

LƯU Ý: DisableDeviceGuardCompat không vô hiệu hóa hoặc bỏ qua scinject.dll được đưa vào. Nó thay đổi chức năng nào được kết nối. Không có rủi ro liên quan đến việc thay đổi các DLL. Hệ thống vẫn đang được bảo vệ bởi MACC.

Để xác thực rằng tác vụ khách đã chạy:

  1. Chạy tác vụ SC: Run Command Client: config show | findstr DisableDeviceGuardCompat
  2. Tìm kiếm đầu ra trong nhật ký tác vụ Solidcore Client sau hai giao tiếp ASCI.

Nếu giải pháp hoặc cách giải quyết khác này không giải quyết được sự cố của bạn, hãy đăng nhập vào ServicePortal và tạo yêu cầu dịch vụ.

Thông tin liên quan

Không gian địa chỉ

Các quy trình có một lượng giới hạn không gian địa chỉ. Khi chạy 32-bit, một tiến trình có khoảng 2 GB (0x8000000) nội dung ở chế độ hạt nhân. Tất cả phân bổ bộ nhớ, ánh xạ tệp, DLL và những thứ khác, mà bạn tải đều xảy ra trong cửa sổ ứng dụng 2 GB

Rebasing

Một DLL chỉ định nơi nó muốn được tải. Nếu bạn cố gắng tải một DLL có địa chỉ cơ sở đã được sử dụng, quá trình tải không thành công hoặc DLL phải được khôi phục lại.

Cách hoạt động

Bạn có hai DLL (x.DLL và y.DLL). Cả hai đều được biên dịch trong Visual Studio .NET. Trong Visual Studio, địa chỉ cơ sở “ưu tiên” mặc định (vị trí bộ nhớ được tải đến) là 0x10000000.

  1. Run MyTestApp.exe.
  2. LoadLibrary(x.DLL);
  3. LoadLibrary(y.DLL);

X.DLL được tải lên ở 0x10000000; y.DLL cố gắng tải lên ở 0x10000000, nhưng không thể vì x.DLL đã sử dụng không gian địa chỉ đó. Vì vậy, y.DLL được “giảm giá trị”. Hệ điều hành chọn một vị trí mới để tải DLL. Một phần của quá trình tải yêu cầu hệ điều hành áp dụng “bản sửa lỗi”, để y.DLL chạy chính xác ở vị trí khác 0x10000000.

Một DLL được tối ưu hóa, để tải lên tại địa chỉ cơ sở “ưa thích” của nó. Áp dụng “bản sửa lỗi” có một số chi phí cho nó. Các tệp DLL của bạn tải nhanh hơn nếu bạn định cấu hình địa chỉ cơ sở “ưa thích”. Nó không được nhúng với một địa chỉ cơ sở “ưu tiên” của một DLL khác trong quá trình tải. Nói cách khác, MACC đưa vào quy trình và nếu thứ gì đó khác đã được đưa vào nó, quy trình sẽ bị treo. Để ngăn tình trạng này xảy ra, DLL được khôi phục lại (được đưa vào một quy trình khác).

LƯU Ý: Thay đổi DLL MACC đang phục hồi không có nghĩa là nó không được nhúng. Injection là cần thiết cho điều khiển SAU / MP / Execution, để lấy các đối số dòng lệnh khi một trình thông dịch tập lệnh được khởi động. Nó cũng cần thiết khi chạy ở chế độ tương tác.

Nếu bạn muốn bỏ qua rõ ràng việc chèn vào một quy trình cụ thể, bạn có thể thêm quy tắc attr -w hoặc xóa trình thông dịch tập lệnh đó khỏi danh sách Tập lệnh.

Với việc khôi phục được xác định, việc thay đổi cấu hình Disable Device Guard Compat có thể là một giải pháp thay thế. Không phải vậy. Tất cả những gì chúng tôi đang làm là khôi phục một DLL khác (nối LdrLoadDLL sâu hơn hoặc cao hơn trong ngăn xếp – kernel32.DLL kết thúc gọi NTDLL.DLL).

Nếu DeviceGuardCompat bị tắt trên máy chủ và DeviceGuard được bật trên thiết bị đầu cuối của bạn, hệ điều hành sẽ không cho phép đưa vào. Nó chặn việc thực thi nhị phân.

DeviceGuard là một tính năng của hệ điều hành (phần cứng và phần mềm) hạn chế thiết bị chạy các ứng dụng trái phép. Nó cho phép các ứng dụng được ủy quyền chạy, bằng cách sử dụng một tính năng được gọi là tính toàn vẹn của mã có thể định cấu hình.

“DeviceGuardCompat” không liên quan gì đến “Microsoft DeviceGuard”.

Cơ chế nhúng của chúng tôi phát hiện khi một quy trình đang tải thư viện (DLL). Việc phát hiện này đạt được bằng cách biết địa chỉ ảo tương đối (RVA) của hàm LoadLibrary. Khi DisableDeviceGuardCompat được bật, RVA đang được tìm kiếm là LdrLoadDLL nhưng trong NTDLL.DLL. Ngược lại, với DisableDeviceGuardCompat bị vô hiệu hóa (theo mặc định), chúng tôi tìm kiếm LoadLibraryW trong Kernel32.DLL. Sau khi chúng tôi có địa chỉ đó, chúng tôi cho phép tiến trình được đưa vào giao tiếp với trình điều khiển của chúng tôi, khi một số chức năng nhất định được gọi.

DisableDeviceGuardCompat không vô hiệu hóa hoặc bỏ qua scinject.DLL được đưa vào. Nó thay đổi chức năng nào được nối. Không có rủi ro liên quan đến việc thay đổi DLL thêm vào, vì chúng tôi vẫn đang bảo vệ hệ thống.

Trân trọng cám ơn quý độc giả.

Biên dịch Lê Toản – Help.pacisoft.com