xxd 를 이용한 grep command 만들기
본문 바로가기
Linux/Shell Script

xxd 를 이용한 grep command 만들기

by bsp-martin 2021. 12. 24.

 

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

댓글