맨페이지의 예제에 있는 바이너리를 패치하여 이것이 무엇을 의미하는지 이해하려고 합니다 xxd
.
Patch the date in the file xxd.1
% echo "0000037: 3574 68" | xxd -r - xxd.1
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
답변1
파일을 패치한다는 것은 파일을 수정하는 것을 의미하며 이는 일반적으로 수정이 사소하다는 것을 의미합니다. 이 사용법은 패치가 작은 수정(예: 천 조각)인 일반적인 영어 사용법에서 유래합니다. 파일의 경우 패치로 항상 문제가 해결되는 것은 아닙니다.
패치는 파일 또는 파일 세트를 수정하는 방법을 설명하는 일련의 지침입니다. 유닉스 세계에서 패치는 일반적으로diff
텍스트 파일의 변경 사항을 설명하는 명령입니다. 이러한 의미에서 패치는 파일의 행을 추가, 삭제 또는 수정하는 수정을 설명합니다. 이 patch
유틸리티는 이러한 지침을 적용하여 파일 또는 파일 그룹을 수정합니다. 파일이 더 이상 예상된 상태가 아니기 때문에 첫 번째 패치로 인해 두 번째 패치가 적용되지 않는 변경이 발생할 수 있으므로 동일한 파일에 여러 패치를 지능적으로 적용하려고 시도합니다. 해당 작업은 라인 기반이므로 diff
이진 patch
파일에는 적합하지 않습니다.
xxd
바이너리 파일 작업을 위한 일반 유틸리티입니다. 그 기능 중 하나는 파일을 수정하는 것입니다. 예를 들어, 이 명령은 xxd -r - xxd.1
표준 입력에 설명된 수정 사항을 적용한다는 의미입니다. 예제 패치(예: 수정 명령)는 오프셋(예: 십진수 55)에서 시작하여 다음 3바이트를 0x35, 0x74 및 0x68(예: 3개 문자 ) 로 바꾸는 것을 0000037: 3574 68
의미합니다 .0x37
5th
답변2
파일에 패치를 적용하면 해당 파일의 일부를 업데이트된 데이터로 덮어쓰게 됩니다. 패치는 마지막에 추가 데이터를 추가할 수도 있습니다. 모든 파일은 궁극적으로 바이트 스트림이기 때문에 텍스트, 바이너리 등 모든 유형의 파일을 패치할 수 있습니다.
패치 파일은 다루어야 할 부분을 지정합니다.
소프트웨어 수정 사항에 업데이트 파일이 포함된 경우 패치는 해당 파일을 업데이트 파일의 전체 버전과 동일하게 수정할 수 있습니다. 패치는 전체 파일이 아니라 단지 차이점이기 때문에 패치는 다운로드 시 크기가 더 작고 디스크 공간과 대역폭을 덜 소모합니다.
16진수 편집기(예: hexer
)에서 직접 바이너리 파일을 편집하는 것을 "수동" 패치라고 부르기도 합니다.
잘 모르겠는데 , 사전 검색해 보니 생성 가능한 것 xxd
같더군요.xxd
덤프또는 이진 데이터의 16진수 목록이며 이러한 목록을 다시 직선 이진으로 변환하는 것도 가능합니다. 따라서 dump hex를 사용 xxd
하고 vim
다른 텍스트 편집기로 편집한 다음 xxd -r
"hexdump 형식"을 사용하여 echo
문자열을 파이프할 수도 있습니다. xxd
(다른 옵션을 사용하면 바이너리를 변경할 수 있습니다. xxd
덮어쓰기 또는 패치를 시작하고 중지할 위치를 지정할 수 있는 옵션이 많이 있는 것 같습니다.)
xxd
예제의 첫 번째 명령은 기본적으로 오프셋 ("5번째"의 경우 ASCII) 에서 시작하는 파일의 바이트를 변경하도록 지시합니다 . "echo" 명령이 제공하는 자체 "hexdump" 형식을 읽을 수 있습니다.xxd.1
0x0000037
0x35 0x74 0x68
xxd
xxd
예제의 두 번째 명령은 -c
동일한 오프셋( )에서 시작하는 파일의 13바이트 수를 덤프합니다.
이 patch
명령은 유사한 작업을 수행하지만 "diff" 형식의 파일이 필요합니다. 명령의 출력을 저장하여 diff
두 파일을 비교하고 차이점을 diff 형식으로 표현하는 diff 파일을 만들 수 있습니다. 페이지를 읽어보면 man
패치는 직접 바이너리보다 텍스트 파일을 변경하는 데 더 많은 것 같습니다.
답변3
마이크로컨트롤러에는 프로그램 자체인 프로그램 메모리를 변경하는 프로그램이 있는 경우가 있습니다. 프로그램이 실행되면서 "변형된다"고 말할 수 있습니다.
이는 바이너리 애플리케이션 변경에 대한 하나의 설명일 뿐입니다.
실제로 마이크로컨트롤러 프로그램에서는 바이너리 패치를 자주 사용합니다. 귀하의 프로그램은 기계 코드이고 일반적으로 어셈블리로 프로그래밍되므로 조립된 기계 코드는 프로그래밍한 내용을 매우 직접적으로 표현합니다. 따라서 코드가 조합되면 마이크로 컨트롤러의 프로그램 메모리 일부 또는 전부에 대한 패치를 제공하기만 하면 됩니다.