XXD 는 어떤 유틸일까?
Hexdump Util 에 익숙하다면 XXD 역시 비슷한것을 알수있다.
아래는 hexdump 를 이용하여 바이너리의 구성요소를 hex 값으로 확인이 가능하다.
bm@VMI:~/prj/uboot/u-boot-2011.09$ hexdump -C u-boot.bin | more
00000000 3e 01 00 ea 75 62 6f 6f 74 00 00 00 39 6c 0a 5f |>...uboot...9l._|
00000010 00 40 00 00 00 00 00 00 00 00 00 00 31 2e 31 2e |.@..........1.1.|
00000020 30 00 00 00 31 2e 30 2e 30 00 00 00 00 00 90 40 |0...1.0.0......@|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
xxd 와 hexdump 차이점은 무엇일까?
아래는 hexdump 의 커널 vmlinux 에 대해 데이터를 얻어보았다.
hexdump -C vmlinux | more
가장 왼쪽은 행의 숫자인데...
빨강색 영역을 보면 00 00 00 00 부터 시작하는 부분을 건너뛰는 모습이다.
같은 파일에 대해 xxd로 수행해 보겠다.
xxd vmlinux | more
위처럼 0000 부분은 스킵함이 없음을 보여준다.
정리하면 처음 위치의 바이너리에 데이터가 존재하고 중간지점부터 유효한 데이터가 존재한다면
hexdump 는 0x00 인 부분을 모두 스킵한다. (우리가 보기 쉽게 나옴)
grep 을 사용하다보면 xxd 나 hexdump 등 바이너리 파일의 grep 에 대해서도 잘되었으면 하는 바램이 있다.
이번에 소개하는 스크립트는 xxgrep 이다.
#!/bin/bash
APP_NAME=$0
ARG1=$1
LIST=
CMD="find -type f"
PATTERN=
LEN_PATTERN=
MAX_LEN=56
do_fxgrep_help() {
echo "USAGE: $0 sequential hex num"
echo ""
echo ""
echo " ex) $ $0 $@"
exit
}
### MAIN START
##{
if [ $# -lt 1 ]; then
do_fxgrep_help
fi
LIST=`find -type f`
if [ "$LIST[@]" = "" ]; then
echo "can't find any..."
do_fxgrep_help
fi
PATTERN=`echo $@ | sed 's/ //g'`
#echo "$@"
echo "start search fils: "
echo "${LIST[@]}"
echo ""
LEN_PATTERN=`echo $PATTERN | wc -L`
if [ $LEN_PATTERN -gt $MAX_LEN ]; then
echo "Pattern over size MAX_LEN(${MAX_LEN}), cut...(0x`echo $PATTERN | cut -c$(expr $MAX_LEN + 1)-`)"
PATTERN=`echo $PATTERN | cut -c1-${MAX_LEN}`
fi
echo "Pattern: $PATTERN"
echo ""
for one_from_list in $LIST
do
#echo "xxd -p $one_from_list | grep -c $1 > /dev/null"
xxd -p $one_from_list | grep -c $PATTERN > /dev/null
if [ $? = 0 ]; then
echo "FOUND: $one_from_list"
xxd -p $one_from_list | grep --color=auto -n $PATTERN
# else
# echo "NOTFOUND: $one_from_list"
fi
done
##}
### MAIN END
사용방법
bm@VMI:~/bin$ xxgrep
USAGE: /home/bm/bin/xxgrep sequential hex num
ex) $ /home/bm/bin/xxgrep
xxgrep 은 파일을 binary 형식으로 보게된다.
예를들어
hexdump 와 xxd 를 이요한 u-boot.bin 파일 내용을 보면
bm@VMI:~/prj/uboot/u-boot-2011.09$ hexdump -C u-boot.bin | more
00000000 3e 01 00 ea 75 62 6f 6f 74 00 00 00 39 6c 0a 5f |>...uboot...9l._|
00000010 00 40 00 00 00 00 00 00 00 00 00 00 31 2e 31 2e |.@..........1.1.|
00000020 30 00 00 00 31 2e 30 2e 30 00 00 00 00 00 90 40 |0...1.0.0......@|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
bm@VMI:~/prj/uboot/u-boot-2011.09$ xxd u-boot.bin | more
00000000: 3e01 00ea 7562 6f6f 7400 0000 396c 0a5f >...uboot...9l._
00000010: 0040 0000 0000 0000 0000 0000 312e 312e .@..........1.1.
00000020: 3000 0000 312e 302e 3000 0000 0000 9040 0...1.0.0......@
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
위와 같다.
xxgrep 은 xxd 에서 예를 들면 3e01 00ea 부분 을 grep 하고 싶을때 사용한다.
bm@VMI:~/prj/xxgrep$ xxgrep 3e0100ea
결과는 다음과 같이 출력된다.
start search fils:
./u-boot.bin
Pattern: 3e0100ea
FOUND: ./u-boot.bin
1:3e0100ea75626f6f74000000396c0a5f004000000000000000000000312e
bm@VMI:~/prj/xxgrep$
결과 파일: ./u-boot.bin
패턴: 3e0100ea 을포함한 다음을 출력함
1:3e0100ea75626f6f74000000396c0a5f004000000000000000000000312e
<1은 라인>:<HEX>
사용방법이 간단하기때문에 많은 활용을 했으면 한다.
단점으로는 현재 폴더 아래에 대해서 무조건 수행되는데, 바이너리 파일이 아닌 일반 파일역시 검사함으로 인해
큰 프로젝트에서는 결과도출에 상대적으로 많은 시간이 소요된다.
이는 검색하려는 목적이 될 파일을 명시해주는 부분이 부족하다.
이를 보강하는 스크립트를 마련하여 다시 사용할수있도록 생각해볼 예정이다.
여러분은 실력향상을 위해
스크립트를 개선 또는 보강할수있으면 직접 수정해 보기를 권장한다.
'Linux > Shell Script' 카테고리의 다른 글
Swap script (0) | 2021.12.24 |
---|---|
find grep 스크립트 ffgrep (0) | 2021.12.24 |
댓글