2012-04-25 21 views
18

Tôi đã nghe thuật ngữ "giải mã" được sử dụng một vài lần trước đây và tôi bắt đầu rất tò mò về cách hoạt động của nó.Làm cách nào để dịch ngược?

Tôi có một ý tưởng rất chung về cách hoạt động của nó; đảo ngược kỹ thuật một ứng dụng để xem những chức năng nó sử dụng, nhưng tôi không biết nhiều hơn thế.

Tôi cũng đã nghe thuật ngữ "Bộ tách rời ", sự khác nhau giữa trình tách và trình giải mã là gì?

Vì vậy, để tổng hợp (các) câu hỏi của tôi: Chính xác những gì liên quan đến quá trình giải mã một cái gì đó? Nó thường được thực hiện như thế nào? Làm thế nào phức tạp/dễ dàng của một quá trình là nó? nó có thể tạo ra mã chính xác không? Và sự khác nhau giữa trình giải mã và bộ tách rời là gì?

+0

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) –

Trả lời

20

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).

3

Biên dịch ngược về cơ bản là ngược lại việc biên dịch. Đó là - lấy mã đối tượng (nhị phân) và cố gắng tạo lại mã nguồn từ nó.

Việc giải mã phụ thuộc vào đồ tạo tác được để lại trong mã đối tượng có thể được sử dụng để xác định cấu trúc của mã nguồn.

Với C/C++ không còn nhiều gì để giúp quá trình giải mã, do đó rất khó. Tuy nhiên với Java và C# và các ngôn ngữ khác nhắm vào các máy ảo, nó có thể dễ dàng hơn để dịch ngược vì ngôn ngữ để lại nhiều gợi ý hơn trong mã đối tượng.

+0

Mọi người đều nói rằng đó là "khó khăn" - nhưng nó luôn luôn là _possible_? –

+1

@MarcoPrins: Hexrays nói rằng nói chung không, nó không phải là tự động luôn luôn có thể. Các giả định về hướng dẫn biên dịch phải được thực hiện (như trình biên dịch phổ biến "thông thường" đã được sử dụng và không phải là một số triển khai hack không chuẩn hóa đặc biệt lẻ hoặc lắp ráp thủ công "ác"). – BullyWiiPlaza

0

BTW, bạn có thể nhận được một số thông tin về decompiler làm việc ở đây enter link description here Có phiên bản trực tuyến của decompiler (đối với bộ xử lý PowerPC), mà nhận được mã lắp ráp tại các ký hiệu của IDA Pro. Nhưng dịch vụ có các tùy chọn "làm đại diện trung gian", mà tạo ra như sau:

  • Nhập mã (văn bản)
  • Tóm tắt Syntex của mã nguồn (cây)
  • Gọi đồ thị trong BasicBlock mẫu (đồ thị)
  • Metainformations, thats được khôi phục trong decompilation:
    • Gọi đồ thị dưới dạng Khung BasicBlock (đồ thị)
    • dataflow các giá trị đăng ký của (đồ thị)
    • dataflow của giá trị biến của (đồ thị)
    • dataflow của sự phụ thuộc biểu hiện của (đồ thị)
  • Lưu đồ Nassi-Shneiderman (cây + graph)
  • Structured Lưu đồ Nassi-Shneiderman (cây + graph)
  • Sơ đồ Nassi-Shneiderman được tối ưu hóa (cây + biểu đồ)
  • Mô tả mã nguồn dưới dạng Thuật toán (một số giống như giải mã)
  • một số khác ...

Bạn có thể sử dụng dịch vụ này để thử nghiệm và hiểu về các trình dịch ngược.

BTW. Disassembler: mã máy nhị phân -> văn bản lắp ráp Trình biên dịch ngược: văn bản lắp ráp -> phiên bản nguồn ở ngôn ngữ cấp cao (c, C++, phần mở rộng của c, v.v.)

Các vấn đề liên quan