바이너리 파일에서 2바이트를 찾아 값을 늘리고 Bash를 사용하여 바꾸는 방법은 무엇입니까?

바이너리 파일에서 2바이트를 찾아 값을 늘리고 Bash를 사용하여 바꾸는 방법은 무엇입니까?

저는 이진 파일에서 2바이트를 찾은 다음 해당 2바이트의 값을 증가시켜 파일에서 바꾸려고 합니다. 이 2바이트는 0x82-0x83 위치에 있습니다. 현재 다음 명령을 사용하여 이 두 바이트를 성공적으로 추출했습니다.

#!/usr/bin/env bash
BYTES=$(tail -c +131 "$1" | head -c 2)

이러한 바이트의 값은 입니다 1B 1F. 나는 붙어있다 :

  1. 바이트를 정수로 변환하는 방법은 무엇입니까? 6943십진수 여야 합니다 .
  2. 파일에 바이너리 데이터를 추가/에코하는 방법
  3. 0x82-0x83 위치의 파일 내에 증분 바이트를 쓰는 방법. 이것을 사용할 수 있지만 head -c 130 original.bin >> new_file.bin && magic_command_writing_bytes_to_file >> new_file.bin && tail -c +133 original.bin더 좋은 방법이 있을 것입니다.

PHP에서 이 작업을 수행할 수 있으며 더 쉬울 것입니다. 하지만 Bash에서 수행하는 방법에 관심이 있습니다.

답변1

테스트에 이 파일을 사용하십시오.

$ echo hello world > test.txt
$ echo -n $'\x1b\x1f' >> test.txt
$ echo whatever >> test.txt
$ hexdump -C test.txt 
00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 1b 1f 77 68  |hello world...wh|
00000010  61 74 65 76 65 72 0a                              |atever.|
$ grep -a -b --only-matching $'\x1b\x1f' test.txt 
12:

따라서 이 경우에는 1B 1F.12

  • 정수로 변환(더 쉬운 방법이 있을 수 있음)

    $ echo 'ibase=16; '`xxd -u -ps -l 2 -s 12 test.txt`  | bc
    6943
    
  • 그 반대:

    $ printf '%04X' 6943 | xxd -r -ps | hexdump -C
    00000000  1b 1f                                             |..|
    $ printf '%04X' 4242 | xxd -r -ps | hexdump -C
    00000000  10 92                                             |..|
    
  • 파일에 다시 넣으십시오.

    $ printf '%04X' 4242 | xxd -r -ps | dd of=test.txt bs=1 count=2 seek=12 conv=notrunc
    2+0 records in
    2+0 records out
    2 bytes (2 B) copied, 5.0241e-05 s, 39.8 kB/s
    
  • 결과:

    $ hexdump -C test.txt
    00000000  68 65 6c 6c 6f 20 77 6f  72 6c 64 0a 10 92 77 68  |hello world...wh|
    00000010  61 74 65 76 65 72 0a                              |atever.|
    

답변2

아 미안. 귀하의 파일에 ASCII로 작성된 16진수 값이 있다고 생각하기 때문에 이 답변은 오래되었습니다.


16진수를 10진수로 변환하면 됩니다 printf "%d" 0x1B1F.

변수에 바이트를 저장한 경우 BYTES=1B1F결과를 얻게 됩니다 printf "%d" 0x$BYTES.

그래서 양을 늘리고 싶다면

$ echo $(($(printf "%d" 0x$BYTES) +1))
6944

그런 다음 다시 변환하세요.

printf '%X' $(($(printf "%d" 0x$BYTES) +1))
1B20

관련 정보