bash를 사용하여 바이트를 수정하면 dd가 작동하지 않습니다.

bash를 사용하여 바이트를 수정하면 dd가 작동하지 않습니다.

Bash를 사용하여 바이트를 수정하려고 합니다.

따라서 오프셋 앞의 바이트, 수정하려는 바이트, 파일의 나머지 부분을 기록하겠습니다.

하지만 다음 스크립트가 예상대로 작동하지 않습니다.

누구든지 좀 봐주실 수 있나요? 어느 부분이 잘못됐는지 알 수 없다

#!/bin/bash

file=/etc/passwd
out=passwd.mod
offset=0x5

dd if="$file" of="$out" conv=notrunc bs=1 count=$(($offset - 1))
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))
dd if="$file" of="$out" conv=notrunc bs=1 skip=$(($offset + 1))

답변1

제가 올바르게 이해했다면 이것이 귀하에게 도움이 될 것이라고 믿습니다.

#!/bin/bash

file=passwd.orig
out=passwd.mod
offset=0x5

dd if="$file" of="$out" conv=notrunc bs=1 count=$(($offset))
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))
dd if="$file" of="$out" conv=notrunc bs=1 seek=$((offset+1)) skip=$(($offset + 1))

seek"쓰기 헤더"를 올바른 위치에 배치하고 skip해당 바이트가 출력에 (다시) 기록되는 것을 방지해야 합니다 .


더 나은 것

1바이트만 변경(대체)하면 간단한(및 POSIX) 명령과 마찬가지로 파일 복사본에서 직접 수행할 수 있습니다.

#!/bin/sh

file=passwd.orig      out=passwd.mod         offset=0x05

cp "$file" "$out"
printf '\x41' | dd of="$out" conv=notrunc bs=1 seek=$(($offset))

바이트를 "삽입"하려면 위의 명령이 필요하지만 오프셋이 일부 변경됩니다. 이것이 필요한지 물어보십시오.

답변2

seek마지막 명령에서 이것을 놓쳤습니다 :

dd if="$file" of="$out"  \
  conv=notrunc           \
  bs=1                   \
  skip="$((offset + 1))" \
  seek="$((offset + 1))"

skip=n복사하기 전에 입력 파일에서 n개의 입력 블록을 건너뛰고, seek=n복사하기 전에 출력 파일에서 n개의 입력 블록을 건너뜁니다. 오프셋을 올바르게 작성하려면 둘 다 필요합니다.

답변3

두 가지 질문:

1) dd if="$file" of="$out"덮는 것 같다$아웃어느 시점에서.
2) 이 점을 고려하더라도,개수 =,건너뛰기 =, &추구 =논리 어딘가에 바이트가 누락되었습니다.

대신 다음과 같이 시도해 보세요.

file=/etc/passwd
out=passwd.mod
offset=0x5

dd if="$file" of="$out" conv=notrunc bs=1 count=$offset
printf '\x41' >> $out
dd if="$file"  conv=notrunc bs=1 skip=$(($offset + 1)) >> $out

조정$오프셋필요에 따라 주고 받으십시오. 이전에는 이것이 단지 내 추측이었기 때문에 1개로 줄었습니다.

관련 정보