-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmkimage2
executable file
·80 lines (66 loc) · 2.1 KB
/
mkimage2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/bin/bash
## hyphop ##
#= mkimage wrapper
#= zero time recalc crc32
## EXAMPLE
# mkimage -C none -A arm -T script -d INPUT OUTPUT && file OUTPUT
#./mkimage2 -C none -A arm -T script -d INPUT OUTPUT && file OUTPUT
[ "$1" = "-t" ] && {
echo "[i] TEST">&2
T=/tmp/mkimage2.test
printf "1234" > $T
$0 -C none -A arm -T script -d $T $T.out && \
file $T.out || grep 0xFA265D13 && echo "[i] OK"
rm $T $T.out
exit 0
}
OUT=
for v in $@; do
OUT=$v
done
echo "[i] MKIMAGE OUT: $OUT">&2
mkimage $@ || exit 1
## replace crc32 and time
dd if=/dev/zero bs=4 seek=1 count=2 conv=fsync,notrunc of=$OUT 2>/dev/null
#
[ "$V" ] && {
## gzip + HEXDUMP + bash (or busybox ash )
CRC=$(dd if=$OUT bs=64 count=1 2>/dev/null | gzip -1 -c | tail -c8 | hexdump -n4 -e '"%X"')
h1=${CRC:6:2}
h2=${CRC:4:2}
h3=${CRC:2:2}
h4=${CRC:0:2}
#echo "[i] MKIMAGE CRC $CRC == $h1$h2$h3$h4">&2
printf "%b" "\x$h4\x$h3\x$h2\x$h1" | dd bs=4 seek=1 count=1 conv=fsync,notrunc of=$OUT 2>/dev/null
}
[ "$V" ] || {
## gzip + dd only
T=/tmp/crc32.bin
dd if=$OUT bs=64 count=1 2>/dev/null | \
gzip -1 -c | tail -c8 | head -c4 > $T
# echo "[i] crc32 $(hexdump -n4 -e '"%X"' $T)"
(
dd if=$T bs=1 skip=3 count=1 2>/dev/null
dd if=$T bs=1 skip=2 count=1 2>/dev/null
dd if=$T bs=1 skip=1 count=1 2>/dev/null
dd if=$T bs=1 skip=0 count=1 2>/dev/null
) > $T.rev
dd bs=4 seek=1 count=1 conv=fsync,notrunc of=$OUT 2>/dev/null < $T.rev
rm $T $T.rev
}
exit 0
#64=32+32 - HEADER SIZE for CRC32
#typedef struct image_header {
# uint32_t ih_magic; /* Image Header Magic Number */
# uint32_t ih_hcrc; /* Image Header CRC Checksum */
# uint32_t ih_time; /* Image Creation Timestamp */
# uint32_t ih_size; /* Image Data Size */
# uint32_t ih_load; /* Data Load Address */
# uint32_t ih_ep; /* Entry Point Address */
# uint32_t ih_dcrc; /* Image Data CRC Checksum */
# uint8_t ih_os; /* Operating System */
# uint8_t ih_arch; /* CPU architecture */
# uint8_t ih_type; /* Image Type */
# uint8_t ih_comp; /* Compression Type */
# uint8_t ih_name[IH_NMLEN]; /* Image Name */
#} image_header_t;