2016-09-15 8 views
-1

나는 동기화 그룹과 함께 놀고 있었고, 내가 마킹 한 것보다 더 많은 그룹을 추가하면 어떻게 될까 시도했습니다. 나는 아래에 게시 한 런타임 오류가 발생합니다. 그럼 Java 나 C#과 달리 실제 머신 코드로 컴파일하면 런타임 오류에 내 파일 짝수 라인 정보가 표시 될 수 있습니다. 파일 정보가 바이너리에 보관되어 있으면 쉽게 디 컴파일 될 수 있다고 생각합니다. 내가 뭔가 잘못하고있어 내가 찌르다 빌드에 대한 좀 좀 env 변수를 추가 할 필요가 아니면 C# theres 코드를 숨길 수있는 진정한 방법이 아니야Golang 바이너리가 파일과 라인 정보를 보여줍니다.

+0

디버그 정보 ... –

+0

기본 트릭은 PC (프로그램 카운터) 또는 유사한 레지스터의 범위를 함수에 매핑하고 프로그램 카운터와 파일/함수 이름 간의 매핑을 디버그 섹션을 실행하고 필요한 경우 프로그램 카운터를 사용하여 파일 및 함수 이름을 찾습니다. – nos

+0

내가 걱정하는 것은 내 코드가 디코드를 사용하여이 정보를 사용하여 디 컴파일 될 수 있다는 것입니다. @nos에 대해 도움을받지 않습니다. – nikoss

답변

1

그래서 재미로, 나는 단지 panic() objdump 및 objcopy를 사용하여이 정보가 어디에 있는지 살펴 보았습니다. 리눅스 (아마도 다른 것들)에서 Go는 ELF 섹션 .gopclntab에있는 관련 정보를 고집합니다. 제거하면 실제 프로그램 소스에 대한 참조가 사라지지만 런타임이 충돌합니다. 그리고 그 섹션 (아마도 연계와 내성을위한 것)에 더 많은 런타임. * 것들에 대한 참조가 있습니다. 나는이 정보가 완전히 사라진 상태에서 Go 프로그램을 현실적으로 실행할 수는 없을 것이라고 생각합니다.

elsewhere on SO과 같이 보안에 대한 DWARF 정보를 제거 할 수 있으며 ELF 섹션이 사라지지만 컴파일하기 전에 식별자와 파일 이름을 흐리게 처리하기 위해 원본을 사전 처리하는 것이 가장 바람직합니다. 하지만 거기에 doesn't appear to be a ready-made tool to do so.

저는 Go 디자이너 중 한 명이 아니지만, 인트로 스펙 션 (예 : C가 할 수없는 것)으로 인해 훨씬 ​​더 멀리가는 것은 비실용적이라고 생각합니다. upx와 같은 압축기는 파일을 약간 혼란스럽게 만들 것입니다 (컴파일 된 Go로는 제대로 작동하는 것 같습니다 - 어쩌면 거기에 경고 또는 2 개가있는 것 같습니다). 그러나 거기에 있다는 것을 안다면 실행 취소하는 것이 쉽습니다 (모든 보안 유형이 멀리 내 개발자의 라이센스도 내 언급에 대한).

실제로 현실적으로 할 수있는 최선의 방법은 코드를 망칠에 관심이있는 사람들을 스피드 범프하는 것입니다. 소스를 모호하게 만드는 경우, 실제로 그렇게 할 동기가 있다면 최선의 방법이 될 수 있습니다 (그러나 궁극적으로는 충분히 결정된 공격자에게는 여전히 쓸모 없습니다).