Cách sửa đổi đầu ra của chương trình mà bạn không có mã nguồn


89

Trong công ty của chúng tôi, chúng tôi có một chương trình nhỏ (kích thước .exe 500Kb) để tính toán và cuối cùng, nó đưa ra kết quả trên bảng tính Excel mà chúng tôi sử dụng để tiếp tục công việc của mình.

Tôi muốn sửa đổi các cột, định dạng khoảng cách và thêm logic VBA, v.v. trên bảng tính Excel nhưng vì tham số này không thể định cấu hình trong chương trình đó, nên dường như cách duy nhất để sửa đổi là phá vỡ / đảo ngược kỹ sư .exe

Không ai biết nó được lập trình bằng ngôn ngữ nào, điều duy nhất chúng ta biết là:

  1. Được phát triển hơn 20 năm trước
  2. Nhà phát triển đã nghỉ hưu 10 năm trước
  3. Ứng dụng GUI
  4. Chạy độc lập
  5. Kích thước 500Kb

Bất kỳ đề xuất những lựa chọn tôi phải đối phó với loại vấn đề như vậy? Là kỹ thuật đảo ngược là lựa chọn duy nhất, hoặc có một cách tiếp cận tốt hơn?


149
Bạn có biết những gì tính toán mà nó thực hiện? Nếu vậy, hãy viết một ứng dụng mới, đẩy một số dữ liệu thử nghiệm qua cả hai để kiểm tra ứng dụng mới hoạt động như nhau, sau đó vứt bỏ ứng dụng cũ. Sau đó thực hiện các thay đổi bạn muốn thực hiện.
David Arno

13
Nhận xét của @DavidArno sẽ là một câu trả lời hay. Kỹ thuật đảo ngược là có thể, nhưng việc xác định lại và viết lại ứng dụng sẽ rẻ hơn / dễ dàng hơn / nhanh hơn rất nhiều.
Dan Pichelman

44
Một cách khác để sửa đổi nó là lấy kết quả mà chương trình gốc tạo ra và lọc nó thành bất cứ thứ gì bạn muốn.
Blrfl

9
@Alec nếu bạn mở .exe bằng trình soạn thảo hex, bạn có thể nhận được manh mối về nội dung được viết. Ví dụ: tên trình biên dịch có thể được nhúng. Từ đó bạn sẽ biết thêm về các tùy chọn dịch ngược có thể.
GrandmasterB

26
Ngoài ra, bạn có thể cố gắng tìm một quý ông viết đơn và xem liệu anh ta có sẵn sàng đến trong một hoặc hai ngày (có thể vài giờ mỗi ngày) với tư cách là một nhà tư vấn. Nếu anh ta là một nhà phát triển đã nghỉ hưu, có một cơ hội vừa phải rằng anh ta có thể đánh giá cao một chút chi tiêu với mức 100-150 đô la / giờ trong khi thực sự tận hưởng khoảnh khắc làm một chút công việc chỉ trong một khoảng thời gian ngắn.
RLH

Câu trả lời:


234

Kỹ thuật đảo ngược có thể trở nên rất khó khăn, thậm chí nhiều hơn nếu bạn không chỉ muốn hiểu logic của chương trình, mà thay đổi và biên dịch lại nó. Vì vậy, điều đầu tiên tôi sẽ cố gắng là tìm kiếm một giải pháp khác.

Tôi muốn sửa đổi các cột, định dạng khoảng cách và thêm logic VBA, v.v. trên bảng tính Excel

Nếu đó là điều duy nhất bạn muốn và tính toán được thực hiện bởi chương trình là tốt, tại sao bạn không viết chương trình bằng ngôn ngữ bạn chọn (có thể là macro Excel) gọi di sản của bạn là "exe", lấy đầu ra và xử lý nó thêm nữa.


9
Tại sao chương trình mới phải gọi EXE cũ? Tại sao không làm cho chương trình mới trở nên độc lập và sau đó viết một kịch bản gọi cả hai và phối hợp đầu ra và đầu vào? Kinh nghiệm của tôi cho thấy rằng việc để các ngôn ngữ dòng lệnh như bash, PowerShell hoặc lệnh nhắc xử lý tọa độ xử lý thường đơn giản hơn là cố gắng tự viết mã bằng ngôn ngữ bắt buộc. Mặt khác, +1.
jpmc26

8
@ jpmc26: Điều đó đúng cho đến khi bạn phải đối phó với các quy tắc trích dẫn vô lý của Bash. Có, chúng (hầu hết) tuân thủ POSIX. Không, họ không có ý nghĩa gì cả. $ FOO không nên chia từ, ví dụ.
Kevin

16
@ jpmc26: Cá nhân tôi chưa bao giờ gặp khó khăn khi gọi điện subprocess.run().
Kevin

3
@ jpmc26: Đường ống gì? Đó là sách dạy nấu ăn thuần túy; nếu bạn muốn stdout, bạn vượt qua PIPEhằng số ma thuật . Mặt khác, bạn không và nó bị loại bỏ. Có gì để hiểu?
Kevin

3
... Tôi nên thêm rằng tôi đã sử dụng Excel với VBA trong quá khứ như là một tiện ích dòng lệnh cho các tiện ích dòng lệnh rất thành công hơn một lần. Cấu trúc luôn giống nhau: một tờ để nhập các tham số là "UI của người nghèo", nút "Bắt đầu" trên trang đó. Trong mã VBA, người ta cần một Shellcuộc gọi trong Excel VBA như thế này: stackoverflow.com/questions/8902022/ , một người có thể chuyển stdout / stderr từ tiện ích cmd thành các tệp riêng biệt và sau đó áp dụng định dạng đầu ra.
Doc Brown

114

Ngoài các câu trả lời đã được đưa ra bởi Doc Brown và Telastyn, tôi muốn đề xuất một phương pháp thay thế (theo giả định đó là nhiệm vụ quan trọng).

Nếu bạn không biết các tính toán mà nó thực hiện và các tính toán là (phần nào) quan trọng về nhiệm vụ: Trích xuất logic gốc trong .exetệp bằng bất kỳ phương tiện cần thiết nào. Giải mã nó bằng cách sử dụng trình dịch ngược / dịch ngược như IDA nếu cần. Thuê một nhà tư vấn (hoặc một loạt các chuyên gia tư vấn) nếu cần thiết.

Chắc chắn, làm việc xung quanh nó bây giờ bằng cách sử dụng giải pháp của họ, nhưng đừng để nó xảy ra.

Lý do tôi đề xuất như sau: Bạn đã thừa nhận rằng các tính toán rất phức tạp (theo một kỹ sư mà bạn đã nói chuyện). Nó cũng rất quan trọng. Vì vậy, nếu bằng cách nào đó, bản gốc .exengừng hoạt động do những thay đổi trong nền tảng bạn có (có thể hỗ trợ 16 bit bị bỏ?), Bạn vừa mất một phần kiến thức quan trọng .

Bây giờ, tôi không lo lắng về việc mất .exe, nhưng về việc mất kiến ​​thức mà nó mã hóa. Kiến thức đó phải được phục hồi.

Như trước đây: nếu kiến ​​thức đó đã có sẵn, hãy đảm bảo viết nó xuống theo định dạng mà nó sẽ không bị mất bất cứ lúc nào sớm. Nếu không, phục hồi nó và viết nó xuống.


14
Các trình dịch ngược hiện đại thực sự tạo ra mã thường khá dễ đọc, đặc biệt nếu nguồn ban đầu ở dạng C hoặc trình biên dịch đơn giản, và không phải là ngôn ngữ cấp cao hơn.
phyrfox

4
Điểm rất tốt. Ngoài ra: Chỉ cần vá nó lên để nó hoạt động trở lại sẽ chỉ hoạt động cho đến khi sửa chữa tiếp theo cần được thực hiện.
Daniel Jour

33
@phyrfox 20 tuổi ... nhà phát triển đã nghỉ hưu 10 năm trước ... chỉ có đầu ra là một bảng tính Excel ... Tôi sẽ đặt tiền vào đó là một ứng dụng VB6.
J ...

10
@micaho: hoặc công ty vẫn tồn tại và người có bí quyết xác minh kết quả và các giả định ẩn vừa bị xe tải đâm. Tất nhiên, đó là một rủi ro kinh doanh nên cuối cùng các bên liên quan nên quyết định. Tôi chỉ muốn nhấn mạnh rằng "trình bao bọc" sẽ hoạt động ngay bây giờ, nhưng chỉ thêm vào nợ kỹ thuật.
Sjoerd Công việc Postmus

22
@J ...: Nếu là VB6 thì poster ban đầu là may mắn. Bạn có thể khôi phục mã nguồn từ trình biên dịch VB6 khá dễ dàng.
Eric Lippert

74

Hỏi người lập trình ban đầu, nếu có thể.

Vài tuần trước tôi đã được liên hệ bởi một công ty tôi đã từng làm việc 10 năm trước với cùng một câu hỏi về một tệp mdb được phát triển vào giữa những năm 90.


52
Đây là trái cây treo thực sự thấp. Mọi người (bao gồm cả tôi) lãng mạn hóa việc sử dụng các kỹ năng lập trình cứng như kỹ thuật đảo ngược, thực hiện lại chức năng của chương trình hoặc thêm các lớp vào xử lý dữ liệu. Trong thực tế, nơi tốt nhất để bắt đầu là một email thân thiện có thể quay lại sau một giờ với vị trí của mã nguồn hoặc một số giải pháp lý tưởng khác.
dùng1717828

2
Khi ở nhà với một ứng dụng 10 năm tôi cũng vậy, tôi đã kích hoạt một người tháo gỡ nhưng trong giờ làm việc thì mục tiêu lại khác ^^
Paolo

2
Bạn có nhớ gì về nó không? :)
Ángel

2
tất nhiên! Thật không may, công ty đã trải qua 3 lần mua lại và hợp nhất nên rất nhiều thông tin bị mất và một phần của các bản sao lưu nằm trong túi bị mất ... sự phát triển trên trang web của họ vì vậy tôi không có bản sao của nguồn đó.
Paolo

1
Quét EXE để tìm các chuỗi nhúng có thể bao gồm tên của nhà phát triển hoặc một cái gì đó. Điều đó dễ dàng hơn việc lắp ráp hoàn chỉnh!
JDługosz

55

Bất kỳ đề xuất những lựa chọn tôi phải đối phó với loại vấn đề như vậy?

Nếu tất cả những gì bạn muốn làm là sửa đổi đầu ra, thì tại sao không sử dụng thành phần?

Thay vì sửa đổi hộp đen mà bạn không thể dễ dàng truy cập, bạn tạo một chương trình mới lấy đầu ra Excel và định dạng / cột của bạn cũng thay đổi . Sau đó, bạn có thể tạo một exe / script mới gọi hai chương trình theo thứ tự, do đó, người dùng cuối sẽ thấy rằng chỉ có một chương trình thực hiện tất cả công việc - mặc dù đó là hai bước khác biệt trong chương trình.


2
@Alec Việc java có phải là ngôn ngữ phù hợp hay không chủ yếu phụ thuộc vào lượng dữ liệu bạn cần xử lý / lượng tính toán mà bạn cần thực hiện. Nếu cả hai đều thấp, java là tốt. Nếu một trong hai là quan trọng, tốt nhất bạn nên thả xuống C hoặc C ++. Nhưng vì dường như bạn chỉ đang sử dụng một lượng dữ liệu phù hợp với bảng tính Excel, nên tôi không nghĩ có đủ dữ liệu liên quan để biến java thành một lựa chọn tồi (Excel có thể sẽ phát nổ trước khi ứng dụng của bạn hoạt động).
cmaster

18
@cmaster ý tưởng rằng Java bị cấm đối với tính toán nặng nề là một khái niệm lỗi thời. Điểm chuẩn tồi tệ nhất được liệt kê ở đây thậm chí không phải là 4x (hầu hết là 2 lần hoặc ít hơn) và nếu một số vô hướng một chữ số là điểm đột phá của bạn, thì sự tiết kiệm trong an toàn (chuyển trực tiếp sang đô la của nhà phát triển) nhiều khả năng sẽ bù đắp cho hiệu suất đạt được .
corsiKa

8
@Alec bất kỳ ngôn ngữ sẽ làm việc. VBA có vẻ là một lựa chọn tốt vì nó đã tích hợp với Excel rất tốt.
Thuyền trưởng Man

4
@corsiKa Điều đó phụ thuộc hoàn toàn vào quy mô ứng dụng của bạn. Nếu một lần chạy tiêu tốn vài chục nghìn giờ CPU, hệ số 2 hoặc 4 trở nên cấm: Nó chuyển trực tiếp thành lượng kết quả mà bạn có thể nhận được từ một máy nhiều triệu. Ngoài ra, các ứng dụng như vậy thường hoạt động theo bước khóa, vì vậy bộ sưu tập rác là chất độc hoàn toàn cho hiệu suất của chúng, các gián đoạn nhỏ sẽ nhân với số lượng quy trình. Tôi nói với bạn, các ứng dụng như vậy tồn tại và chúng chắc chắn không được viết bằng Java. Họ chỉ không được sử dụng bởi các doanh nghiệp internet trung bình.
cmaster

7
@cmaster Chúng ta đang nói về một số tính toán đơn giản, không phải là một công cụ trò chơi AAA đầy đủ với sự chiếu sáng toàn cầu thời gian thực, kết xuất dựa trên vật lý, hoạt hình voxel sptce octrees, mô phỏng trường vật lý phổ quát và tương tự. Không có hành vi phạm tội, nhưng chèn bất kỳ đối số hiệu suất RE ở đây là xấu. Dễ sử dụng nên là số 1, và như một người nào đó đã sử dụng C ++ trong một vài năm, đó là ngôn ngữ cuối cùng tôi muốn giới thiệu trong trường hợp này.

3

Có những công ty chuyên về chính xác loại vấn đề này. Họ sử dụng mã độc quyền để dịch ngược mã gốc thành ngôn ngữ cấp cao, sau đó áp dụng chuyên môn của con người để làm cho nó trở nên hữu ích (ví dụ: đặt tên biến phù hợp).

Vài năm trước, chủ nhân của tôi đã sử dụng điều này để di chuyển một số mã máy tính lớn S / 390 bản địa sang các máy chủ Linux. Chúng tôi đã cho họ một nhị phân, họ đã cho chúng tôi mã nguồn trong C.

Cho dù điều này là cần thiết trong trường hợp của bạn, là tùy thuộc vào bạn. Nếu bạn chỉ quan tâm đến định dạng của đầu ra, bạn có thể chỉ cần xoa bóp đầu ra sau khi nó được sản xuất. Tuy nhiên, như những người khác đã chỉ ra, có logic kinh doanh ẩn trong một blob nhị phân có thể là một rủi ro liên tục.


3

Viết một trình bao bọc đơn giản xung quanh chương trình, nắm bắt đầu ra của nó. Nó không phức tạp để làm như nhiều ngôn ngữ ( ví dụ Java , C ++ , Python , .NET ) có nghĩa cho việc này. Phân tích đầu ra và tạo một cái khác, ở dạng mong muốn. Người dùng sẽ gọi chương trình mới của bạn. Tệp thực thi cũ sẽ ở bên cạnh nó, hoặc thậm chí có thể được trích xuất tự động từ tài nguyên, trước khi gọi nó.

Giải pháp này tất nhiên hoạt động đủ tốt chỉ khi đầu ra được cấu trúc tốt để dễ phân tích.

Đó là một ứng dụng GUI, không phải là vấn đề chặn. Bạn có thể khởi chạy nó, tạo đầu ra và sau đó tự động đăng quá trình khi GUI này kết thúc.


3
Điều này khác với câu trả lời được bình chọn hàng đầu của Doc Brown như thế nào?
Laf

Tôi không đồng ý với giả định câu trả lời của Doc bị viết xấu. Nó rõ ràng và cô đọng.
Cột

1
Nếu bạn nhìn vào văn bản của câu trả lời này, bạn sẽ thấy rằng phần thông tin duy nhất tạo ra chính xác phần cuối của câu cuối "gọi di sản của bạn là" exe ", lấy đầu ra và xử lý nó thêm."
h22

2
Không phải là một downvoter, và không hiểu tại sao cái này lại có -3 ... là Meta một lần nữa? nhưng riêng biệt, tôi sẽ khuyên bạn không nên trả lời câu trả lời của người khác vì "chứa nhiều chất làm loãng não" khi (A) đó là một đánh giá chủ quan và (B) theo ý kiến ​​chủ quan của tôi, ý kiến ​​của bạn chỉ chứa đựng điều đó!
gạch dưới

Điều này cũng có thể được viết lại là "chứa các cuộc nói chuyện chung chung không chính thống, chỉ làm sao lãng chủ đề làm lãng phí thời gian của độc giả", nếu cách đó có vẻ hữu ích hơn. Cung cấp một gợi ý cho cách tiếp cận đúng vào nửa sau của câu cuối cùng. Điều này không có ý định xúc phạm. Bình luận bị xóa.
h22

1

Viết một số bài kiểm tra thực hiện càng nhiều trường hợp càng tốt trên mã cũ. Tìm trường hợp góc, kiểm tra đầu vào sai và kiểm tra đầu vào đúng.

Ghim xuống những gì là đầu ra chính xác cho các trường hợp khác nhau, và sau đó cố gắng viết một triển khai đáp ứng các thử nghiệm tương tự .

Tôi sẽ không đi theo con đường kỹ thuật đảo ngược. Việc đảo ngược mã máy rất phức tạp và bạn đã biết mục đích của exe là gì. Kỹ thuật đảo ngược là một công việc quá ít cho những gì bạn đang theo đuổi.

Nếu phần mềm được phát triển bởi một anh chàng cách đây 20 năm, thì đó có lẽ không phải là thứ chiếm nhiều sức mạnh hiện đại. Một chương trình GUI kéo dài máy 20 năm trước sẽ hầu như không đăng ký trên một máy hiện đại, vì vậy bạn có thể đang nhìn vào thứ gì đó tương đối đơn giản để tái tạo.


0

Cố gắng đảo ngược kỹ sư exe. Chỉ với mục đích tìm ra logic tính toán hoặc ít nhất là để có được gợi ý hợp lý về những gì nó thực sự làm và nếu kỹ thuật đảo ngược của bạn có thể đưa bạn đến điểm đó, bạn có thể viết ứng dụng mới dựa trên logic tính toán đó. Ngoài ra, tôi không thấy lối thoát khác.

Nói dễ hơn làm, kỹ sư đảo ngược một exe tạo ra 20 năm trở lại là thách thức thực sự.


12
Việc hẹn hò của exe không thực sự quan trọng
Ángel

1
Trong thực tế, với việc tối ưu hóa ngày càng thông minh hơn mỗi năm, kỹ thuật đảo ngược chỉ trở nên khó khăn hơn.
MSalters
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.