jhexdump

   jhexdump

  사용법


	jhexdump [-A|-H][-s n [-0]][-d][-w n][-l n][-b n][-o outfile] [file]
	jhexdump -N [-a [-d]][-c n] [-o output] [file]
	jhexdump -C [-o outfile] [-w n] [-z] [file]
	jhexdump -D array_name [-o outfile] [-w n] [-z][-x] [file]
	jhexdump -R array_file -o outfile
	jhexdump -V

	Options are as follows:

	-0              use a relative location for -s option
	-a              print localtion with -N option
	-A              print Ascii data only
	-b n            byte break; add Newline after n bytes
	-c n            print string which is greater than or equal to length of n chars with -N option; def: 4
	-C              Code preprocess, code to unsigned char[]: #INCCODE variable filename or #STARTCODE variable  ... #ENDCODE
	-d              print location in decimal format
	-D arrary_name  print C style array initialization data
	-H              print hex data only
	-l n            number of lines to print; def: all
	-N              print printable string with newline
	-o outfile      output file
	-R array_file   file which has char array structure generated by -D option
	-s n            skip data: def: 0 byte
	-V              show version
	-w n            width; def: 16
	-x              trim leading whitespace and ending whitespace and CR/NL
	-z              add 0x00 at the end of char array for making NULL-terminated string

	file            if file is omitted, the standard input is used
  설명

jhexdump 명령어는 지정한 파일에 대해 다음과 같이 그 내용을 16 진수와 문자로 화면에 보여준다.
(V10.2 부터 2 GB 가 넘는 파일을 처리할 수 있다.)

# jhexdump /usr/bin/ps
00000000   7f 45 4c 46 01 02 01 00  00 00 00 00 00 00 00 00   .ELF............
00000010   00 02 00 02 00 00 00 01  00 01 08 f4 00 00 00 34   ...............4
00000020   00 00 11 20 00 00 00 00  00 34 00 20 00 06 00 28   ... .....4. ...(
00000030   00 1a 00 19 00 00 00 06  00 00 00 34 00 01 00 34   ...........4...4
00000040   00 00 00 00 00 00 00 c0  00 00 00 c0 00 00 00 05   ................
00000050   00 00 00 00 00 00 00 03  00 00 00 f4 00 00 00 00   ................
00000060   00 00 00 00 00 00 00 11  00 00 00 00 00 00 00 04   ................
00000070   00 00 00 00 00 00 00 01  00 00 00 00 00 01 00 00   ................
00000080   00 00 00 00 00 00 0d d8  00 00 0d d8 00 00 00 05   ................
00000090   00 01 00 00 00 00 00 01  00 00 0d d8 00 02 0d d8   ................
000000a0   00 00 00 00 00 00 02 30  00 00 03 78 00 00 00 07   .......0...x....
000000b0   00 01 00 00 00 00 00 02  00 00 0e e8 00 02 0e e8   ................
000000c0   00 00 00 00 00 00 00 b8  00 00 00 00 00 00 00 07   ................
000000d0   00 00 00 00 6f ff ff fb  00 00 00 00 00 00 00 00   ....o...........
000000e0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 06   ................
... skip ...

jhexdump는 디폴트로 한줄에 16 바이트의 데이타를 바이트 별로 왼쪽에는 16진수로 오른쪽에는 문자로 표시한다. 출력가능한 코드(printable code)가 아닌 것은 .(dot)로 표시한다. (멀티바이트 문자는 .(dot)으로 표시된다.) 16진수로 표시할 때, 8 바이트마다 2개의 스페이스를 둔다. 파일명을 지정하지 않으면 표준입력에서 데이타를 읽는다.

-w 옵션을 지정하면 한 줄에 몇 개의 바이트를 출력할 지를 지정한다.

# jhexdump -w 10 /usr/bin/ps
00000000   7f 45 4c 46 01 02 01 00  00 00   .ELF......
0000000a   00 00 00 00 00 00 00 02  00 02   ..........
00000014   00 00 00 01 00 01 08 f4  00 00   ..........
0000001e   00 34 00 00 11 20 00 00  00 00   .4... ....
00000028   00 34 00 20 00 06 00 28  00 1a   .4. ...(..
00000032   00 19 00 00 00 06 00 00  00 34   .........4
0000003c   00 01 00 34 00 00 00 00  00 00   ...4......
00000046   00 c0 00 00 00 c0 00 00  00 05   ..........
00000050   00 00 00 00 00 00 00 03  00 00   ..........
0000005a   00 f4 00 00 00 00 00 00  00 00   ..........
00000064   00 00 00 11 00 00 00 00  00 00   ..........
0000006e   00 04 00 00 00 00 00 00  00 01   ..........
00000078   00 00 00 00 00 01 00 00  00 00   ..........
00000082   00 00 00 00 0d d8 00 00  0d d8   ..........
0000008c   00 00 00 05 00 01 00 00  00 00   ..........
00000096   00 01 00 00 0d d8 00 02  0d d8   ..........
000000a0   00 00 00 00 00 00 02 30  00 00   .......0..
000000aa   03 78 00 00 00 07 00 01  00 00   .x........
... skip ...

-b 옵션을 사용하면 지정한 바이트 단위로 NEWLINE 을 추가할 수 있다. 다음은 20 바이트 단위로 NEWLINE 을 추가하는 예제이다.

# jhexdump -b 20 /usr/bin/ps
00000000   7f 45 4c 46 01 02 01 00  00 00 00 00 00 00 00 00   .ELF............
00000010   00 02 00 02                                        ....

00000014   00 00 00 01 00 01 08 f4  00 00 00 34 00 00 11 20   ...........4...
00000024   00 00 00 00                                        ....

00000028   00 34 00 20 00 06 00 28  00 1a 00 19 00 00 00 06   .4. ...(........
00000038   00 00 00 34                                        ...4

0000003c   00 01 00 34 00 00 00 00  00 00 00 c0 00 00 00 c0   ...4............
0000004c   00 00 00 05                                        ....

00000050   00 00 00 00 00 00 00 03  00 00 00 f4 00 00 00 00   ................
00000060   00 00 00 00                                        ....

00000064   00 00 00 11 00 00 00 00  00 00 00 04 00 00 00 00   ................
00000074   00 00 00 01                                        ....

00000078   00 00 00 00 00 01 00 00  00 00 00 00 00 00 0d d8   ................
00000088   00 00 0d d8                                        ....

... skip ...

다음은 jhexdump 명령어의 옵션이다.

옵션설명
-0
-s
-0 (zero) 옵션은 -s 옵션과 함께 사용된다.
-s옵션을 사용하여 데이타의 일부분을 스킵할 수 있다. 예를 들어, -s 1000을 지정하면 1000 바이트를 스킵한 후에 그 다음 데이타 부터 화면에 출력한다. 이때 시작하는 주소가 1000 부터 시작한다.
그런데, -0을 지정하면 주소를 0 부터 시작한다.
-a -a 옵션을 -N 옵션과 함께 지정하면, 각 출력 라인 앞에 offset 주소를 표시한다.
-A -A 옵션을 지정하면, ASCII 코드 부분만 출력한다.
-b n -b 옵션을 지정하면 지정한 바이트 단위로 NEWLINE 을 추가한다.
-c n -c 옵션은 -N 옵션과 함께 사용되며, printable한 아스키 코드가 -c 옵션에 지정한 개수 이상이어야 그 문자열을 출력한다. (디폴트는 4 )
-C -C 옵션을 지정하면, 입력 파일을 읽어서 입력 파일의 내용을 출력하면서 다음과 같은 키워드 처리한다.
	#INCCODE variable filename


	#STARTCODE variable
	... data ...
	#ENDCODE
위에 있는 키워드는 줄의 맨앞에 있어야 동작합니다.

'#INCCODE' 키워드를 만나면, 그 다음 단어를 unsigned char 배열의 이름으로 사용하여, filename의 파일을 읽어서 16진수 unsigned char 배열로 초기화한다.

'#STARTCODE variable' 라인과 '#ENDCODE' 라인 사이에 있는 줄을 모두 16진수 unsigned char 배열로 초기화한다.

다음은 test.c 파일의 내용이다. 이 파일을 jhexdump -C test.c 명령어를 사용하여 가공한 결과가 아래에 있다.

#include 

int write_mydata();
int write_data_group();

int main( int argc, char *argv[] ) {
        write_data_group();
        write_mydata();
}

int write_data_group() {
#INCCODE group /etc/group
        printf("%s", group);
}

int write_mydata() {
#STARTCODE sum_code
function sum(int n)
{
        int     i;
        int     sum = 0;

        for(i = 1; j <= n; i++) sum += i;
}
#ENDCODE

        printf("%s", sum_code);
}

# jhexdump -C test.c
#include 

int write_mydata();
int write_data_group();
int main( int argc, char *argv[] )
{
write_data_group();
write_mydata();
}

int write_data_group()
{
unsigned char group[] = {
        0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x3a, 0x30, 0x3a, 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x3a, 0x3a,
        0x31, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x62, 0x69, 0x6e, 0x3a, 0x3a, 0x32, 0x3a, 0x72, 0x6f,
        0x6f, 0x74, 0x2c, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x0a, 0x73, 0x79, 0x73, 0x3a, 0x3a, 0x33,
        0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x62, 0x69, 0x6e, 0x2c, 0x61, 0x64, 0x6d, 0x0a, 0x61, 0x64,
        0x6d, 0x3a, 0x3a, 0x34, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e,
        0x0a, 0x75, 0x75, 0x63, 0x70, 0x3a, 0x3a, 0x35, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x6d, 0x61,
        0x69, 0x6c, 0x3a, 0x3a, 0x36, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x74, 0x74, 0x79, 0x3a, 0x3a,
        0x37, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x61, 0x64, 0x6d, 0x0a, 0x6c, 0x70, 0x3a, 0x3a, 0x38,
        0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x61, 0x64, 0x6d, 0x0a, 0x6e, 0x75, 0x75, 0x63, 0x70, 0x3a,
        0x3a, 0x39, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x0a, 0x73, 0x74, 0x61, 0x66, 0x66, 0x3a, 0x3a, 0x31,
        0x30, 0x3a, 0x0a, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x3a, 0x3a, 0x31, 0x32, 0x3a, 0x72, 0x6f,
        0x6f, 0x74, 0x0a, 0x73, 0x79, 0x73, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x3a, 0x3a, 0x31, 0x34, 0x3a,
        0x0a, 0x73, 0x6d, 0x6d, 0x73, 0x70, 0x3a, 0x3a, 0x32, 0x35, 0x3a, 0x0a, 0x67, 0x64, 0x6d, 0x3a,
        0x3a, 0x35, 0x30, 0x3a, 0x0a, 0x77, 0x65, 0x62, 0x73, 0x65, 0x72, 0x76, 0x64, 0x3a, 0x3a, 0x38,
        0x30, 0x3a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x3a, 0x3a, 0x39, 0x30, 0x3a,
        0x0a, 0x75, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x3a, 0x3a, 0x39, 0x36, 0x3a, 0x0a, 0x6e, 0x6f,
        0x62, 0x6f, 0x64, 0x79, 0x3a, 0x3a, 0x36, 0x30, 0x30, 0x30, 0x31, 0x3a, 0x0a, 0x6e, 0x6f, 0x61,
        0x63, 0x63, 0x65, 0x73, 0x73, 0x3a, 0x3a, 0x36, 0x30, 0x30, 0x30, 0x32, 0x3a, 0x0a, 0x6e, 0x6f,
        0x67, 0x72, 0x6f, 0x75, 0x70, 0x3a, 0x3a, 0x36, 0x35, 0x35, 0x33, 0x34, 0x3a, 0x0a, 0x76, 0x62,
        0x6f, 0x78, 0x73, 0x66, 0x3a, 0x3a, 0x31, 0x30, 0x30, 0x3a, 0x0a, 0x00
        };
        printf("%s", group);
}

int write_mydata()
{
unsigned char sum_code[] = {
        0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x75, 0x6d, 0x28, 0x69, 0x6e, 0x74,
        0x20, 0x6e, 0x29, 0x0a, 0x7b, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x09, 0x69, 0x3b, 0x0a, 0x09, 0x69,
        0x6e, 0x74, 0x09, 0x73, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x0a, 0x0a, 0x09, 0x66, 0x6f,
        0x72, 0x28, 0x69, 0x20, 0x3d, 0x20, 0x31, 0x3b, 0x20, 0x6a, 0x20, 0x3c, 0x3d, 0x20, 0x6e, 0x3b,
        0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x73, 0x75, 0x6d, 0x20, 0x2b, 0x3d, 0x20, 0x69, 0x3b, 0x0a,
        0x7d, 0x0a, 0x00
        };

        printf("%s", sum_code);
}

-d -d 옵션을 지정하면 왼쪽의 주소 부분을 십진수로 표시한다.
-D array_name -D 옵션을 사용하면, 바이너리 데이타를 C 프로그램에서 사용할 수 있도록 unsigned char 배열 형태로 초기화하는 C 코드를 만들어 준다.

# jhexdump -w 10 -D data datafile
unsigned char data[] = {
        0x72, 0x6f, 0x6f, 0x74, 0x3a, 0x3a, 0x30, 0x3a, 0x72, 0x6f,
        0x6f, 0x74, 0x0a, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x3a, 0x3a,
        0x31, 0x3a, 0x0a, 0x62, 0x69, 0x6e, 0x3a, 0x3a, 0x32, 0x3a,
        0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x62, 0x69, 0x6e, 0x2c, 0x64,
        0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x0a, 0x73, 0x79, 0x73, 0x3a,
        0x3a, 0x33, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x2c, 0x62, 0x69,
        0x6e, 0x2c, 0x73, 0x79, 0x73, 0x2c, 0x61, 0x64, 0x6d, 0x0a,
        0x61, 0x64, 0x6d, 0x3a, 0x3a, 0x34, 0x3a, 0x72, 0x6f, 0x6f,
        0x74, 0x2c, 0x61, 0x64, 0x6d, 0x2c, 0x64, 0x61, 0x65, 0x6d,
        0x2c, 0x6c, 0x70, 0x2c, 0x61, 0x64, 0x6d, 0x0a, 0x6e, 0x75,
	};

-R array_file -o outfile -D 옵션을 사용하여 생성된 파일을 -R 옵션을 사용하여 원본 파일로 복원할 수 있다.

# jhexdump -w 10 -D icon icon.gif > icon.h
# jhexdump -R icon.h -o icon.gif2

위에서 icon.gif와 icon.gif2 두 개의 파일은 동일한 내용을 가지고 있다.

-H -H 옵션을 지정하면 16 진수 부분만 출력한다.
-l n -l 옵션을 지정하면 지정한 숫자 만큼의 라인만 출력하고 프로세스를 종료한다.
-b옵션을 지정하면, -b션에 지정한 바이트 수를 한 라인으로 간주한다.
-N -N 옵션을 지정하면, 입력파일에서 디폴트로 문자열은 4개 이상 연속된 printable 문자들을 출력한다.
문자열의 개수는 -c 옵션으로 지정할 수 있다.

# jhexdump -N /bin/ksh
/usr/lib/ld.so.1
e_Done
secpolicy_init
p_flush
stakalloc
mac_trim
ismetach
b_times
io_seek
emacs_read
isatty
sh_wctomb
arg_new
... skip ...

-a 옵션을 지정하면 각 라인 앞에 해당 파일의 offset를 hex 값으로 표시한다.
-d 옵션을 함께 지정하면 offset을 10진수로 표시한다.

-o outfile -o outfile 옵션을 지정하면, 결과물을 지정한 파일로 저장한다.
-V -V 옵션을 지정하면, 명령어의 버전 정보를 보여준다.
-w n -w 옵션을 사용하여 한 줄에 몇 바이트의 데이타를 출력할지 지정한다.
-x -D 옵션에 -x 옵션을 함께 사용하면, 각 입력 라인에서 whilespace로 시작하는 문자와 끝에서 whilespace와 CR/NL 문자를 제거한다.
-z -D 옵션에 -z 옵션을 함께 사용하면, char 배열의 마지막에 0 (zero) 를 추가한다.