Một trong những trình giải mã lớn nhất hiện có ở đây bây giờ chắc chắn là Hex-Rays Decompiler. Nếu bạn muốn xem, những gì nó có thể xuất, hãy xem http://www.hex-rays.com/products/decompiler/compare_vs_disassembly.shtml.
tác giả của nó, Ilfak Guilfanov, đã đưa ra một bài phát biểu về hoạt động nội bộ của decompiler của mình tại một số con, và đây là giấy trắng: http://www.hex-rays.com/products/ida/support/ppt/decompilers_and_beyond_white_paper.pdf và một bài thuyết trình ở đây: http://www.hex-rays.com/products/ida/support/ppt/decompilers_and_beyond.ppt này mô tả một cái nhìn tổng quan ngơi thoải mái tại tất cả những khó khăn trong là gì xây dựng bộ giải mã và cách làm cho nó hoạt động.
Ngoài ra, có một số giấy tờ khá cũ, ví dụ: Luận án tiến sĩ cổ điển của Cristina Cifuentes tại đây: http://itee.uq.edu.au/~cristina/dcc.html#thesis
Vì tính phức tạp, tất cả các công cụ "giải mã" phụ thuộc vào ngôn ngữ và thời gian chạy của nhị phân. Ví dụ dịch ngược .NET và Java được coi là "thực hiện", vì có các trình giải mã miễn phí có sẵn, có tỷ lệ thành công rất cao (chúng tạo ra nguồn gốc). Nhưng đó là do tính chất rất cụ thể của các máy ảo mà các runtimes sử dụng.
Đối với các ngôn ngữ được biên dịch thực sự, như C, C++, Obj-C, Delphi, Pascal, ... công việc trở nên phức tạp hơn nhiều. Đọc các giấy tờ ở trên để biết chi tiết.
sự khác biệt giữa trình tách và trình giải mã là gì?
Khi bạn có chương trình nhị phân (thực thi, thư viện DLL, ...), nó bao gồm hướng dẫn của bộ xử lý. Ngôn ngữ của các hướng dẫn này được gọi là lắp ráp (hoặc bộ lắp ráp). Trong một nhị phân, các hướng dẫn này được mã hóa nhị phân, để bộ vi xử lý có thể trực tiếp thực thi chúng. Bộ tách rời lấy mã nhị phân này và dịch thành mã văn bản. Bản dịch này thường là 1-to-1, nghĩa là một hướng dẫn được hiển thị dưới dạng một dòng văn bản.Nhiệm vụ này phức tạp, nhưng đơn giản, chương trình chỉ cần biết tất cả các hướng dẫn khác nhau và cách chúng được thể hiện trong một nhị phân.
Mặt khác, trình biên dịch ngược thực hiện nhiệm vụ khó khăn hơn nhiều. Phải mất một trong hai mã nhị phân hoặc đầu ra disassembler (về cơ bản là giống nhau, bởi vì nó là 1-to-1) và tạo ra mã mức cao. Hãy để tôi chỉ cho bạn một ví dụ. Giả sử chúng ta có chức năng này C:
int twotimes(int a) {
return a * 2;
}
Khi bạn biên dịch nó, trình biên dịch đầu tiên tạo ra và tập lắp ráp cho chức năng đó, nó có thể trông giống như thế này:
_twotimes:
SHL EAX, 1
RET
(dòng đầu tiên chỉ là một nhãn hiệu và không phải là một chỉ dẫn thực sự, SHL
thực hiện một phép dịch chuyển sang trái, nhanh chóng nhân đôi hai, RET
có nghĩa là chức năng được thực hiện). Trong kết quả nhị phân, có vẻ như sau:
08 6A CF 45 37 1A
(Tôi đã tạo ra, không phải hướng dẫn nhị phân thực). Bây giờ bạn đã biết, một bộ tách rời sẽ đưa bạn từ biểu mẫu nhị phân đến biểu mẫu lắp ráp. Trình biên dịch mã vạch sẽ đưa bạn đến mã C (hoặc một số ngôn ngữ cấp cao khác).
bản sao có thể có của [Trình biên dịch không hoạt động như thế nào?] (Http://stackoverflow.com/questions/2902074/what-is-a-de-compiler-how-does-it-work) –