실행 가능한 바이너리가 있습니다. 그것을 호출하자 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
이것은 안전한 것 같습니다. 문자열의 길이가 동일하지 않은 경우에도 작동합니까?
답변
나는 당신의 버전 sed
이 바이너리 클린인지 또는 입력에서 실제로 긴 줄이라고 생각하는 것을 질식 시킬지 모르겠지만, 그러한 문제를 피하고, 문자열을 제자리에서 편집하면 효과가 있습니다. 그것이 있는지 여부를 확인하려면 이전 버전과 새 버전을와 비교하십시오 cmp -l
. 두 파일 간의 유일한 세 가지 차이점이 3 바이트인지 여부를 알려 주어야합니다.
컴파일 된 실행 파일에서 문자열을 편집하면 문자열의 길이가 같은 경우 실제로 작동하지만 C에서 문자열이 작동하는 방식으로 인해 문자열을 줄이면 거의 항상 작동합니다. C 문자열에서는 NUL
종료 후 모든 것 계산하지 않으므로 NUL
이전 종결 자보다 먼저 새로운 종결자를 쓰면 효과적으로 줄을 줄일 수 있습니다.
일반적으로이 핵을 사용하여 문자열을 늘릴 수있는 방법은 없습니다.