Về cơ bản những gì nó làm là vượt qua EAX = 0x52 với đối số con trỏ ngăn xếp trong EDX đến chức năng, được lưu trữ trong TIB tại offset 0xC0. Các cuộc gọi chuyển mạch chế độ CPU từ 32-bit lên 64-bit và thực thi các syscall trong Ring0 để NtCreateFile. 0x52 là syscall cho NtCreateFile trên hệ thống Windows 7 của tôi, nhưng những con số syscall là khác nhau giữa các phiên bản Windows và thậm chí giữa các gói dịch vụ, vì vậy nó không bao giờ là một ý tưởng tốt để dựa vào những con số này. Bạn có thể tìm thêm thông tin về syscalls trên Simone Margaritelli blog ở đây.
Phần mềm Hầu hết các bảo vệ sẽ hook API ntdll.dll vì nó là mức thấp nhất mà bạn có thể tới, ngay trước ngưỡng cửa của hạt nhân. Ví dụ, nếu bạn chỉ treo CreateFileW trong kernel32.dll mà cuối cùng gọi ZwCreateFile trong ntdll.dll, bạn sẽ không bao giờ bắt cuộc gọi API trực tiếp để ZwCreateFile. Mặc dù một cái móc ở ZwCreateFile API sẽ được kích hoạt mỗi khi CreateFileW hoặc CreateFileA được gọi là khi cả hai cuối cùng phải gọi các API mức thấp nhất để giao tiếp trực tiếp với các hạt nhân.
Bạn luôn luôn có một trường hợp tải của bất kỳ thành phần DLL nhập khẩu. Điều đó có nghĩa là nếu có AV hoặc sandbox giải pháp muốn để treo các API của một DLL chọn, họ sẽ tìm thấy mô-đun như vậy trong quá trình hiện tại, danh sách module nhập khẩu. Sau bảng xuất module DLL, họ sẽ tìm và nối các hàm API xuất khẩu quan tâm.
Bây giờ, đến phần thú vị. Nếu chúng ta sao chép đoạn mã, tôi dán trên từ ntdll.dll, và thực hiện nó trong mã ứng dụng của riêng của chúng tôi. Đây sẽ là một bản sao giống hệt nhau của mã ntdll.dll mà sẽ thực hiện một syscall 0x52 đã được thực hiện trong phần mã của chúng ta. Không có phần mềm bảo vệ người sử dụng chế độ bao giờ sẽ tìm hiểu về nó.
Nó là một phương pháp lý tưởng bỏ qua bất cứ móc API mà không thực sự phát hiện và unhooking họ!
Thing là, như tôi đã đề cập trước đây, chúng ta không thể tin tưởng vào số syscall như họ sẽ khác nhau giữa Windows phiên bản. Những gì chúng ta có thể làm mặc dù được đọc toàn bộ tập tin thư viện ntdll.dll từ đĩa và tự bản đồ nó vào quá trình 'không gian địa chỉ hiện tại. Bằng cách đó chúng ta sẽ có thể thực thi mã đó đã được chuẩn bị riêng cho phiên bản của chúng tôi của Windows, trong khi có một bản sao chính xác của bên ngoài ntdll.dll tầm AV.
Tôi đã đề cập ntdll.dll cho bây giờ như DLL này không có bất kỳ khác phụ thuộc. Điều đó có nghĩa là nó không phải tải bất kỳ DLL khác và gọi API của họ. Chức năng hàng xuất khẩu của mình qua việc thực hiện trực tiếp với hạt nhân và không để DLL sử dụng chế độ khác. Nó không nên ngăn cản bạn bằng tay nhập khẩu bất kỳ DLL khác (như kernel32.dll hoặc user32.dll), cùng một cách, nếu bạn chắc chắn rằng để đi bộ qua các file DLL nhập khẩu bảng và cư nó bằng tay trong khi đệ quy nhập khẩu tất cả các file DLL từ thư viện của phụ thuộc.
Bằng cách đó các module tự ánh xạ sẽ chỉ sử dụng phụ thuộc tay ánh xạ khác và họ sẽ không bao giờ phải chạm vào các mô-đun được nạp vào không gian địa chỉ khi chương trình được bắt đầu.
Sau đó, nó chỉ là vấn đề của việc gọi các hàm API từ file DLL tự ánh xạ của bạn trong bộ nhớ và bạn có thể chắc chắn rằng không có AV hoặc phần mềm sandbox sẽ bao giờ có thể phát hiện các cuộc gọi đó hoặc treo chúng trong chế độ người dùng.
đang được dịch, vui lòng đợi..