IT이야기

바이너리 패치 생성 방법

cyworld 2021. 10. 1. 21:26
반응형

바이너리 패치는 어떻게 생성합니까?


바이너리 파일에 대한 패치를 만드는 가장 좋은 방법은 무엇입니까? 사용자가 간단하게 신청할 수 있도록 하고 싶습니다(간단한 patch신청이 좋을 것입니다). 파일에서 diff를 실행하면Binary files [...] differ


체크 아웃 bsdiffbspatch( 웹 사이트 , 맨 페이지 , 종이 , GitHub의 포크 ).

이 도구를 설치하려면:

  • Windows: 이 패키지를 다운로드하고 압축을 풉니다 . 또한 bzip2.exein 의 사본이 필요합니다 PATH. 여기 "바이너리" 링크에서 다운로드 하세요 .
  • macOS: Homebrew를 설치하고 이를 사용하여 bsdiff.
  • Linux: 패키지 관리자를 사용하여 bsdiff.

Google Chrome 팀의 Courgette 는 바이너리 패치 실행 파일을 위한 가장 효율적인 도구로 보입니다.

그들의 데이터를 인용하려면:

개발자 채널의 최근 190.1 -> 190.4 업데이트 크기는 다음과 같습니다.

  • 전체 업데이트: 10,385,920바이트
  • bsdiff 업데이트: 704,512바이트
  • Courgette 업데이트: 78,848바이트

다음은 빌드 지침 입니다. 다음은 Mehrdad 에서 제공한 2018년 Windows 바이너리 입니다 .


xdelta( website , GitHub )는 또 다른 옵션입니다. 더 최근인 것 같지만 그렇지 않으면 bsdiff와 같은 다른 도구와 어떻게 비교되는지 모르겠습니다.

용법:

  • 패치 만들기: xdelta -e -s old_file new_file delta_file
  • 패치 적용: xdelta -d -s old_file delta_file decoded_new_file

설치:

  • Windows: 공식 바이너리를 다운로드합니다 .
  • 초콜릿: choco install xdelta3
  • 자작: brew install xdelta
  • Linux: 패키지 관리자 xdelta또는 xdelta3패키지 관리자에서 사용할 수 있습니다.

최신 포트: bsdiff/bspatch용으로 매우 유용한 .NET 포트:

https://github.com/LogosBible/bsdiff.net

내 개인적인 선택. 나는 그것을 테스트했고 모든 링크 중 유일한 링크였으며 즉시 컴파일 할 수있었습니다 (Visual Studio, 예 : 2013). (다른 곳의 C++ 소스는 약간 구식이며 최소한 약간의 연마가 필요하며 실제 메모리(diff 소스 크기) 제한을 설정하는 32비트에 불과합니다. 이것은 이 C++ 코드 bsdiff의 포트이며 패치 결과가 동일한지 테스트합니다. 원래 코드로).

추가 아이디어: .NET 4.5를 사용하면 여기서 종속성인 #Zip lib를 제거할 수도 있습니다.

C++ 코드보다 약간 느린지 측정하지 않았지만 저에게 잘 작동했습니다(bsdiff: 1-2분에 90MB 파일). 그리고 저에게 시간이 중요한 것은 bspatch일 뿐이지 bsdiff는 아닙니다. .

x64 시스템의 전체 메모리가 사용되는지 확실하지 않지만 가정합니다. x64 가능 빌드("모든 CPU")는 최소한 작동합니다. 100MB 파일로 시도했습니다.

- 게다가: 주요 대상이 실행 파일인 경우 인용된 Google 프로젝트 'Courgette'가 최선의 선택일 수 있습니다. 그러나 (적어도 Windows 측정의 경우) 빌드하는 작업이며 이진 파일의 경우 문서를 이해하는 한 순수한 bsdiff/bspatch도 사용하고 있습니다.


작고 간단한 패치의 경우 -a(또는 --text) 옵션을 사용하여 파일을 텍스트로 처리하도록 diff에 지시하는 것이 가장 쉽습니다. 내가 이해하는 한 더 복잡한 바이너리 diff는 패치 크기를 줄이는 데만 유용합니다.

$ man diff | grep -B1 "as text"
       -a, --text
              treat all files as text
$ diff old new
Binary files old and new differ
$ diff -a old new > old.patch
$ patch < old.patch old
patching file old
$ diff old new
$

파일 크기가 같고 패치가 몇 바이트만 수정하면 OS와 함께 일반적으로 설치되는 xxd를 사용할 수 있습니다. 다음은 각 파일을 줄당 1바이트의 16진수 표현으로 변환한 다음 파일을 비교하여 압축 패치를 만든 다음 패치를 적용합니다.

$ xxd -c1 old > old.hex
$ xxd -c1 new > new.hex
$ diff old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$

파일 구조를 알고 있다고 가정하면 ac/c++ 프로그램을 사용하여 바이트 단위로 수정할 수 있습니다.

http://msdn.microsoft.com/en-us/library/c565h7xx(VS.71).aspx

이전 파일을 읽고 원하는 대로 수정된 새 파일을 작성하면 됩니다.

Don't forget to include a file format version number in the file so you know how to read any given version of the file format.

ReferenceURL : https://stackoverflow.com/questions/1945075/how-do-i-create-binary-patches

반응형