답변:
나는 당신의 버전 sed
이 바이너리 클린인지 또는 입력에서 실제로 긴 줄이라고 생각하는 것을 질식 시킬지 모르겠지만, 그러한 문제를 피하고, 문자열을 제자리에서 편집하면 효과가 있습니다. 그것이 있는지 여부를 확인하려면 이전 버전과 새 버전을와 비교하십시오 cmp -l
. 두 파일 간의 유일한 세 가지 차이점이 3 바이트인지 여부를 알려 주어야합니다.
컴파일 된 실행 파일에서 문자열을 편집하면 문자열의 길이가 같은 경우 실제로 작동하지만 C에서 문자열이 작동하는 방식으로 인해 문자열을 줄이면 거의 항상 작동합니다. C 문자열에서는 NUL
종료 후 모든 것 계산하지 않으므로 NUL
이전 종결 자보다 먼저 새로운 종결자를 쓰면 효과적으로 줄을 줄일 수 있습니다.
일반적으로이 핵을 사용하여 문자열을 늘릴 수있는 방법은 없습니다.
NUL
설명 된 것처럼 초기 위치에 종결 자를 설정해야 합니다 (아마도 너무 짧을 수도 있음). 문제는 NUL
명령 줄에 바이트를 가질 수 없으므로 sed
프로그램을 파일에 넣고로 참조해야한다는 것입니다 -f
. 다른 한편으로, 더 안전한 방법 sed
은 텍스트 데이터와 함께 작동하도록 설계된 대신 이진 데이터와 함께 작동하도록 설계된 도구를 사용하는 것입니다 .
hexedit
바이너리 파일을 검사하거나 변경해야 할 때 사용 합니다. strings -t x file | less
편집기로 이동하기 전에 변경하려는 (인쇄 가능한) 문자열의 오프셋을 찾는 데 사용할 수 있습니다 .
\0
을 신중하게 수행해야합니다. is \ 0 Mr Robot "을 입력 한 다음 문자열로 작업을 수행하는 동안 '\ 0'문자는 길이를 실수로 줄이므로 문제가 발생합니다.
NUL
것이 기존에 인접한 끝까지 계속 되도록해야합니다 NUL
.
sed -i 's@longstring@foo@' a.out
어떻습니까? 이것은 전체 바이너리를 7 바이트 작게 만듭니다. 바이너리가 손상되지 않습니까?