C ++ 애플리케이션 코드를 난독 처리하는 것이 중요합니까?


11

Java 세계에서는 때때로 문제가되는 것처럼 보이지만 C ++는 어떻습니까? 다른 솔루션이 있습니까?

누군가 특정 OS의 C ++ 라이브러리를 동일한 라이브러리의 다른 버전으로 바꿀 수 있지만 내 코드의 기능을 이해하기 위해 디버그 기호로 가득 찬 사실에 대해 생각하고있었습니다. 표준 라이브러리 나 인기있는 라이브러리를 사용하는 것이 좋습니까?

Windows의 일부 dll 라이브러리가 해당 라이브러리의 "디버그 버전"으로 바뀐 경우에도 발생할 수 있습니다. 정적 컴파일을 선호하는 것이 더 낫습니까? 상용 응용 프로그램에서 응용 프로그램의 핵심을 위해 모든 것을 정적으로 컴파일하고 대부분의 경우 dll (동적 라이브러리)은 불법 복제 방지 솔루션과 같은 타사 기술을 제공하는 데 사용됩니다 (많은 게임에서 이것을 봅니다) ), GUI 라이브러리 (예 : Qt), OS 라이브러리 등

정적 컴파일은 Java 세계에서 난독 화에 해당합니까? 더 나은 용어로, 코드를 보호하는 가장 저렴한 솔루션입니까?


4
당신이 무엇을 하든지, 너무 많은 시간을 가진 사람은 그것을 난독 화 / 디 컴파일 할 수있을 것입니다
Zavior

13
많은 컴파일러에는 /O난독 화 스위치가 있습니다. 일부는 심지어 여러 수준의 난독 화까지, 최대 /O3;)
MSalters

@MSalters 아니오, g ++는 -O3;)
BЈовић

@Zavior 또는 단순하고 단순하게 리버스 엔지니어링합니다. 바이너리 자체가 필요하지 않으며 소프트웨어에 대한 철저한 분석 만 필요합니다.
John Weisz

답변:


27

지는 전투에서 시간을 낭비하지 마십시오

C ++ 및 기타 언어에 대한 많은 다른 유사한 답변에서 언급했듯이 이것은 대부분 쓸모없습니다 .

추가 자료

주제에 대한 선택된 읽기 (모두 C ++에만 해당되는 것은 아니지만 일반적인 원칙이 적용됨) :

StackExchange 답변

서류

난독 화에 대한 유명한 인용문 :

마지막으로 코드 프라이버시 문제가 있습니다. 이것은 잃어버린 원인입니다. 결정된 해커가 프로그램을 이해하지 못하도록하는 변환은 없습니다. 이것은 모든 언어의 모든 프로그램에 적용되는 것으로 판명되었습니다. JavaScript는 소스 형식으로 제공되기 때문에 더욱 분명합니다. 난독 화로 인한 개인 정보 보호 혜택은 환상입니다. 사람들이 프로그램을 보지 못하게하려면 서버를 분리하십시오. - 더글러스 크로포드


못?

나는 당신이 난독 화해서는 안된다고 말하는 것이 아니며 그만한 이유가 없지만 대부분의 경우 필요성과 비용 효율성에 대해 심각하게 의문을 제기합니다.

또한, 난독 화가 사실상 요구되는 상황이 있습니다. 예를 들어, 바이러스를 작성하는 경우 분명히 난독 화 (및 역동적 인 바이러스)는 프로그램의 복제 능력만큼이나 생존하기에 좋습니다. 그러나 이것은 "일반적인"사례는 아닙니다.


우리는 한 번 하드웨어 동글을 사용하여 모든 동글 기능 호출을 가리기위한 라이센스 요구 사항이 있었으며,이를 수행 할 도구를 제공했습니다. 항상 그들의 '보호'의 질에 대해 조금 의심스러워했습니다!
Martin Beckett

@ MartinBeckett : 정말 이상합니다.
haylem

3

아니요, 노력할 가치가 없으며 완전히 불필요하다고 생각합니다. 호출하는 기능은 제공하는 기능에 의해 추측 될 수 있습니다.

Java에 대해 난독 화가 존재하는 이유는 Java 바이트 코드와 Java 소스 코드 간의 맵핑이 상당히 잘 정의되어 있고 모든 함수 및 멤버 변수의 이름이 공개, 개인 또는 보호 여부에 관계없이 바이트 코드에 저장되기 때문입니다. ) 따라서 Java 바이트 코드 인터프리터는 원본 소스의 구조를 명확하게 보여주는 일반적인 Java를 제공 할 수 있습니다.

C ++는 기계 언어로 직접 컴파일됩니다. 해체 할 수는 있지만, 어셈블리 언어는 상당히 지루합니다. 컴파일 과정에서 옵티마이 저가 코드를 변경하기 때문에 디 컴파일은 훨씬 까다로워집니다.


0

이것에 대해 생각하면, 난독 화에는 여러 가지 유형이 있습니다. 완전한 시간 낭비 인 소스 코드의 난독 화부터 시작하겠습니다. 그것 없이는 이해하기가 어렵습니다! 대신 코드가 사용자에게 어떻게 전달되는지에 대한 전달 패키지의 난독 화에 초점을 맞추겠습니다.

작은 난독 화

가벼운 난독 화는 캐주얼 사용자가 손가락을 찌르거나 물건을 쉽게 부수는 것을 방지하기 위해 존재합니다. 결정된 해커를 차단하지는 않지만 지원 요청이 실제로 제공 한 것임을 보장하는 데 도움이됩니다. 이런 종류의 일에 필요한 보호 수준은 실제로 매우 낮습니다. 전달 패키지는 단지 (전문 도구없이) 읽고 편집 가능하게 보일 필요 가 없으며 , 충분합니다.

자바 스크립트 축소는 이에 대한 예이지만 판매되지는 않습니다. 올바른 결정을 내린 사람은 충분히 결정된 / 지속적인 경우에 기술적으로 가능한 경우에도 축소 된 JS 파일을 읽고 편집하기를 원하지 않습니다.

Java 응용 프로그램 제공과 유사합니다. 코드를 실행 가능한 JAR로 패키징하면 도시 공원에 정중 한 "Please Keep Off The Grass"표시가 있지만 어리 석음의 대부분을 막을 수 있습니다.

C ++ 코드를 제공 할 때도 실행 파일에서 불필요한 심볼을 제거하면 약간 난독화할 수 있습니다. 핵심은 사용자로서 결과를 읽는 것이 어색 하지만 컴퓨터로 실행하는 데는 문제가 없다는 것입니다.

주요 난독 화

주요 난독 화는 결정 되고 지식이 풍부한 사용자를 차단합니다. 또한 완전히 패배하는 게임이기도합니다. 컴퓨터가 그것을 실행할 수 있다면, 사람은 그것을 분리하여 그 일을 할 수 있습니다. 당신이 얻을 수있는 가장 가까운 것은 프로그램 자체를 지속적으로 해독하여 한 번에 수행하는 작업을 다른 시간에 수행하는 것과 완전히 다른 것으로 변환하는 것입니다. 그러한 것을 만드는 것은 다소 어려울 수 있지만 여전히 훌륭한 해커를 막지 못할 것입니다 (단, 자체 수정 코드를 해독하는 데 많은 노력을 기울이면 실제로 해커가 끝날 때까지 당신과 상당히 교차 할 것입니다).

다른 솔루션으로 생각하는 것이 훨씬 좋습니다. 예를 들어, 제어하는 ​​서버에 코드의 "크라운 보석"을 유지하고 서비스 호출 만 허용하여 클라이언트를 귀중한 비트의 프론트 엔드 인 본질적으로 무료로 제공 할 수 있습니다. 또는 더 많은 계약 / 법적 경로를 따라갈 수 있으며 코드 내부를 찌르지 않거나 그렇게한다면 보상하는 조직에 공식적으로 실행 파일을 넘겨 줄 수 있습니다 (NDA의 일 종일 수 있음). 목표는 해커가 해킹하지 않도록 강력한 인센티브를 만들고 사용자가 계약에 구속되지 않는 해커로부터 코드를 멀리하는 것입니다.

그러나 코드를 해독 할 수 없다고 가정해서는 안됩니다. 가상화를 사용하면 실행의 모든 ​​프로그램 상태를 검사하고 추적 할 수 있으며이를 방지하려는 모든 것 (예 : 외부 시간 원본에 대한 클럭 추적)은 해커보다 합법적 인 사용자에게 문제를 일으킬 가능성이 훨씬 높습니다. ( 코드가 상대방의 손 에 들어간 후에도 매우 정통한 정보 출판사 조차도 시스템을 안전하게 유지할 수없는 방법에 대해서는 DRM의 역사를 참조하십시오 .) 합법적 인 사용자를 실제로 만족시키는 데 집중하는 것이 훨씬 좋습니다. 비정기적인 균열로 인한 손실은 고객 만족을 통한 적절한 추가 자금과 비교할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.