Tôi có một số câu hỏi ngây thơ / người mới bắt đầu:
- Kỹ thuật đảo ngược là tốt cho cái gì?
- Là một lập trình viên, tôi có nên học nghệ thuật kỹ thuật đảo ngược không?
- Những lợi ích cho một lập trình viên có kinh nghiệm với nó là gì?
Tôi có một số câu hỏi ngây thơ / người mới bắt đầu:
Câu trả lời:
Kỹ thuật đảo ngược là tốt cho cái gì?
Reverse Engineering chủ yếu tốt cho việc bẻ khóa và hack (loại bỏ bảo vệ số sê-ri hoặc nhắc nhở mật khẩu), nhưng cũng để hiểu virus hoặc phép lạ mà các phần mềm khác có thể thực hiện. Đôi khi, đó là một kỹ năng hữu ích để tìm lỗi trong các chương trình mà bạn chưa có nguồn và vá chúng.
Là một lập trình viên, tôi có nên học nghệ thuật kỹ thuật đảo ngược không?
Có, hãy cố gắng học trình biên dịch chương trình và sử dụng một trình gỡ lỗi đàng hoàng. Nó sẽ làm cho bạn trở thành một nhà phát triển tốt hơn bằng cách hiểu những thứ ở cấp độ thấp hơn, gần với kim loại hơn.
Điều gì sẽ là lợi ích của một lập trình viên có kinh nghiệm với kỹ thuật đảo ngược?
Bạn sẽ là một hacker / cracker tốt. Bạn có thể làm việc cho các nhà sản xuất chống vi-rút khác. Như một ví dụ cá nhân: Tôi đã từng đảo ngược một phần mềm để theo dõi một lỗi xảy ra trong khi thiết lập một kết nối sấm sét. Không ai khác có thể giải quyết vấn đề, vì vậy tôi đã nổi tiếng.
Ngoài ra, tôi cũng muốn trích dẫn bình luận của @ johannes , vì anh ấy hoàn toàn đúng:
Tôi sẽ không giới hạn nó để bẻ khóa "xấu". Việc phân tách có thể hữu ích để tìm hiểu xem trình biên dịch có bị điên hay không (thường là mã của bạn), từ quan điểm sysadmin hơn, thật thú vị khi xem ứng dụng bị lỗi ở đâu
Tôi thích câu trả lời của Falcon , nhưng tôi muốn thêm rằng trên một số ứng dụng kinh doanh thế giới nhàm chán cũ kỹ thuật đảo ngược có thể giúp bạn thoát khỏi một số rắc rối khó chịu.
Trong công việc, chúng tôi làm rất nhiều khi thực hiện tích hợp dữ liệu với hệ thống bên thứ 3 không có bất kỳ bảo trì mới nào, vì vậy chúng tôi có thể biết nơi nào nên hoặc không nên phá vỡ.
Chúng tôi cũng sử dụng kỹ sư đảo ngược để kiểm tra chất lượng mã (tất nhiên với một số ràng buộc nhất định) trên các thành phần bên thứ 3 mà chúng tôi mua, nếu không bao gồm mã nguồn.
Quan điểm thực sự của tôi là: kỹ thuật đảo ngược không gắn liền với một công nghệ hay ngôn ngữ, mà là một quá trình bạn học các phần bên trong của "hộp đen" . Nếu bạn có mã mà bạn phụ thuộc, nhưng bạn không hoặc không thể tin tưởng, bạn chắc chắn nên xem qua phần mui xe và xem mã đó đang làm gì.
Ngoài ra còn có khía cạnh nhàm chán của kỹ thuật đảo ngược. Đây là khi công ty bạn đang có một chút mã hoặc chương trình vẫn đang được sử dụng, nhưng không ai tuyên bố sẽ biết bất cứ điều gì về nó. Vì vậy, bạn đi qua nó, ghi lại nó, viết các bài kiểm tra và tất cả những thứ kỹ thuật nên được thực hiện trước khi một dự án được bắt đầu. Bạn làm điều này cho một phần mềm đã được viết, do đó "kỹ thuật đảo ngược".
Nó dễ dàng hơn nhiều khi bạn có mã, nhưng nó vẫn là kỹ thuật đảo ngược về mặt kỹ thuật. Đó là một trong những điều khoản xuất hiện rất nhiều trong các cuộc họp kinh doanh khi họ đang nói về các dự án cũ.
Chỉ để mở rộng giá trị kinh doanh của kỹ thuật đảo ngược - hơn một nửa số khách hàng mới mà chúng tôi gặp phải có một hệ thống / ứng dụng hiện có (không phải lúc nào cũng trong sản xuất, làm phiền bạn), nhưng mối quan hệ với nhà cung cấp phát triển phần mềm trước đó đã trượt dốc.
Trong khoảng 30% trường hợp khách hàng không có nguồn nào cho hệ thống của họ, và trong nhiều trường hợp, phần lớn quy trình kinh doanh thực tế, các quy tắc và kiến thức bị khóa trong mã.
Và trong một vài trường hợp các nhà cung cấp trước đó đã nhận được độc hại rõ ràng, làm xáo trộn các mã nhị phân, mã hóa thời gian, vv để buộc khách hàng vô thời hạn.
Vì vậy, để trả lời câu hỏi của bạn, kỹ thuật đảo ngược thường là điểm khởi đầu cho các cam kết mới với khách hàng khá tuyệt vọng (và bị đốt cháy) và nó có thể là một yếu tố thành công 'quan trọng trong kinh doanh' để rút ra kiến thức bị lãng quên từ mã hiện có.
Tôi sẽ lập luận rằng bộ kỹ năng cho kỹ thuật đảo ngược và bộ kỹ năng để gỡ lỗi là hoàn toàn giống nhau - nếu bạn là một người sửa lỗi tuyệt vời, bạn cũng là một kỹ sư đảo ngược tuyệt vời và ngược lại.
Đôi khi, nó được sử dụng để có được một số bộ phận / phần mềm để hoạt động theo như tôi hiểu. Một số giao diện kỳ lạ, lỗi trong thực hiện, vv
Nhưng theo những gì tôi hiểu, đó là một chủ đề rất trơn tru, và do đó, các quy luật phát triển phần mềm vốn đã phức tạp đã được đưa đến cực điểm với kỹ thuật đảo ngược.
Chà, với kỹ thuật đảo ngược, bạn có thể sử dụng lại mã tối thiểu hóa công việc của mình. Ví dụ, trong Symfony2, bạn có thể chuyển đổi cơ sở dữ liệu được tạo từ MySQL thông thường và chuyển đổi sang định dạng học thuyết và đây là quy trình được thiết kế ngược có thể thực hiện được trong Symfony .... và với kỹ thuật đảo ngược, bạn có thể thấy mã hãy nói 'trong 2D'
Tôi chỉ đưa ra một ví dụ thực tế từ kinh nghiệm của tôi.
Khi công ty chúng tôi tiếp quản một dự án từ một công ty khác. Khoảng nửa năm tham gia dự án, chúng tôi nhận ra rằng một tiểu dự án không có mã. Khi chúng tôi yêu cầu công ty cũ giao mã, họ lịch sự trả lời rằng họ không thể tìm thấy mã cho tiểu dự án. Chúng tôi cần mã bởi vì chúng tôi muốn thay đổi một cái gì đó trong tiểu dự án đó.
Tôi đã phải đảo ngược kỹ sư tiểu dự án.
Đầu tiên tôi dịch ngược phần lắp ráp (vâng, đó là một dự án .NET). Kết quả của quá trình dịch ngược là mã nhạt nhẽo và khó hiểu mà không có tên của các biến cục bộ và cấu trúc điều khiển phức tạp. Điều này là do quá trình biên dịch loại bỏ thông tin quan trọng không thể dịch ngược.
Sau đó, tôi đã cố gắng tìm ra nơi để thay đổi mã đó. Để làm điều này, tôi sắp xếp hợp lý mã để hành xử tương tự nhưng theo cách ngắn gọn hơn. Tôi cũng đoán tên của các biến từ hành vi của nó. Tôi đã từng bước qua mã nhiều lần cho đến khi tôi nhận ra nó đang làm gì.
Tôi đã không đảo ngược mọi thứ, chỉ là phần chúng tôi phải thay đổi. Nó không quá tệ, khoảng 200 dòng mã VB. Mất khoảng năm ngày làm việc.