Tôi đồng ý với Larsman và tôi tin rằng đối số có thể được thực hiện chính xác. Đầu tiên, tôi phải đồng ý rằng "tìm tất cả các mã trong một nhị phân nhất định" có nghĩa là, trong một ngữ cảnh này, có một hàm tính toán duy nhất xác định byte nào trong một tệp nhị phân đầu vào tương ứng với các lệnh được thực thi.
CHỈNH SỬA: Nếu có ai không rõ ràng về lý do tại sao có sự cố ở đây, hãy suy nghĩ về mã máy bị xáo trộn. Việc tháo gỡ mã như vậy là một vấn đề không tầm thường. Nếu bạn bắt đầu tháo gỡ ở giữa một lệnh đa byte, bạn sẽ có được sự tháo gỡ sai. Điều này không chỉ phá vỡ các chỉ dẫn trong câu hỏi, nhưng thường là một vài hướng dẫn ngoài đó. vv nhìn vào nó. (ví dụ: google "obfuscation and disassembly").
Phác thảo chiến lược để làm cho điều này chính xác:
Đầu tiên, xác định một/mô hình máy máy tính lý thuyết, trong đó một chương trình được mã hóa trong hướng dẫn nhị phân đa-bit, giống như mã máy trên các máy tính "thực", nhưng làm chính xác (và như vậy mà nó là turing hoàn thành). Giả sử rằng mã nhị phân mã hóa chương trình và tất cả đầu vào. Điều này tất cả phải được thực hiện chính xác, nhưng giả sử rằng ngôn ngữ có một lệnh băm (mã hóa nhị phân) và một chương trình sẽ dừng nếu và chỉ khi nó thực thi lệnh 'tạm dừng'.
Trước tiên, hãy giả sử rằng máy không thể thay đổi mã chương trình, nhưng có bộ nhớ để hoạt động. (giả định vô hạn trong các trường hợp thú vị).
Sau đó, bất kỳ bit đã cho nào sẽ là lúc bắt đầu một lệnh chạy trong khi thực hiện chương trình, nếu không sẽ không chạy được. (ví dụ: nó có thể nằm ở giữa lệnh, hoặc trong dữ liệu hoặc "mã rác" - tức là mã sẽ không bao giờ chạy. Lưu ý rằng tôi đã không xác nhận những điều này là loại trừ lẫn nhau, ví dụ như lệnh nhảy có thể có một mục tiêu ở giữa một lệnh cụ thể, do đó tạo ra một hướng dẫn khác, "trên lần đầu tiên vượt qua" không giống như một lệnh thực hiện.).
Xác định ins (i, j) là hàm trả về 1 nếu nhị phân i có lệnh bắt đầu tại vị trí bit j, thực thi trong một chương trình được mã hóa bởi i. Xác định ins (i, j) bằng 0 nếu không. giả sử ins (i, j) được tính toán.
Hãy halt_candidate (i) là chương trình sau đây:
for j = 1 to length(i)
if(i(j..j+len('halt')-1) == 'halt')
if(ins(i,j) == 1)
return 1
return 0
Vì chúng ta không cho phép tự thay đổi mã trên, họ chỉ đường cho một chương trình để ngăn chặn là cho có được một 'dừng lại' hướng dẫn tại một số vị trí j được thực hiện. Theo thiết kế, halt_candidate (i) tính hàm dừng.
Điều này cung cấp một bản phác thảo rất thô sơ về một hướng của bằng chứng. tức là nếu chúng ta giả định rằng chúng ta có thể kiểm tra xem chương trình i có một lệnh tại vị trí j cho tất cả j, thì chúng ta có thể mã hóa hàm dừng.
Đối với một hướng khác, người ta phải mã hóa bộ mô phỏng của máy chính thức, bên trong máy chính thức. Sau đó, tạo một chương trình cộng với các đầu vào i và j để mô phỏng chương trình i và khi một lệnh tại vị trí bit j được thực hiện, nó trả về 1 và dừng. Khi bất kỳ lệnh nào khác được thực hiện, nó vẫn tiếp tục chạy, và nếu mô phỏng bao giờ mô phỏng một hàm 'tạm dừng' trong i, trình giả lập nhảy vào một vòng lặp vô hạn. Sau đó ins (i, j) tương đương với tạm dừng (giả lập (i, j)), và do đó vấn đề dừng lại ngụ ý vấn đề tìm mã.
Tất nhiên người ta phải giả định một máy tính lý thuyết cho điều này tương đương với vấn đề dừng nổi tiếng không thể giải quyết được. Nếu không, đối với một máy tính "thực", vấn đề dừng lại có thể giải quyết được nhưng có thể thu vào.
Đối với hệ thống cho phép tự sửa đổi mã, đối số phức tạp hơn, nhưng tôi mong rằng điều đó không khác.
CHỈNH SỬA: Tôi tin rằng bằng chứng trong trường hợp tự sửa đổi sẽ là triển khai trình giả lập mã cộng-tự-sửa đổi trong mã tĩnh cộng với hệ thống dữ liệu ở trên. Sau đó dừng lại với mã tự sửa đổi được cho phép cho chương trình i với dữ liệu x, cũng giống như tạm dừng trong mã tĩnh cộng với hệ thống dữ liệu ở trên với nhị phân chứa trình giả lập, i và x làm mã cộng với dữ liệu.
Bạn có ý nghĩa gì với việc "tìm mã"? Reverse-kỹ thuật hoặc? – orlp
Sự hiểu biết của tôi bằng những gì HE/SHE có nghĩa là tìm kiếm toàn bộ chuỗi mã bao gồm cả các phụ thuộc. Tìm dòng có nội dung đó trong câu trả lời đã chọn để xem ngữ cảnh. –
Bạn có nên hỏi điều này tại [cs lý thuyết] (http://cstheory.stackexchange.com/) không? – Graviton