실행 바이너리에서 문자열을 언제 편집 할 수 있습니까? 호출하자 a.out. 바이너리에 문자열이

실행 가능한 바이너리가 있습니다. 그것을 호출하자 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이전 종결 자보다 먼저 새로운 종결자를 쓰면 효과적으로 줄을 줄일 수 있습니다.

일반적으로이 핵을 사용하여 문자열을 늘릴 수있는 방법은 없습니다.