다른 바이너리 내에 있는 바이너리를 제자리에서 교체할 수 있습니까? 예를 들어, 압축된 펌웨어.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
그렇다면머리글체크섬의 다양한 부분이 포함되어 있으므로 체크섬도 계산하고 업데이트해야 합니다.