chuyển đổi thực thi trở lại mã nguồn C


14

Thật không may, tôi đã mất mã nguồn và tôi chỉ có tệp đầu ra được tạo bằng gcc trong linux và hiện tại tôi không có quyền truy cập vào máy tính của mình. Có cách nào để chuyển đổi tệp đầu ra thành tệp nguồn (trong c dưới linux) không?


Những gì bạn muốn được gọi là một dịch ngược. Bạn có thể tìm thấy một số trợ giúp với câu trả lời này: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf

IDA Pro với mô-đun dịch ngược là giải pháp thực tế duy nhất thực sự hoạt động với các tệp thực thi lớn.
fpmurphy

@ fpmurphy1 Bạn đã có Hopper, chất lượng tương đương với IDA Pro và giấy phép nào là một phần nhỏ của giá.
Rui F Ribeiro

@ fpmurphy1 Tôi vẫn chưa thấy chất lượng mã được tạo bởi Avast ... ai sử dụng nền tảng Intel 32 bit nữa? Ngoài ra tôi đã không sử dụng Wintel trong nhiều thập kỷ nay. thấy unix.stackexchange.com/questions/418354/... Sự khác biệt về giá là khá có ý nghĩa tuy nhiên, Hex-quang / IDA bắt đầu ủng hộ từ 1500usd cho một giấy phép cá nhân cho một số giá trị cắt cổ cho giấy phép thương mại như 5000USD hoặc lên AFAIK, Hopper là 100USD cho một người dùng và 130 cho một máy tính.
Rui F Ribeiro

@RuiFRibeiro. Một địa ngục của rất nhiều phần mềm độc hại mà tôi kiểm tra vẫn là 32 bit.
fpmurphy

Câu trả lời:


25

Vì vậy, bạn đã có một con bò, nhưng bạn đã vô tình chuyển đổi nó thành hamburger, và bây giờ bạn muốn con bò của bạn trở lại.

Xin lỗi, nó không hoạt động theo cách đó.

Chỉ cần khôi phục tệp nguồn từ bản sao lưu của bạn.

Ah, bạn không có bản sao lưu. Thật không may, vũ trụ không cho bạn nghỉ ngơi vì điều đó.

Bạn có thể dịch ngược nhị phân. Điều đó sẽ không cung cấp cho bạn mã nguồn của bạn, nhưng nó sẽ cung cấp cho bạn một số mã nguồn có cùng hành vi. Bạn sẽ không nhận được tên biến trừ khi đó là nhị phân gỡ lỗi. Bạn sẽ không nhận được cùng một logic trừ khi bạn biên dịch mà không tối ưu hóa. Rõ ràng, bạn sẽ không nhận được ý kiến.

Tôi đã sử dụng Boomerang để dịch ngược một số chương trình và kết quả dễ đọc hơn mã máy. Tôi không biết nếu nó là công cụ tốt nhất hiện có. Dù sao, đừng mong đợi phép màu.


1
Boomerang trông khá gọn gàng; xấu hổ khi tài liệu tham khảo gcc -O4 vì điều đó hoàn toàn không có gì (ngoài -O3) nếu bộ nhớ phục vụ tôi đúng. Câu cuối cùng của bạn tất nhiên là vô cùng hợp lệ cũng như năm câu đầu tiên của bạn. Điều đó không có nghĩa là phần còn lại không hợp lệ vì bạn đang nói rất rõ về tầm quan trọng của việc sao lưu thường xuyên. +1
Pryftan

6

Một số công cụ là phổ biến trong kỹ thuật đảo ngược một thực thi.

  1. Lệnh "file" lấy đường dẫn tệp làm tham số đầu tiên để bạn có thể xác định (trong hầu hết các trường hợp) loại thực thi nào bạn có.
  2. Các trình phân tách hiển thị CHÍNH XÁC những gì mà tệp thực thi thực hiện nhưng khó đọc đối với những người không viết mã lắp ráp trên kiến ​​trúc cụ thể đó hoặc có kinh nghiệm về việc tháo gỡ.
  3. Các trình dịch ngược như Boomerang, Hex-ray và Snowman có thể cung cấp một số khả năng đọc lớn hơn nhưng chúng không phục hồi tên biến hoặc cú pháp thực tế của chương trình gốc và chúng không đáng tin cậy 100%, đặc biệt trong trường hợp các kỹ sư tạo ra tệp thực thi được thử nghiệm với các gói này và cố gắng làm xáo trộn an ninh hơn nữa.
  4. Sơ đồ luồng dữ liệu hoặc bảng. Tôi biết không có công cụ miễn phí nào để thực hiện việc này một cách tự động, nhưng tập lệnh Python hoặc Bash trên đầu trình phân tích cú pháp văn bản của đầu ra lắp ráp (có thể được viết bằng sed hoặc Perl) có thể hữu ích.
  5. Bút chì và giấy, tin hay không, cho dòng chảy và ý tưởng.

Trong hầu hết các trường hợp tôi đã thấy, mã cần phải được viết lại từ đầu, được duy trì như một chương trình ngôn ngữ lắp ráp hoặc được phục hồi bằng cách áp dụng lại các yêu cầu thay đổi cho phiên bản cũ hơn.


1
# 1: Đúng mặc dù nó cũng có lỗi. # 3: Tôi đoán đó là thương mại? Tôi chỉ tò mò về mặt học thuật (tôi có các bản sao lưu dự phòng nên không cần loại đó). # 4: cflow (mặc dù sử dụng nguồn có một số hoạt động trên hệ nhị phân - dĩ nhiên có một số cảnh báo). Có những người khác ở ngoài đó, tùy thuộc vào những gì bạn đang theo đuổi. Đối với đầu ra đồ họa, tôi không thể giúp ở đó vì tôi không thích hoặc cần đầu ra đồ họa cho loại điều đó (tôi thực sự thấy nó gây mất tập trung hơn). # 5: rất đúng. Bạn cũng có thể sử dụng một tệp văn bản ở đây, tất nhiên.
Pryftan

3

Những gì bạn muốn làm được gọi là "dịch ngược". Có rất nhiều dịch ngược trên mạng và không thực tế để bao quát tất cả chúng ở đây.

Tuy nhiên, như một nhận xét chung: Việc chuyển đổi từ nguồn C sang mã máy thực thi là mất mát. Ví dụ:

  • Bình luận bị mất không thể đảo ngược
  • Tên biến đã biến mất
  • Đôi khi các vòng lặp không được kiểm soát để thực hiện
  • Các chức năng có thể được sắp xếp lại

Rất hiếm khi mã được biên dịch thành văn bản. Hầu hết các trình biên dịch ngày nay sẽ thay đổi mạnh mẽ mã của bạn để tối ưu hóa nó. Vì vậy, khi bạn dịch ngược, trình biên dịch chỉ có thể đoán mã nguồn phải trông như thế nào, không có cách nào để biết mã của bạn là gì, vì điều đó đã biến mất. Nếu trình dịch ngược tốt, mã bạn nhận được ít nhất sẽ có thể biên dịch lại thành một tệp thực thi tương đương, và sau đó bạn có thể bắt đầu tái cấu trúc từ từ để có thể đọc được. Nhưng rất có thể trình dịch ngược sẽ tạo ra mã spaghetti hoàn toàn không thể đọc được và sẽ rất đau đầu để giải mã nó. Đôi khi, việc viết lại chương trình từ đầu có thể sẽ ít việc hơn .


Về chủ đề bình luận, một cái gì đó tôi nhận thấy gần đây là - và tôi không biết liệu điều này có cho phép các bình luận được đọc bởi một trình dịch ngược hay tôi không mong đợi các trình dịch ngược thậm chí tìm kiếm loại điều này - điều này: -C Đừng loại bỏ các bình luận. Tất cả các bình luận được chuyển qua tệp đầu ra, ngoại trừ các bình luận trong các chỉ thị được xử lý, được xóa cùng với chỉ thị. Nó làm nổi bật các tác dụng phụ cũng như của tùy chọn -CC (cái này dành cho gcc mặc dù có lẽ là cpp thay thế). Không phải tôi mong đợi nó sẽ áp dụng cho OP nhưng có thể khiến một số người quan tâm.
Pryftan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.