Tại sao chúng ta không thể hiểu nội dung của tệp nhị phân sau khi biên dịch?


11

Theo tôi biết, mỗi chương trình bao gồm một gói các hướng dẫn bộ xử lý với một số biến dữ liệu cụ thể (float, int, char ...) để làm việc trên các thanh ghi bộ xử lý .

Vì vậy, điều đầu tiên tôi nghĩ về nó (một thời gian dài trước đây) là nếu bạn biết rằng giá trị ASCII của %¨#$¨#(chỉ là một ví dụ ngẫu nhiên) có thể được hiểu là địa chỉ của thanh ghi con trỏ ngăn xếp (chỉ là ví dụ) của x86 bộ xử lý. Nếu điều này là đúng, mỗi khi bạn tìm thấy giá trị "không thể đọc được" này khi đọc nội dung của tệp nhị phân, bạn có thể hiểu rằng thanh ghi con trỏ ngăn xếp đang được sử dụng để quản lý một số biến dữ liệu.

Thật không may, điều này không xảy ra. Dưới đây, có một ví dụ về nội dung của ping.exechương trình từ Windows được mở bằng notepad.exe:

Ping.exe như được xem trong MS Notepad

Nó là một tệp nhị phân và dữ liệu của nó không thể hiểu được đối với con người chúng ta (nó có thể hiểu được đối với máy móc.) Nó không có ý nghĩa gì với bất cứ ai ngay cả khi họ biết mã hội (mức thấp nhất của ngôn ngữ máy.)

Vì vậy, nếu tôi đã hiểu mọi thứ một cách chính xác, ai đó có thể giải thích

  1. Tại sao một mã nhị phân không thể trở lại mã hội cho đến khi chúng ở sâu, giống như vậy?
  2. Nếu người ta có thể hiểu mã lắp ráp, tại sao nhị phân được biên dịch lại do mã này "có thể đọc được" nữa?

12
Bạn có thể, bạn chỉ cần một bộ phận phân tách .
David Schwartz

Vì vậy, tôi có thể tháo gỡ bất kỳ tập tin .exe nào ??? Tôi chỉ biết rằng nó hoạt động với mã được quản lý ...
Diogo

13
Bạn có thể tháo rời bất kỳ thực thi. Cho dù bạn có thể hiểu ý nghĩa của đầu ra tháo rời là một câu chuyện khác.
David Schwartz

5
Việc biên dịch hoặc lắp ráp sẽ loại bỏ rất nhiều thông tin quan trọng của con người như tên biến, nhãn nhánh, v.v. Việc tháo gỡ có được luồng hướng dẫn, nhưng bạn vẫn còn nhiều điều phải tìm hiểu.
mpez0

1
Ngoài ra mã obfuscation có thể cản trở tháo gỡ.
toán

Câu trả lời:


13

Đầu tiên, đăng ký không có địa chỉ. Mỗi hướng dẫn trong bất kỳ ngôn ngữ lắp ráp nào đều chuyển thành opcode. Các mã trong x86 có thể là một, hai, ba hoặc thậm chí nhiều byte hơn (trong một số bộ xử lý khác, chúng là "chiều rộng cố định"). Thông thường, opcode xác định hướng dẫn, chế độ địa chỉ và các thanh ghi liên quan. "Chế độ địa chỉ" xác định xem CPU có cần nhiều hơn opcode không, tức là chế độ địa chỉ "ngay lập tức" có nghĩa là có thêm dữ liệu ngay sau (hoặc "ngay sau") hướng dẫn cho lệnh đó - chế độ địa chỉ "tuyệt đối" có nghĩa là địa chỉ bộ nhớ theo hướng dẫn và được sử dụng bởi hướng dẫn đó.

Bạn có thể tìm ra opcode của một cái gì đó giống MOV AL,SPhoặc tương tự và sau đó tìm kiếm nó. x86 có rất nhiều hướng dẫn hoạt động trên con trỏ ngăn xếp.

Nhưng làm ơn, xin vui lòng bỏ sử dụng Notepad và sử dụng trình soạn thảo hex thay thế. Tôi muốn giới thiệu HxD, mặc dù có nhiều người khác.

Và @David Schwartz là chính xác. Một trình dịch ngược sẽ lặp qua một tệp và dịch mã trở lại thành văn bản có thể đọc được. Những gì bạn muốn làm là hoàn toàn có thể.

Tuy nhiên, bạn cần biết hướng dẫn bắt đầu từ đâu trong tệp vì nếu bạn bắt đầu sai địa chỉ, một số dữ liệu phải là "toán hạng" cho opcodes (chẳng hạn như hướng dẫn lấy địa chỉ cho toán hạng hoặc "đối số") có thể bị hiểu sai là opcodes. Biết được điều này đòi hỏi kiến ​​thức về định dạng mà tệp thực thi được sử dụng, đối với Windows là định dạng "Thực thi di động" hoặc PE (và thường là ELF cho các hệ thống Linux). Tôi chắc chắn có những người tháo gỡ hiểu PE, v.v. nhưng tôi không biết bất kỳ điều gì trái tay.


1
IDA là một trong những người phổ biến PE phổ biến hơn. Hoạt động với các tệp Linux và Mac. Phiên bản 5.0 vẫn có sẵn dưới dạng phần mềm miễn phí
Scott Chamberlain

1
> nếu bạn bắt đầu sai địa chỉ, có thể bị hiểu sai. Đó là lý do tại sao tất cả các lần xuất hiện %¨#$¨#sẽ không nhất thiết phải là một tham chiếu đến con trỏ ngăn xếp; nó có thể chỉ là giữa của hai lệnh khác nhau : _3p%¨#$¨#b5F( _3p   %¨#$¨#   b5F).
Synetech

12

Vì vậy, nếu tôi đã hiểu đúng mọi thứ

Không hẳn.

Nó là một tệp nhị phân và dữ liệu của nó là không thể hiểu được đối với con người chúng ta

Thông thường, một tệp nhị phân không thể hiểu được đối với con người và máy móc, đặc biệt là khi mục đích của tệp không xác định. Lưu ý rằng không phải tất cả các tệp nhị phân là các tệp thực thi. Rất nhiều tệp nhị phân là các tệp dữ liệu không chứa bất kỳ hướng dẫn nào của máy. Đó là lý do tại sao phần mở rộng tệp được sử dụng khi đặt tên tệp (trong một số HĐH). Các . phần mở rộng com đã được CP / M sử dụng để biểu thị một tập tin thực thi. Các . Phần mở rộng exe đã được MS-DOS thêm vào để biểu thị một định dạng tệp thực thi khác. * nixes sử dụng thuộc tính exec để biểu thị tập tin nào có thể được thực thi, mặc dù nó có thể là script cũng như code.

Như đã được đề cập bởi những người khác, các tệp nhị phân, chứa các số, phải được xem bởi chương trình kết xuất hex hoặc trình soạn thảo hex chứ không phải bởi trình xem văn bản.

có một ví dụ về nội dung của chương trình ping.exe

Tệp đó thực sự là một chương trình có thể định vị lại và không phải tất cả dữ liệu trong tệp đó đại diện cho mã máy. Có thông tin về chương trình như thư viện động nào cần, các thường trình phải được liên kết, các yêu cầu đối với ngăn xếp và bộ nhớ chương trình & dữ liệu và điểm vào của chương trình. Các toán hạng địa chỉ trong tệp có thể là các giá trị tương đối cần được tính thành các giá trị tuyệt đối hoặc các tham chiếu cần được giải quyết.

"Tệp chương trình" mà bạn có thể nghĩ đến được gọi là tệp hình ảnh nhị phân hoặc kết xuất bộ nhớ chương trình. Một tệp như vậy sẽ chỉ chứa mã máy và dữ liệu, với tất cả các tham chiếu địa chỉ được đặt đúng để thực thi.

ngay cả khi họ biết mã hội (mức ngôn ngữ máy thấp nhất.)

Ngôn ngữ hội không giống như ngôn ngữ máy . CPU thông thường (như để loại trừ các máy tính ngôn ngữ cấp cao) chấp nhận mã máy làm đầu vào, mỗi lần một lệnh. Các toán hạng là các thanh ghi hoặc địa chỉ bộ nhớ số. Ngôn ngữ hội là ngôn ngữ cấp cao hơn có thể sử dụng nhãn biểu tượng cho các vị trí và biến chỉ dẫn, cũng như thay thế mã op số bằng mnemonics. Một chương trình ngôn ngữ lắp ráp phải được chuyển đổi sang ngôn ngữ / mã máy trước khi thực sự có thể được thực thi (thường là bởi các tiện ích được gọi là trình biên dịch, trình liên kết và trình tải).

Hoạt động ngược lại, có thể được thực hiện trên các tệp chương trình với một số thành công và mất thông tin tượng trưng. Việc tháo rời bộ nhớ kết xuất hoặc tệp hình ảnh chương trình là bản dùng thử và lỗi nhiều hơn, vì mã và vị trí dữ liệu cần được xác định thủ công.

BTW có những người có thể đọc và mã mã máy (số). Tất nhiên điều này dễ dàng hơn nhiều đối với CPU hoặc vi điều khiển 8 bit so với bộ xử lý CISC 32 bit với hàng tá chế độ địa chỉ bộ nhớ.


3

Bạn không thể thấy mã hóa đúng, dự định của tệp nhị phân thông qua Notepad. Vui lòng xem lại để tham khảo trong tương lai. Hầu hết các chương trình chỉnh sửa văn bản không phân tích các định dạng mã hóa nhị phân và dự kiến ​​sẽ phân tích định dạng mã ký tự ASCII.

Vì vậy, việc mở tệp nhị phân trong trình soạn thảo văn bản sẽ mang lại các ký tự ASCII tương đương không có ý nghĩa gì về định dạng ban đầu của dữ liệu nhị phân như được trình soạn thảo văn bản phân tích. Như đã đề cập, các trình soạn thảo hex và một số có tính năng nhị phân, để xem nội dung ở định dạng nhị phân thuần túy.

Bạn không chính xác rằng nội dung của tệp nhị phân không thể hiểu được. Mặc dù chúng sẽ khó và trong các kiến ​​trúc máy tính hiện đại cực kỳ khó có thể tự tháo rời khỏi nhị phân thành các hướng dẫn thích hợp được CPU nhận ra để thực thi (hoặc CPU giả lập / ảo), v.v.

Bạn nghĩ trình giả lập được lập trình như thế nào? Nhà phát triển sẽ cần phải biết opcodes để có thể lập trình hệ thống giả tưởng để nhận ra và hành xử như phần cứng thực sự theo một cách nào đó. Tài liệu giải thích nhiều kiến ​​trúc của CPU và thậm chí GPU cũng có chúng (mặc dù bí mật hơn).

Một điều khác cần lưu ý là ở mức thấp nhất, mặc dù tương quan, "dữ liệu nhị phân" không thực sự là một loạt các số 0 và một, nhưng điện áp cao và thấp được khuếch đại / chuyển qua một mạch điện như dòng điện.

Nhị phân thường là 1: 1 với điều này, vì vậy sẽ rất có ý nghĩa khi sử dụng hệ thống số cho nó.

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.