dd와 약간의 충돌이 있습니까?

dd와 약간의 충돌이 있습니까?

바이너리 파일의 잘 알려진 위치에 있는 바이트를 특정 값으로 변경해야 하며 명령줄 도구를 사용하여 이를 달성할 수 있는 방법을 찾고 있습니다.

제한 요인:

  • 바이트를 변경해야 합니다.
  • 파일의 바이트 위치를 알고 있습니다.
  • 내가 원하는 값을 바이트 단위로 알고 있습니다. 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줄 바꿈이 추가되는 경우가 많습니다).

관련 정보