바이너리 파일의 잘 알려진 위치에 있는 바이트를 특정 값으로 변경해야 하며 명령줄 도구를 사용하여 이를 달성할 수 있는 방법을 찾고 있습니다.
제한 요인:
- 바이트를 변경해야 합니다.
- 파일의 바이트 위치를 알고 있습니다.
- 내가 원하는 값을 바이트 단위로 알고 있습니다. 0x01~0x19 범위의 인쇄할 수 없는 문자를 포함하여 무엇이든 될 수 있습니다.
- 새 값은 이전 값에 의존하지 않으므로 이전 값을 검색할 필요가 없습니다.
파일의 9번째 바이트를 0으로 만들려면
dd if=/dev/zero of=/the/file bs=1 seek=8 count=1 conv=notrunc
파일에서 0이 아닌 다른 내용을 원할 경우 정확한 비트 값이 포함된 콘텐츠를 다음과 같이 파이프해 봅니다 dd
.
spit-out-bytes | dd of=/the/file bs=1 seek=8 count=1 conv=notrunc
나는 그것을 무엇에 사용할 것인가 spit-out-bytes
?
답변1
첫째, 귀하의 예가 잘못되었습니다. 9번째 바이트 대신 첫 번째 바이트를 덮어씁니다( 입력 seek
이 아닌 출력을 원함 skip
). 또한 (방지를 위해) 블록 장치가 아닌 일반 파일인 경우 conv=notrunc
파일을 1바이트로 자릅니다 .
dd bs=1 seek=8 count=1 conv=notrunc if=/dev/zero of=somefile
모든 dd 명령을 실행하기 전에 세 번 확인하십시오.
나는 그것을 무엇에 사용할 것인가
spit-out-bytes
?
echo나 printf를 시도해 볼 수 있습니다.
$ echo -n -e '\x00\x88\xaa\xff' | hexdump -C
00000000 00 88 aa ff |....|
00000004
$ printf '\x00\x88\xaa\xff' | hexdump -C
00000000 00 88 aa ff |....|
00000004
count=1
그런데 기술적으로 소스 크기가 1바이트에 불과하다고 확신하는 경우 dd 명령을 건너뛸 수 있습니다 . 그러나 만일을 대비해 임시방편으로 보관하는 것이 좋습니다. 출력에 추가 바이트를 포함하는 것은 쉽습니다(예: echo
줄 바꿈이 추가되는 경우가 많습니다).