실행 가능한 바이너리가 있습니다 a.out
. 바이너리 파일에 문자열이 포함되어 있음을 알 수 있습니다
$ strings a.out
...
/usr/share/foo
....
/usr/share/foo
문자열을 로 변경해야 합니다 /usr/share/bar
. 문자열을 로 바꿀 수 있습니까 sed
? :
sed -i 's@/usr/share/foo@/usr/share/bar@' a.out
이렇게 하는 것이 안전한 것 같습니다. 문자열 길이가 다른 경우에도 작동합니까?
답변1
sed
귀하의 버전이 바이너리 클린인지 또는 입력의 긴 줄로 인해 질식하는지 알 수 없지만 이러한 문제를 제외하고 문자열을 제자리에서 편집하는 것은 괜찮을 것입니다. 이러한 경우인지 확인하려면 이전 버전과 새 버전을 cmp -l
. 두 파일 사이의 유일한 세 가지 차이점이 이 3바이트인지 알려줄 것입니다.
컴파일된 실행 파일에서 문자열을 편집하는 것은 문자열의 길이가 같으면 작동하지만 C에서 문자열이 작동하는 방식으로 인해 문자열을 줄이면 거의 항상 작동합니다. C 문자열에서는 종결자 뒤의 모든 내용은 NUL
계산되지 않으므로 NUL
이전 종결자 위치 앞에 새 종결자를 작성하면 문자열이 효과적으로 단축됩니다.
일반적으로 이 트릭을 사용하여 문자열을 늘릴 수는 없습니다.