바이너리 파일의 미스터리

바이너리 파일의 미스터리

이것은 g++와 같은 컴파일러에서 직접 가져온 파일과 -o(outfile) 플래그에 관한 것입니다.

바이너리라면 그냥 0과 1의 묶음이어야 하지 않나요?

고양이를 처치하면 이해할 수 없는 결과가 나오지만 단어도 손상되지 않습니다.

제출하면 즉시 답변을 얻을 수 있습니다. 계산이 없는 것 같습니다. 실제로 바이너리 파일에 이런 종류의 정보가 포함된 헤더가 있습니까?

나는 바이너리 실행 파일이 단지 컴파일된 프로그램일 뿐이고, CPU가 즉각적이고 명확하게 이해할 수 있는 기계 명령의 형태일 뿐이라고 생각했습니다. 그렇다면 그 명령어 세트는 단지 비트 패턴이 아닌가? 그렇다면 바이너리에 있는 다른 것들은 모두 무엇입니까? 비트를 어떻게 표시합니까?

또한, 어떻게든 프로세서 설명서를 구하게 된다면 한 번에 하나의 기계 명령어씩 수동으로 바이너리를 작성할 수 있습니까? 정말 비효율적이겠지만,매우"Hello World!"에 대해서도 작동하게 했다면 매우 흥미로울 것입니다. 데모.

답변1

슈퍼유저 질문:텍스트 편집기로 바이너리 파일을 열 때 바이너리 코드가 표시되지 않는 이유는 무엇입니까?첫 번째 요점을 아주 잘 설명합니다.

바이너리와 텍스트 데이터는 분리되지 않으며 단순한 데이터입니다. 그것은 둘 중 하나를 만드는 해석에 달려 있습니다. 텍스트 편집기에서 이진 데이터(예: 이미지 파일)를 열면 선택한 해석(텍스트)에 맞지 않기 때문에 대부분 의미가 없습니다.

파일은 0과 1로 저장됩니다(예: 메모리에 전압/전압 없음, 하드 드라이브에 자화/자화 없음). cat0/1 시퀀스는 인간에게 별로 유용하지 않기 때문에 파일을 검색할 때 0과 1이 표시되지 않습니다 . 문자가 더 의미가 있으며 대부분의 목적에는 hexdump가 더 좋습니다( hexdump파일에서 시도).

실행 파일헤더가 있어프로그램이 구축된 아키텍처, 파일의 어떤 섹션이 코드와 데이터인지와 같은 매개변수를 설명합니다. 이는 file바이너리 파일의 특성을 식별하는 데 사용됩니다.

마지막으로, 그렇습니다. CPU opcode를 직접 사용하여 어셈블리 언어로 프로그램을 작성할 수 있습니다. 보세요UNIX 어셈블리 프로그래밍 소개그리고인텔 x86 문서출발점으로.

답변2

모든 파일은 1과 0으로 저장됩니다. cat은 각 BYTE(8비트)를 문자로 해석하려고 시도하므로 이해할 수 없는 문자가 표시됩니다.

답변3

모든 파일은 내부적으로 바이너리입니다. 즉, 일련의 파일로 저장됩니다.비트.

파일 비트는 실제로 다음과 같이 그룹화됩니다.바이트. 모든 파일은 정수 바이트로 구성됩니다. 모든 유닉스 시스템, 그리고 실제로 거의 모든 컴퓨터는 8비트로 구성된 바이트를 갖습니다.옥텟네트워킹 용어로). 바이트를 8비트 숫자, 즉 0과 2 8 -1 = 255 사이의 숫자로 해석하는 자연스러운 방법이 있습니다 .

이를 바이너리로 보려면 바이너리 표기법으로 작성하는 도구가 필요합니다. 인간은 이진 표기법에 적합하지 않습니다. 아무것도 작성하는 데 너무 오랜 시간이 걸립니다. 사용하는 것이 더 일반적입니다.16진수16개의 다른 숫자로 표기합니다. 예를 들어 (16진수로 65) 는 (2진수로 65) 41보다 읽기 쉽습니다 . 01000001다음과 같은 명령을 사용할 수 있습니다.od(“8진수 덤프”) 또는 hexdump또는 hd각 바이트에 대해 8진수 또는 16진수 표기법으로 파일을 나열합니다( od -t x116진수로 전환).

바이트는 문자를 나타낼 수 있습니다. 여러 가지가 있습니다문자 인코딩유닉스 세계에서 사용됩니다. 그것들은 모두 다음을 기반으로 합니다.아스키0에서 127 사이의 바이트 해석을 정의합니다. 이는 가능한 바이트 값의 절반에 대한 의미만 정의합니다. 예를 들어 65는 대문자 A, 97은 소문자 a, 30은 숫자 0등을 나타냅니다. 일부 문자 인코딩은 각 문자를 1바이트로 나타냅니다. 예를 들어,라틴-1인코딩, 163은 £, 241은 ñ등을 나타냅니다. 이런 방식으로 표현할 수 있는 최대 문자 수는 256개로 그리 많지 않습니다. 따라서 문자당 1바이트 이상을 사용하는 다른 인코딩이 있습니다. 요즘 유닉스 세계의 사실상의 표준 인코딩은 다음과 같습니다.UTF-8, 이는 가변 길이 인코딩입니다(문자마다 다른 바이트 수를 차지함).유니코드 문자 집합.

텍스트 파일은 이해할 수 있는 텍스트를 포함하는 바이너리 파일입니다. 실제로 유닉스 프로그램의 경우 파일은 두 가지 조건을 준수하는 한 텍스트 파일입니다.

  • 텍스트 파일에는 널 바이트(숫자 값이 0인 바이트)가 포함될 수 없습니다. 이 바이트는 어떤 문자도 나타내지 않으며 많은 텍스트 조작 프로그램에서 내부적으로 특수 표시로 사용됩니다.
  • 텍스트 파일은 일련의 줄로 구성되며 각 줄은 다음과 같은 문자로 끝납니다.개행문자(숫자 값 10).

기계 실행 파일은 특정 종류의 바이너리 파일입니다. 해당 항목에 대해 명령 을 실행하면 cat가끔 텍스트가 포함된 쓰레기가 표시됩니다. 이러한 파일에는 우연히 터미널에 대한 명령도 포함될 수 있습니다. 프로그램을 사용하면 strings인쇄할 수 없는 문자를 제외하고 이진 파일의 모든 텍스트 조각을 볼 수 있습니다.

기계 실행 파일은 정확히 일련의 기계 명령이 아닙니다. 또한 운영 체제에 파일을 메모리에 로드하는 방법을 알려주는 약간의 추가 정보, 일반적으로 프로그램에서 사용하는 일부 데이터 및 선택적으로 디버깅 정보도 포함합니다. 대부분의 유닉스 시스템은꼬마 요정기계 실행 파일의 형식입니다. 이 형식은 기계어 코드가 포함된 파일을 여러 섹션으로 나누는 방법을 지정하며 해당 부분은 기계 아키텍처와 독립적입니다. 일부 섹션에는 코드가 포함되어 있으며 해당 코드의 의미는 특정 기계 아키텍처에 따라 다릅니다.

이 명령을 사용하여 objdump -D /path/to/machine-executable사람이 읽을 수 있는 형식으로 실행 파일 목록을 표시할 수 있습니다.어셈블리어. 어쨌든 훈련받은 사람은 읽을 수 있습니다. 어셈블리 언어는 프로세서 아키텍처에만 적용되며 기계 명령어에 직접 매핑됩니다.

어셈블리 언어로 완전한 프로그램을 작성하는 것은 가능하지만 시간이 오래 걸리기 때문에 중요하지 않은 프로그램에서는 거의 수행되지 않습니다. 정말 미친 사람이라면 프로그램을 바이너리로 직접 작성할 수도 있습니다. 어떤 사람들은 이 아이디어를 생각해내려고 노력했습니다.인쇄하는 가장 짧은 프로그램Hello world; Ryan Henszey가 글쓰기 방법을 설명합니다.PC 프로세서용 142바이트 ELF 실행 가능; 브라이언 레이더ELF 형식을 분석하여 45바이트 프로그램을 고안했습니다.Linux가 실행하려고 합니다(해당 프로그램은 아무것도 인쇄하지 않습니다).

바이너리 파일이 아닌 실행 파일도 있습니다. 그들은 다음과 같이 알려져 있습니다스크립트. 반대로 이미지, 비디오, 압축 파일, 워드 프로세서 문서, 실행 불가능한 코드 라이브러리 등 실행할 수 없는 바이너리 파일도 많이 있습니다.진입 지점, 다른 프로세서 아키텍처용 실행 파일, …

관련 정보