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개로 줄었습니다.