Mục tiêu của tôi là truy cập IDT từ mô-đun hạt nhân MacOS.Địa chỉ trả về mã vạch SIDT cho cấu trúc IDT không đúng định dạng
Tôi đang chạy macOS 10.13.2 trong VMFusion 10.0.1 và có vẻ như lệnh lắp ráp sidt
trỏ tới cấu trúc bảng bị hỏng.
Mã opcode này sẽ trả về địa chỉ cho "Bảng mô tả ngắt" giữ bộ mô tả cho từng ngắt.
Mỗi con trỏ chứa gián đoạn cho chức năng gọi lại sẽ được gọi khi một gián đoạn cụ thể được gọi.
Ví dụ: đây là 2 trình mô tả ngắt trỏ tới các cuộc gọi lại hợp lệ từ phần __TEXT của nhân trong các phiên bản cũ hơn trước đó.
- điểm int3 để idt64_int3
- int80 điểm để idt64_unix_scall
vv ...
Đối với một số lý do, bắt đầu từ cao Sierra 10.13.2, phạm vi bộ nhớ sidt
trở lại điều đó không không chứa các con trỏ hợp lệ (tất cả nằm ngoài ranh giới của phần hạt nhân __TEXT
). có lẽ có một cách khác để lấy con trỏ bảng?
đây là mã của tôi nguồn cho việc tìm kiếm con trỏ IDT:
unsigned char idt_out[10];
__asm__ volatile ("sidt %0": "=m" (idt_out));
// skip the first 2 bytes as they are not part of the address
uint64_t idt_address = *((unsigned long long *)(idt_out+2));
printf("idt address is %llx \n", idt_address);
int80_desc = (struct descriptor_idt*)(idt_address + sizeof(struct idt_desc)*0x80);
int80_address = (mach_vm_address_t)(((unsigned long)int80_desc->offset_high << 32) + ((unsigned int)int80_desc->offset_middle << 16) + int80_descriptor->offset_low); // this should point to idt64_unix_scall
'sidt' trả về địa chỉ thực thay vì địa chỉ ảo. Bạn có chắc chắn dịch địa chỉ ảo sang địa chỉ ảo trước khi cố gắng hiểu nội dung của nó không? – fuz
Tôi đang cố gắng truy cập idt từ mô-đun hạt nhân để có, và khi chạy cùng mã từ phiên bản cũ hơn của macOS, và nó hoạt động hoàn hảo. – Zohar81
Ngay cả trong một địa chỉ mô-đun hạt nhân là ảo. Không có cách nào thực sự chuyển đổi địa chỉ sang địa chỉ ảo. – fuz