2012-06-24 11 views
7

Nhìn vào một số mã lắp ráp cho x86_64 trên máy Mac của tôi, tôi thấy các hướng dẫn sau đây:Làm cách nào để xen kẽ mã opcode lắp ráp x86_64 này?

48 c7 c0 01 00 00 00 movq $0x1,%rax 

Nhưng không nơi nào tôi có thể tìm thấy một tài liệu tham khảo mà phá vỡ các opcode. Dường như 48c7 là hướng dẫn di chuyển, c0 xác định thanh ghi% rax, v.v.

Vì vậy, tôi có thể tìm một tham chiếu cho tôi biết điều đó ở đâu?

Tôi biết về http://ref.x86asm.net/, nhưng nhìn 48 mã, tôi không thấy bất kỳ thứ gì giống như di chuyển.

+1

Tôi đã nhìn thấy các câu hỏi tương tự tại đây. Nếu tôi có thể tìm thấy điều này trên Google, tôi sẽ không hỏi. Thực tế là tôi nhận thức được tài liệu tham khảo tôi đăng trong câu hỏi của mình cũng cho thấy tôi không quá lười biếng để tự tìm kiếm. – Christoph

+1

@Oded, googling cho "tiền tố hướng dẫn x86 0x48" khá phức tạp nếu bạn không biết bạn đang tìm kiếm gì ... – Griwes

+0

@Oded Tôi đã viết lại câu hỏi của mình để có nhiều nhà phát triển cụ thể hơn. Với tham chiếu (thực sự tốt!) Tại x86asm.net, tôi đoán tôi chỉ cần hiểu cách opcode bị phá vỡ. Griwes đã giúp với điều đó. – Christoph

Trả lời

10

Thực ra, mov0xc7 ở đó; 0x48, trong trường hợp này, một chế độ dài REX.W prefix.

Trả lời cũng là câu hỏi trong nhận xét: 0xc0 là b11000000. Here bạn có thể tìm ra rằng với REX.B = 0 (như tiền tố REX là 0x48, bit .B không được đặt), 0xc0 có nghĩa là "RAX là toán hạng đầu tiên" (theo cú pháp Intel; mov rax, 1, RAX trước tiên, hoặc trong trường hợp mov, đầu ra toán hạng). Bạn có thể tìm hiểu cách đọc ModR/M here.

+0

Xin cảm ơn! Có lẽ tôi nên viết lại câu hỏi của mình. – Christoph

+0

Còn c0 thì sao? Nó đến từ đâu? – Christoph

+0

@Christoph, giải thích thêm trong câu trả lời. – Griwes

1

Khi bạn nhìn vào nhị phân

48 c7 c0 01 00 00 00 

bạn cần phải tháo rời nó để hiểu ý nghĩa của nó.

Thuật toán tháo rời không khó, nhưng phức tạp. Nó giả sử tìm kiếm nhiều bảng.

Các thuật toán được mô tả trong tập 2 của hướng dẫn sử dụng cho nhà phát triển Intel,

Intel® 64 and IA-32 Architectures 
Software Developer’s Manual 
Volume 2 (2A, 2B & 2C): 
Instruction Set Reference, A-Z 

Bạn bắt đầu đọc từ chương gọi là INSTRUCTION FORMAT.

Hoặc, có những cuốn sách tốt mà dành toàn bộ chương về chủ đề này, chẳng hạn như

X86 Instruction Set Architecture, Mindshare, by Tom Shanley. 

Một chương toàn là dành riêng cho tháo nhị phân X86.

Hoặc bạn có thể bắt đầu đọc các thuật toán tổng quát từ một hướng dẫn cho cùng một ngôn ngữ được thực hiện bởi AMD:

AMD64 Architecture 
Programmer’s Manual 
Volume 3: 
General-Purpose and System Instructions 

Ở đây, trong chương Instruction Encoding bạn sẽ tìm thấy automaton định nghĩa ngôn ngữ này của hướng dẫn, và từ sơ đồ đồ họa này bạn có thể viết dễ dàng bộ giải mã.

Sau khi bạn thực hiện việc này, bạn có thể quay lại Sách hướng dẫn sử dụng Intel, ổ đĩa thứ 2 và sử dụng nó làm sách tham khảo.

Tôi cũng thấy hữu ích là reverse engineering class từ http://opensecuritytraining.info/. Trang web này được tạo ra bởi một sinh viên Phd từ CMU, hầu hết nó không được thực hiện tốt, nhưng nó đòi hỏi thời gian dài hơn để nghiên cứu và áp dụng nó.

Sau khi bạn hiểu các ý tưởng cơ bản, bạn có thể xem qua một dự án miễn phí triển khai thuật toán. Tôi thấy hữu ích cho dự án distorm.Lúc đầu, điều quan trọng là không nhìn vào các dự án trừu tượng (như qemu hoặc objdump), mà cố gắng thực hiện các dissasemblers cho nhiều ngôn ngữ trong cùng một mã như bạn sẽ bị lạc. Distorm chỉ tập trung vào x86 và thực hiện nó một cách chính xác và đầy đủ. Nó chuyển tải bằng ngôn ngữ chính thức định nghĩa ngôn ngữ X86, trong khi sách hướng dẫn sử dụng Intel và AMD xác định ngôn ngữ X86 bằng cách sử dụng ngôn ngữ tự nhiên.

Dự án khác hoạt động tốt là udis86.

+0

Bạn có nghĩa là thuật toán để tháo rời? Có vẻ như ban đầu bạn đang gọi 'mov' một thuật toán. –

+0

chính xác, được sửa chữa. – alinsoar