Khi tôi có thể chỉnh sửa các chuỗi trong một nhị phân thực thi?


12

Tôi có một nhị phân thực thi; chúng ta hãy gọi nó a.out. Tôi có thể thấy nhị phân chứa chuỗi

$ strings a.out
...
/usr/share/foo
....

Tôi cần thay đổi chuỗi /usr/share/foothành /usr/share/bar. Tôi chỉ có thể thay thế chuỗi bằng sed?:

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

Điều này có vẻ như một điều an toàn để làm. Điều này cũng sẽ hoạt động khi các chuỗi không có cùng độ dài?

Câu trả lời:


17

Tôi không biết liệu phiên bản của sedbạn sẽ sạch nhị phân hay sẽ làm nghẹt thở những gì nó nghĩ là dòng thực sự dài trong đầu vào của nó, nhưng việc chặn các vấn đề đó, chỉnh sửa chuỗi tại chỗ sẽ hoạt động. Để xem liệu nó có, so sánh các phiên bản cũ và mới cmp -l. Nó sẽ cho bạn biết liệu ba điểm khác biệt duy nhất giữa hai tệp có phải là 3 byte hay không.

Chỉnh sửa các chuỗi trong một tệp thực thi được biên dịch thực sự sẽ hoạt động nếu các chuỗi có cùng độ dài, nhưng hầu như nó cũng sẽ luôn hoạt động nếu bạn rút ngắn chuỗi, do cách các chuỗi hoạt động trong C. Trong chuỗi C, mọi thứ sau bộ NULkết thúc không được tính, vì vậy nếu bạn viết một NULterminator mới trước vị trí của cái cũ, bạn sẽ rút ngắn chuỗi một cách hiệu quả.

Nói chung, không có cách nào bạn có thể kéo dài chuỗi bằng cách sử dụng bản hack này.


Điều gì về việc rút ngắn chuỗi với một cái gì đó như thế sed -i 's@longstring@foo@' a.outnào? Điều này sẽ làm cho toàn bộ nhị phân nhỏ hơn 7 byte, Điều này sẽ không làm hỏng nhị phân?
Martin Vegter 9/03/2015

Có, nó sẽ làm hỏng nhị phân. Đó là lý do tại sao bạn phải dịch chuỗi thành một độ dài chính xác, nhưng đặt một bộ NULkết thúc ở vị trí sớm hơn như tôi đã giải thích (mặc dù có thể quá ngắn gọn). Vấn đề là bạn không thể có một NULbyte trên dòng lệnh nên bạn phải đặt sedchương trình của mình vào một tệp và tham khảo nó với -f. Mặt khác, điều an toàn hơn sẽ là sử dụng một công cụ được thiết kế để hoạt động với dữ liệu nhị phân thay vì sedđược thiết kế để hoạt động với dữ liệu văn bản.
Celada

2
Câu trả lời tốt. sed có thể làm rất nhiều thứ, nhưng, nói chung, đó là những gì các biên tập viên nhị phân được phát minh ra. Chúng có thể khó sử dụng khi điều hướng trong một tệp nhị phân lớn, nhưng chúng sẽ cho phép bạn thay đổi mọi thứ theo từng byte. Tôi sử dụng hexeditkhi tôi phải kiểm tra hoặc thay đổi một tệp nhị phân. Bạn có thể sử dụng strings -t x file | lessđể xác định vị trí của các chuỗi (có thể in) mà bạn muốn thay đổi trước khi nhảy vào trình chỉnh sửa.
Joe

Giả sử tôi có một chuỗi trong chương trình C của mình: "Tên tôi là Mr Robot" và tôi muốn thay thế 'là' bằng 'là', thì việc đệm \0sẽ phải được thực hiện cẩn thận, bởi vì nếu người thay thế thực hiện điều này: "Tên tôi là \ 0 Mr Robot ", sau đó trong khi thực hiện các thao tác với chuỗi, ký tự '\ 0' sẽ tạo ra sự cố vì độ dài sẽ giảm không chủ ý.
Nehal J Wani

@NehalJWani không, trong trường hợp đó, bạn phải dịch chuyển toàn bộ phần còn lại của chuỗi về phía trước một byte để kết thúc mới, thêm, kết thúc của bạn NULđi đến cuối, liền kề với hiện tại NUL.
Celada
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.