Những điều kỳ lạ học được khi viết trình giả lập x86
- Giải thích nhiều trivia và điểm kỳ lạ học được trong quá trình viết trình giả lập x86 và amd64
- Trong Time Travel Debugging (TTD), trình giả lập CPU được dùng để ghi lại việc thực thi của tiến trình ở mức lệnh
- Phiên bản đầu tiên của TTD được gọi là iDNA, được viết bằng mã hợp ngữ nên nhanh nhưng khó bảo trì
- Phiên bản thứ hai được viết bằng C++ nên khả năng bảo trì được cải thiện
Trivia mã hóa x86 vô dụng
- Lược đồ mã hóa x86 có thể mã hóa cùng một lệnh theo nhiều cách khác nhau
- Lệnh
int 3 có thể được mã hóa thành CD 03 hoặc CC
- Thanh ghi
EAX được gọi là "thanh ghi tích lũy" và thực sự có khác biệt trong mã hóa
- Tiền tố
REX cho phép truy cập phạm vi thanh ghi rộng hơn trong mã 64-bit
- Lệnh có thể dài tối đa 15 byte, vượt quá mức này sẽ phát sinh ngoại lệ
- Tiền tố ghi đè địa chỉ cho phép tham chiếu địa chỉ 32-bit trong chế độ 64-bit
Đặc tính cờ kỳ lạ
- Lệnh
INC không cập nhật cờ carry, khác với lệnh ADD
- Các lệnh
CMPXCHG8B/CMPXCHG16B chỉ sửa đổi cờ zero
- Các lệnh dịch và xoay sẽ để cờ overflow ở trạng thái không xác định nếu lượng dịch lớn hơn 1
Thêm nhiều bất ngờ về lệnh dịch
shr ax, 10h dịch thanh ghi ax 16 bit và biến nó thành 0
shr eax, 20h dịch thanh ghi eax 32 bit nhưng giá trị không thay đổi
- Lượng dịch được mask bằng
1FH
Ghi đè đoạn
- Segment vẫn được dùng trong mã 32-bit và 64-bit, chủ yếu cho thread-local storage
- Trên Windows, thanh ghi
FS hoặc GS được dùng để tham chiếu TEB (Thread Execution Block)
- Trong tiến trình 32-bit dùng
FS, còn trong tiến trình 64-bit dùng GS
- Trong chế độ 64-bit, giá trị của thanh ghi segment không quan trọng
Ghi đè đoạn: thêm trivia
- Trong chế độ 32-bit, giá trị thực của thanh ghi segment tham chiếu đến segment descriptor
- Trong chế độ 64-bit, base được điều khiển bởi MSR
- Không thể đọc trực tiếp giá trị segment của tiến trình 64-bit trong WinDbg
Kết luận
- Bài viết này cung cấp một danh sách ngẫu nhiên các trivia về x86
- Viết trình giả lập giúp hiểu sâu hơn về cách CPU hoạt động
- Có thể xem các tài nguyên rất tốt trên website của Agner Fog
Tóm tắt của GN⁺
- Giải thích nhiều trivia và điểm kỳ lạ học được khi viết trình giả lập x86 và amd64
- Viết trình giả lập giúp hiểu sâu hơn về cách CPU hoạt động
- Đề cập nhiều trivia như các cách mã hóa khác nhau của lệnh
int 3, tiền tố REX, ghi đè đoạn, v.v.
- Có thể xem thêm tài nguyên trên website của Agner Fog
1 bình luận
Ý kiến trên Hacker News