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?
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?
Câu trả lời:
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.
Một số công cụ là phổ biến trong kỹ thuật đảo ngược một thực thi.
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.
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ụ:
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 .