이진 파일을 보는 방법?


45

내가 이해 한 바에 따르면 컴파일러는 CPU가 읽을 수있는 1과 0으로 구성된 이진 파일을 만듭니다. 이진 파일이 있지만 거기에있는 1과 0을 보려면 어떻게 열어야합니까? 텍스트 편집기에서 열 수 없습니다.

추신 : 나는 1과 0의 일반 이진 코드이어야하는 어셈블리 컴파일 이진을 가지고 있습니까?


1
이진 파일을 표시하면 ASCII 문자로 표시됩니다.
mazs


no-OP가 "어셈블리 컴파일 된 바이너리"를 지정했습니다. 그것은 질문을 다루지 않습니다. 예를 들어 음악 파일이 아니며 구조가 있습니다. OP가 추가 정보를 제공하지 않으면 구조화되지 않은 도구가 시작됩니다.
토마스 디키

1
내 대답을 참조하십시오. 그리고 바이너리라는 용어는 실제로는 완전히 다른 두 가지 방식으로 사용됩니다. "이진 파일"은 컨텍스트가 순수한 ASCII 텍스트가 아닌 파일을 의미합니다. "이진수"는 이진 형식으로 작성된 숫자를 의미합니다.
Pierre-Olivier Vares 2016 년

@mazs ASCII? 프로그램이 휴리스틱을 통해 그렇게 인코딩 된 것으로 생각되면 UTF-8이 더 가능성이 있거나 일부 코드 페이지가 있다고 생각합니다.
JDługosz

답변:


99

에 따르면 이 대답 하여 타이라니드 :

hexdump -C yourfile.bin 

물론 편집하고 싶지 않다면. 대부분의 Linux 배포판에는 hexdump기본적으로 있지만 모든 것은 아닙니다.


최신 정보

Emilio Bool의 답변 에 따르면 :

xxd 이진수와 16 진수를 모두 수행

빈의 경우 :

xxd -b file

16 진수의 경우 :

xxd file

정말 도움이되었습니다! 감사합니다
Shravya Boggarapu

45

다양한 사람들이 쿼리의 일부 측면에 대답했지만 전부는 아닙니다.

컴퓨터의 모든 파일은 1과 0으로 저장됩니다. 이미지, 텍스트 파일, 음악, 실행 가능한 응용 프로그램, 개체 파일 등

그것들은 모두 0과 1입니다. 유일한 차이점은 그것들을 여는 것에 따라 다르게 해석된다는 것입니다.

를 사용하여 텍스트 파일을 볼 때 cat실행 파일 ( cat이 경우)은 1과 0을 모두 읽고 관련 알파벳이나 언어의 문자로 변환하여 표시합니다.

이미지 뷰어를 사용하여 파일을 볼 때는 파일 형식과 모든 논리를 처리하는 논리에 따라 1과 0을 모두 가져 와서 이미지로 변환합니다.

컴파일 된 이진 파일은 다르지 않으며 1과 0으로 저장됩니다.

arzyfex의 대답은 파일을 다른 방식으로 볼 수있는 도구를 제공하지만 파일을 8 진 또는 16 진수 또는 ASCII로 보는 것처럼 컴퓨터의 모든 파일에 대해 바이너리 작업으로 파일을 읽는 것은 각 의미가 맞지 않을 수 있습니다 그 형식의.

실행 가능한 이진 파일의 기능을 이해하려면 사용 가능한 어셈블러 언어 (시작으로)를 표시하는 방식으로 파일을 봐야합니다.

objdump -d /path/to/binary

디스어셈블러 인 이진 콘텐츠를 가져 와서 어셈블러 (매우 낮은 수준의 프로그래밍 언어)로 다시 변환합니다. objdump이 기본적으로 항상 설치되는 것은 아니므로 Linux 환경에 따라 설치해야 할 수도 있습니다.

외부 독서.

NB : @Wildcard가 지적했듯이 파일에는 문자 1과 0이 포함되어 있지 않으며 (화면에 표시된 것처럼) 실제 숫자 데이터, 개별 정보 비트 (1)가 포함되어 있습니다. 또는 꺼짐 (0). 그 묘사조차도 진실에 불과합니다. 요점은 1과 0을 보여주는 뷰어를 찾으면 여전히 파일의 데이터를 해석하고 0과 1의 ASCII 문자를 표시하는 경우에도 데이터는 이진 형식으로 저장됩니다 ( 위의 이진수 링크를 참조하십시오). Pierre-Olivier의 커뮤니티 위키 항목 이 이에 대해 자세히 설명합니다.


좋은 박람회. 텍스트 줄에 "1"또는 "0"으로 표시되는 문자가 컴퓨터에서 단일 "1"또는 "0"으로 저장 되지 않도록 추가 할 수 있습니다. OP는 그것에 대해 혼란스러워하는 것 같습니다.
와일드 카드

1
"을 사용하여 텍스트 파일을 볼 때 cat실행 파일 ( cat이 경우)은 1과 0을 모두 읽고 관련 알파벳의 문자로 변환하여 표시합니다. 언어." cat그렇게하지 않습니다. 모든 cat것은 "유해한" 옵션을 사용하지 않는 한 표준 출력에 바이트를 쓰는 것 입니다. 터미널 프로그램 (및 / 또는 해당되는 경우 터미널 하드웨어, 즉 펌웨어)은 TTY 드라이버의 도움을 받아 바이트를 문자로 렌더링하는 방법을 결정합니다.
G-Man, '복지국

나는 동의하지 않지만, 어느 시점에서, 모든 간단한 설명은 무너집니다. 문제는 단순히 설명을 멈추기 전에 토끼 구멍이 얼마나 아래로 내려 가느냐입니다.
EightBitTony

14

낮은 수준에서 파일은 0과 1의 시퀀스로 인코딩 됩니다.

그러나 프로그래머조차도 실제로는 거의 가지 않습니다.

먼저 (0과 1 의이 이야기보다 더 중요합니다) 컴퓨터가 조작하는 모든 것이 숫자 로 인코딩된다는 것을 이해해야합니다 .

  • 문자 세트 테이블을 사용하여 문자를 숫자로 코딩합니다. 예를 들어, 문자 'A'는 ASCII를 사용하여 코딩 할 때 65의 값을 갖습니다. 참조 http://www.asciitable.com를

  • 픽셀은 하나 이상의 숫자로 코딩됩니다 (많은 그래픽 형식이 있습니다). 예를 들어 표준 3 색 형식에서 노란색 픽셀은 다음과 같이 인코딩됩니다. 빨간색의 경우 255, 녹색의 경우 255, 녹색의 경우 0입니다. 참조 http://www.quackit.com/css/css_color_codes.cfm을 (색상을 선택하고 R, G & B 세포 참조)

  • 바이너리 실행 파일은 Assembly에 작성됩니다. 각 어셈블리 명령어는 숫자로 코딩됩니다. 예를 들어, 어셈블리 명령어 MOVB $0x61,%al는 두 개의 숫자로 코딩됩니다. 176,97 http://www.sparksandflames.com/files/x86InstructionChart.html 참조 (16 진수 표기법이 사용되므로 각 명령어의 관련 번호는 00에서 FF까지입니다. 아래 참조)

둘째 : 각 숫자는 여러 표현 또는 표기법을 가질 수 있습니다 .

사과가 23 개 있다고하자.

  • 10 개의 사과 그룹을 만들면 10 개의 사과 그룹 2 개와 3 개의 외로운 사과가 나옵니다. 23을 쓸 때 정확히 2 (수십), 3 (단위)입니다.
  • 그러나 나는 또한 16 개의 사과 그룹을 만들 수 있습니다. 그래서 하나의 Group-of-16, 그리고 7 개의 외로운 사과를 얻을 것입니다. 에서 진수 (16 기수라는 방법의가 있음), 나는 쓸 것이다 표기 : 17 (16 + 7). 십진 표기법과 구별하기 위해 일반적으로 16 진 표기법은 접두사 또는 접미사 (17h, # 17 또는 $ 17)로 표시됩니다. 그러나 9 개 이상의 16 개 그룹 또는 9 개 이상의 단독 사과를 나타내는 방법은 무엇입니까? 간단히, A (10)에서 F (15)까지의 문자를 사용합니다. 숫자 31 (31 개 사과에서와 같이)은 16 진수로 # 1F로 기록됩니다.

  • 같은 줄에 우리는 두 개의 사과를 할 수 있습니다. (그리고 두 그룹의 사과 그룹, 즉 그룹의 2x2 사과 등). 그러면 23은 다음과 같습니다. 2x2x2x2 사과 1 개, 2x2x2 사과 0 개, 2x2 사과 2 개, 사과 2 개 1 개, 사과 1 개 1 개, 이진법으로 10111로 표시됩니다.

( https://en.wikipedia.org/wiki/Radix 참조 )

물리적으로 두 가지 상태 (스위치)를 허용하는 메커니즘은 메모리 저장소의 디스크뿐 아니라 수행하기도 쉽습니다.

이것이 숫자로 보이는 데이터와 프로그램이 이진 형식으로 작성되고 조작되는 이유입니다.

그런 다음 데이터 유형에 따라 적절한 형식 (문자 A, 노란색 픽셀)으로 변환되거나 실행됩니다 (MOV 명령).

hexdump데이터 (또는 어셈블리 프로그램)를 16 진수 형식으로 코딩하는 숫자를 나열합니다. 그런 다음 계산기를 사용하여 해당 이진 형식을 얻을 수 있습니다.



4

16 진 편집기에서 열 수 있으며 일련의 16 진 값으로 표시됩니다. xxd file

무엇을 이루려고 노력하고 있습니까?


그러나 컴퓨터는 1과 0 만 읽을 수 있다고 생각했습니다. 그것들을 볼 수 있습니까? 컴퓨터가 어떻게 작동하는지 이해하려고 노력하고 있습니다
Martin Zeltin

2
그것만으로는 많은 도움이되지 않습니다. 정확히 작동하는 방법을 배우려면 Linux 상자에서 ELF 파일 형식과 en.wikipedia.org/wiki/X86_instruction_listings를 살펴보십시오 . 컴파일러가 생성 한 코드를 보려면 gdb로 코드를 실행하십시오. 더 "낮은 수준"을 얻으려면 nand2tetris.org도 확인하십시오. 어셈블리 언어의 경우 6502 및 밉 어셈블리가 x86_64 / x86 어셈블리보다 훨씬
우수하다고 들었습니다.

@theblazehen 현대 x86 가족 어셈블러는 짐승입니다. 8086은 다루기 쉬웠으며, 그 시대의 모든 CPU (1970 년대 후반에서 1980 년대 상반기)는 어셈블러가가는 한 견딜 수 있어야한다고 생각합니다.
CVn

4

bvivim 키 바인딩이있는 이진 VIsual 편집기입니다. 대부분의 Linux 시스템에서 사용할 수 있습니다.

여기에 이미지 설명을 입력하십시오


3

Linux 문자열 명령은 파일에 인쇄 가능한 문자의 문자열을 인쇄합니다. 예 :

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

등등 ... 바이너리보다 훨씬 더 읽기 쉽습니다.


OP는 어떻게 1과 0을 볼 수 있도록 열어야하는지 물었 습니다. 그러나 strings명령은 그가보고자하는 대부분의 바이트를 제거합니다.
jlliagre

@jlliagre-정확하지만 strings길이가 긴 명령 strings -n 6은 문자열 상수 등이 포함 된 경우 이진 파일의 내용을 파악하는 데 실제로 도움이됩니다.이 답변은 주석이어야합니다. 괜찮 았습니다.
Joe

@ 조 예, 나는 strings명령 유용성에 의문을 제기 하지 않고 OP 질문에 대답하지 않는다는 사실에 불과합니다.
jlliagre

3

여전히 혼란스러워 보이는 중요한 부분 : 16 진수 값은 이진 값의 다른 표현입니다. 대부분의 16 진 편집기 또는 16 진 덤프는 16 진 기준으로 값을 표시합니다. 이는 2 진 기준보다 더 읽기 쉽습니다.

예 :

이진 :

xxd -b README.md                                                                
00000000: 00100011 00100000

십진수 35와 32입니다

xxd README.md                                                                   
00000000: 2320

소수점 이하 35와 32도


다른 사람들 이것을 언급했습니다. 그러나 이것은 좋은 요약입니다. 첫 번째 단락을 변경하려면 답변을 편집 할 수 있습니다.
wizzwizz4

글쎄, 나는 그것을 언급하는 사람을 보지 못했다.
목요일 다음

vim를 사용 하려면 설치해야합니다 xxd.
starbeamrainbowlabs

2

다음을 통해 이진 파일을 볼 수 있습니다 vim.

  • 파일 열기 vim
  • 들어가기 :% !xxd -b

xxd명령은 예를 들어, 더 불통 될 수있다 :

  • -g432 비트 팩에서 비트를 그룹화하는 을 추가하여
  • -c4출력을 형식화하는 을 추가하여 행당 4 바이트를 갖습니다.

위의 두 플래그를 모두 추가하면 한 줄에 하나의 32 비트 정수가 제공됩니다.


1

예를 들어이 루비 원 라이너로 할 수 있습니다.

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

기존의 C 기반 시스템은 AFAIK 바이너리로 출력 할 수 있도록 크게 지원합니다. 16 진 덤프와 달리 읽기가 어렵 기 때문에 일반적으로 그다지 유용하지 않습니다.


감사! 바로 뒤에 공백을 추가 %08b하면 출력이 바이트로 그룹화됩니다.
starbeamrainbowlabs

0

GHex는 당신의 친구입니다 :)
당신은 커맨드 라인

우분투를 사용하여 설치할 수 있습니다 :

sudo apt-get ghex 설치

페도라 :

sudo yum 설치 ghex

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.