2011-01-24 8 views
4

두 바이너리 파일을 어떻게 비교합니까?두 바이너리 파일 비교

두 버전의 프로그램 버전 1과 버전 2가 있습니다. 두 버전간에 약간의 변경이 있었지만, 불행히도 정기적으로 백업하지는 않았습니다. 버전 2에 대한 소스, 나는 버전 1의 바이너리 밖에 가지고 있지 않습니다. 정확히 두 버전 사이에서 무엇이 바뀌 었는지 알아야합니다. 두 버전의 objdump를 만든 다음 diff를 사용하여 변경 사항을 찾으려고 시도했지만 오프셋이 다르기 때문에 diff가 작동하지 않습니다. diff에서는 거의 모든 행이 변경된 것으로 간주합니다.

예를 들어 버전 1에서는 bgez v0,4074d0<daemonize+0xd4>이고 버전 2에서는 bgez v0,4073d4<daemonize+0xd4> 일 수 있습니다. 이러한 파일은 덤프 파일에서 직접 복사됩니다. 두 줄이 똑같은 일을 할 수 있지만 diff에서는 구분할 수 없습니다. 파일이 너무 커서 수동으로 모든 행을 검사 할 수 없습니다. 오프셋의 차이를 무시하면서 기능 변경을 어떻게 감지합니까?

+0

실제 NP 완성 문제와 비슷합니다. ;-) –

+0

DFA로 해결할 수 있으므로 NP 완료이 아닙니다. – Benubird

+0

NP와 DFA는 무엇을 의미합니까? –

답변

3

결국 나는 원시 명령어와 오프셋 마커를 제거하여이 문제를 해결 했으므로 모든 어셈블리를 제거하고 sed를 사용하여 단 하나의 라인으로 구성된 변경 사항을 무시하도록 필터링했습니다. 나는 그것이 효과가 있었는지 조금 놀랐지 만 그랬다.

1

짧은 대답 : 할 수 없습니다.

답 : 숫자가 즉각적인 값인 경우 opcode의 피연산자 중 하나 또는 둘을 무시할 수있는 diff를 직접 작성하십시오.

0

diff를 실행하기 전에 sed 또는 awk (또는 perl 또는 ...)을 사용하여 모든 오프셋을 동일하게 만드는 필터를 작성할 수 있습니다. 그런 필터를 쓰는 것은 독자에게 운동으로 남아있다. :-P

+0

'할 수 있습니다'라는 말로 '어떻게해야합니까?'라는 질문에 대답했습니다. 기술적으로는 올바르지 만 이것은 완전히 쓸모가 없습니다. -1 – Benubird

0

물론 bsdiff과 같은 작업을 수행 할 수 있습니까?

+0

두 프로그램간에 변경된 것을 찾으려고합니다. 잘못 사용했을 수도 있지만 bsdiff는별로 도움이되지 않습니다. 어떻게 할 건데? – Benubird

+0

@Benubird : bsdiff는 바이트 수준이 아닌 코드 수준에서 이진 미분을 만듭니다. 크롬 애호가는 미분에서 재배치 가능한 점프/오프셋을 추가하여이 단계를 한 걸음 더 내디뎠습니다. 방금 옮긴거야. 그것은 diff와 패치를 링크하지만 텍스트 레벨 대신 어셈블리 레벨로 생각하십시오. – Necrolis

4

가능합니다. 현재 새/수정 된 이진 파일 내의 컴파일 된 파일에서 함수 및 메모리 포인터 주소를 검색 할 수있는 프로젝트 작업을하고 있습니다. x86 및 x86_64에서 Windows PE 및 ELF 바이너리를 지원합니다. 접근법을 설명하는 문서도 있습니다. 이진 업데이트가 수행 될 때 모든 후크 및 메모리 주소를 자주 업데이트해야하는 반전 프로젝트에 유용합니다. 그러나 다른 유스 케이스도있다.

Check it out here.

트릭

가 약한 텍스트 비교에 의존하지 않는, 그것은 바이너리 분해 및 코드 메트릭을 사용하여 이들 사이의 기하학적 거리를 측정하여 모든 기능을 비교한다.

+0

asmDIFF가 독립형으로 게시 될 가능성은 있습니까? 내가 볼 수있는 것부터 asm_hint_C와 asm_search_C는 mmBBQ와 lua에 꽤 밀접하게 연결되어 있습니다 ... 반드시 나쁜 것은 아니지만 독립 실행 형으로 사용하기가 어렵습니다. –