내가 이해 한 바에 따르면 컴파일러는 CPU가 읽을 수있는 1과 0으로 구성된 이진 파일을 만듭니다. 이진 파일이 있지만 거기에있는 1과 0을 보려면 어떻게 열어야합니까? 텍스트 편집기에서 열 수 없습니다.
추신 : 나는 1과 0의 일반 이진 코드이어야하는 어셈블리 컴파일 이진을 가지고 있습니까?
내가 이해 한 바에 따르면 컴파일러는 CPU가 읽을 수있는 1과 0으로 구성된 이진 파일을 만듭니다. 이진 파일이 있지만 거기에있는 1과 0을 보려면 어떻게 열어야합니까? 텍스트 편집기에서 열 수 없습니다.
추신 : 나는 1과 0의 일반 이진 코드이어야하는 어셈블리 컴파일 이진을 가지고 있습니까?
답변:
hexdump -C yourfile.bin
물론 편집하고 싶지 않다면. 대부분의 Linux 배포판에는
hexdump
기본적으로 있지만 모든 것은 아닙니다.
Emilio Bool의 답변 에 따르면 :
xxd
이진수와 16 진수를 모두 수행빈의 경우 :
xxd -b file
16 진수의 경우 :
xxd file
다양한 사람들이 쿼리의 일부 측면에 대답했지만 전부는 아닙니다.
컴퓨터의 모든 파일은 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의 커뮤니티 위키 항목 이 이에 대해 자세히 설명합니다.
cat
실행 파일 ( cat
이 경우)은 1과 0을 모두 읽고 관련 알파벳의 문자로 변환하여 표시합니다. 언어." cat
그렇게하지 않습니다. 모든 cat
것은 "유해한" 옵션을 사용하지 않는 한 표준 출력에 바이트를 쓰는 것 입니다. 터미널 프로그램 (및 / 또는 해당되는 경우 터미널 하드웨어, 즉 펌웨어)은 TTY 드라이버의 도움을 받아 바이트를 문자로 렌더링하는 방법을 결정합니다.
낮은 수준에서 파일은 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 개 있다고하자.
그러나 나는 또한 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 진수 형식으로 코딩하는 숫자를 나열합니다. 그런 다음 계산기를 사용하여 해당 이진 형식을 얻을 수 있습니다.
od
(octal dump)로 시작 하고 시스템에 따라 objdump
유용한 도구를 찾을 수 있습니다 .
16 진 편집기에서 열 수 있으며 일련의 16 진 값으로 표시됩니다. xxd file
무엇을 이루려고 노력하고 있습니까?
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
등등 ... 바이너리보다 훨씬 더 읽기 쉽습니다.
strings
명령은 그가보고자하는 대부분의 바이트를 제거합니다.
strings
길이가 긴 명령 strings -n 6
은 문자열 상수 등이 포함 된 경우 이진 파일의 내용을 파악하는 데 실제로 도움이됩니다.이 답변은 주석이어야합니다. 괜찮 았습니다.
strings
명령 유용성에 의문을 제기 하지 않고 OP 질문에 대답하지 않는다는 사실에 불과합니다.
여전히 혼란스러워 보이는 중요한 부분 : 16 진수 값은 이진 값의 다른 표현입니다. 대부분의 16 진 편집기 또는 16 진 덤프는 16 진 기준으로 값을 표시합니다. 이는 2 진 기준보다 더 읽기 쉽습니다.
예 :
이진 :
xxd -b README.md
00000000: 00100011 00100000
십진수 35와 32입니다
xxd README.md
00000000: 2320
소수점 이하 35와 32도
vim
를 사용 하려면 설치해야합니다 xxd
.
예를 들어이 루비 원 라이너로 할 수 있습니다.
$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'
기존의 C 기반 시스템은 AFAIK 바이너리로 출력 할 수 있도록 크게 지원합니다. 16 진 덤프와 달리 읽기가 어렵 기 때문에 일반적으로 그다지 유용하지 않습니다.
%08b
하면 출력이 바이트로 그룹화됩니다.