문제

내가 쓰기 (및 판매) 소프트웨어는 배포하기 전에 압축 및 암호화됩니다. 새 빌드를 출시 할 때마다 EXE를 포함하여 모든 .map 파일과 생성 된 바이너리를 압축하고 암호화하기 전에 보관합니다.

클라이언트의 컴퓨터에서 충돌하면 미니 딥을 다시 얻습니다. 나는이 미니 덤프를 Visual Studio에서 열고 그곳에서 탐색합니다.

.map 파일에서 주소를 검색 하여이 미니 덤프를 잘 활용했습니다. 이것은 일반적으로 코드의 올바른 영역에 나를 데려 갈 것이며 일반적으로 충돌이 발생한 이유에 대해 추론 할 수 있지만 시간이 많이 걸립니다.

Minidump의 디버깅에서 원래 빌드에서 저장 한 기호를 사용할 수 있다면 도움이 될 것입니다.

내 문제는 올바른 기호를 찾을 수 없다는 것에 대한 경고를 받는다는 것입니다. 저의 연구에 따르면 클라이언트 기계의 EXE 체크섬이 Visual Studio가 만든 EXE의 체크섬과 일치하지 않기 때문입니다. 그리고 나는 왜 압축되고 역학적 인 이유를 이해합니다. 물론 체크섬이 일치하지 않습니다.

나는 분포 가능한 체크섬과 일치하도록 Minidump를 수동으로 편집하거나 저장된 바이너리의 체크섬을 변경할 수 있다고 생각합니다. 저장된 사본을 조작하는 것을 선호하므로 들어오는 모든 덤프를 수정할 필요는 없지만 어느 쪽이든 이상적입니다.

그래서 내 질문은 다음과 같습니다. 어떻게 이러한 체크섬을 찾아서 무엇을 교체 해야하는지 알아낼 수 있습니까? 보조 질문 : 더 나은 방법이 있습니까?

도움이 되었습니까?

해결책

바이너리를 정확히 압축하고 암호화하는 방법을 모르면 매우 구체적이기가 어렵습니다.

이것 블로그 게시물 John Robbins는 실행 파일 이미지가 실행 파일의 PE 헤더에 포함 된 안내서를 통해 PDB와 관련이 있다고 지적합니다. 실행 파일에서 덤프 빈 /헤더를 실행하고 디버그 디렉토리의 출력을 찾아 볼 수 있어야합니다. 압축 및 암호화가 PE 헤더를 수정 하여이 정보를 사용할 수 없도록 (또는 올바른), 디버거가 아무것도 찾을 수없는 이유를 설명합니다.

이 문제를 해결하기 위해 취할 수 있다고 생각하는 몇 가지 방법이 있습니다. 실제로 이것을 작동 시키려면 Visual Studio Debugger 대신 WindBG를 사용하는 것을 고려할 수 있습니다. 내가 왜 이것을 추천하는지 이해할 것입니다 ...

WINDBG는 심볼 파일의 편안한로드를 허용하는 몇 가지 옵션을 제공합니다. 이 옵션의 아이디어는 소스 코드가 변경되지 않았지만 Binaries가 PDB와 다른 빌드와는 다른 빌드와는 안내 검사를 면제하고 불일치 기호 파일을로드 할 수 있다는 것입니다. 이것이 당신의 압축과 암호화로 얼마나 잘 작동할지 모르겠습니다.

WindBG와 그에 따른 도구는 실행 파일과 PDB 모두에서 안내를 덤프하는 데 사용될 수 있지만, 그 단계가 필요하지 않기를 바라고 있기 때문에 지금은이를 생략하고 있습니다.

WindBG에서 Minidump를 열면이 모든 것이 작동하도록 명령 줄에 여러 명령을 입력해야합니다.

.symopt +0x40
!sym noisy
ld <exe name>

첫 번째 명령은 SYMOPT_LOAD_ANYTHING 가이드 체크를 건너 뛰는 옵션. 그만큼 !sym 명령은 더 자세한 오류 메시지를 볼 수 있도록 기호로드에 대한 장점 출력을 활성화합니다. 그만큼 ld Command는 WindBG를 대신에 입력 할 실행 파일 이름의 기호를로드하도록 지시합니다. <exe name>. 반복하면 ld 명령, WINDBG는 처음으로 기호를 성공적으로로드했는지 여부를 나타냅니다.

바라건대 이것은 도움이되기를 바랍니다. 다시, 이것이 압축과 암호화로 얼마나 잘 작동할지 모르겠지만 시도해 볼 가치가 있습니다.

다른 팁

이 압축 / 암호화는 UPX와 같은 것입니까? Binaries의 실제 실행 가능 컨텐츠가 변경되는 경우 (UPX와 같은 도구로 수행되는 것처럼) 운이 좋지 않을 것입니다 (어셈블리 언어로 복잡한 응용 프로그램을 디버깅하는 것을 좋아하지 않는 한). 귀하의 소프트웨어가 정말로 중요 / 특별한 것이므로 바이너리를 배송하기 전에 암호화해야합니까? 내 경험상 충돌 덤프를 디버그하는 능력은 사람들이 코드를 리버스 엔지니어링하는 것을 막는 것보다 훨씬 중요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top