하나의 바이너리 파일을 다른 바이너리 파일로 교체

하나의 바이너리 파일을 다른 바이너리 파일로 교체

다른 바이너리 내에 있는 바이너리를 제자리에서 교체할 수 있습니까? 예를 들어, 압축된 펌웨어.bin 파일에는 다음이 포함됩니다.

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
392           0x188           uImage header, header size: 64 bytes, header CRC: 0x15075729, created: 1969-12-31 23:59:59, image size: 1572736 bytes, Data Address: 0x20008000, Entry Point: 0x20008000, data CRC: 0x1DCD72E0, OS: Linux, CPU: ARM, image type: OS Kernel Image, compression type: none, image name: "abcd_rom_bin"
13596         0x351C          gzip compressed data, maximum compression, from Unix, last modified: 2017-08-02 06:04:47
1573192       0x180148        uImage header, header size: 64 bytes, header CRC: 0x6FFB9B98, created: 1969-12-31 23:59:59, image size: 8376320 bytes, Data Address: 0x0, Entry Point: 0x0, data CRC: 0xC95886CF, OS: Linux, CPU: ARM, image type: Filesystem Image, compression type: none, image name: "abcd_rom_bin"
1573256       0x180188        Squashfs filesystem, little endian, non-standard signature, version 3.1, size: 8372772 bytes, 1028 inodes, blocksize: 131072 bytes, created: 2017-08-02 06:39:51

이 바이너리 중 하나에는 busybox 바이너리도 포함되어 있습니다. 완전히 압축을 풀지 않고 교체할 수 있는 방법이 있습니까?

답변1

file.gz오프셋 13596에 무언가를 쓰고 싶다면 firmware.bin(이미 존재하는 것을 덮어쓰는 것) 다음과 같이 할 수 있습니다:

zsh:

zmodload zsh/system
{ sysseek -u1 13596 && cat; } < file.gz 1<> firmware.bin

ksh93:

cat < file.gz 1<> firmware.bin >#((13596))

dd, 모든 쉘, 그러나 한 번에 1바이트씩 읽고 씁니다.

dd conv=notrunc bs=1 seek=13596 if=file.gz of=firmware.bin

GNU dd, 모든 쉘, 더 효율적

dd bs=64k conv=notrunc oflag=seek_bytes seek=13596 if=file.gz of=firmware.bin

또는 1573192 - 13596 길이까지 0으로 채웁니다(산술 확장을 위한 POSIX sh 구문).

dd bs=64k conv=notrunc,sync bs="$((1573192 - 13596))" count=1 \
   oflag=seek_bytes seek=13596 if=file.gz of=firmware.bin

이제 이미 가지고 있는 ped 파일만큼 커야 file.gz합니다 . gzip그렇다면머리글체크섬의 다양한 부분이 포함되어 있으므로 체크섬도 계산하고 업데이트해야 합니다.

관련 정보