디 컴파일을 방지하기 위해 컴파일 된 Java 클래스를 잠그는 방법은 무엇입니까? 어떻습니까? 예를 들어, 암호 기반

디 컴파일을 방지하기 위해 컴파일 된 Java 클래스를 어떻게 잠그나요?

나는 이것이 인터넷에서 매우 잘 논의 된 주제 임에 틀림 없다는 것을 알고 있지만 그것들을 참조한 후에는 어떤 결론에 도달 할 수 없었다.

많은 사람들이 obfuscator를 제안하지만 기억하기 어려운 문자 시퀀스로 클래스, 메서드 및 필드의 이름을 변경하지만 민감한 상수 값은 어떻습니까?

예를 들어, 암호 기반 암호화 기술을 기반으로 암호화 및 암호 해독 구성 요소를 개발했습니다. 이제이 경우 모든 일반 Java 사용자는 JAD 를 사용 하여 클래스 파일을 디 컴파일하고 솔트 뿐만 아니라 암호 값 (상수로 정의 됨)을 쉽게 검색 할 수 있으며, 작은 독립 프로그램을 작성하여 데이터를 해독 할 수 있습니다!

또는 이러한 민감한 구성 요소를 네이티브 코드 (예 : VC ++)로 빌드하고 JNI 를 통해 호출해야 합니까?



답변

고급 자바 바이트 코드 난 독기 중 일부는 단순한 클래스 이름 변경 이상의 기능을 수행합니다. 예를 들어, Zelix KlassMaster 는 코드 흐름을 따라 가기가 정말 어렵게 만들고 훌륭한 코드 최적화 프로그램으로 작동하는 방식으로 코드 흐름을 뒤섞을 수도 있습니다.

또한 많은 obfuscator는 문자열 상수를 스크램블하고 사용하지 않는 코드를 제거 할 수 있습니다.

또 다른 가능한 솔루션 (난독 화를 반드시 제외 할 필요는 없음)은 암호화 된 JAR 파일 과 암호 해독을 수행하는 사용자 정의 클래스 로더를 사용하는 것입니다 (가급적 네이티브 런타임 라이브러리 사용).

세 번째 (그리고 아마도 가장 강력한 보호 기능을 제공함)는 GCC 또는 Excelsior JET 와 같은 기본 사전 컴파일러를 사용하는 것 입니다. 예를 들어 Java 코드를 플랫폼 별 기본 바이너리로 직접 컴파일합니다.

어쨌든 당신은 에스토니아어 “자물쇠는 동물을위한 것”이라는 속담을 기억해야합니다. 즉, 런타임 동안 모든 코드를 사용할 수 있고 (메모리에로드 됨) 충분한 기술, 결정 및 동기 부여가 주어지면 사람들이 코드를 디 컴파일, 스크램블 및 해킹 할 수 있고 그렇게 할 것입니다. 여러분의 임무는 프로세스를 다음과 같이 불편하게 만드는 것입니다. 당신은 여전히 ​​일을 계속할 수 있습니다 …


답변

암호화 된 데이터와이를 해독하는 소프트웨어에 모두 액세스 할 수있는 한 기본적으로이를 완벽하게 보호 할 수있는 방법은 없습니다. 이전에이 문제를 해결 한 방법은 동글, 원격 인증 서버 등과 같은 암호화 / 복호화를 처리하기 위해 외부 블랙 박스를 사용하는 것입니다.하지만 사용자가 자신의 시스템에 대한 전체 액세스 권한을 가지고 있다는 점을 감안할 때 어렵고 불가능하지는 않습니다. 온라인 게임 서버와 같이 “블랙 박스”에 저장된 기능에 제품을 직접 연결할 수 없다면.


답변

면책 조항 : 저는 보안 전문가가 아닙니다.

이것은 나쁜 생각처럼 들립니다. 누군가에게 당신이 제공 한 ‘숨겨진’키로 물건을 암호화하게합니다. 나는 이것이 안전 할 수 있다고 생각하지 않는다.

비대칭 키가 작동 할 수 있습니다.

  • 암호 해독을 위해 공개 키로 암호화 된 라이선스 배포
  • 고객이 새 라이선스를 생성하고 암호화를 위해 귀하에게 보내도록합니다.
  • 새 라이센스를 클라이언트로 다시 보냅니다.

확실하지는 않지만 클라이언트가 실제로 제공 한 공개 키로 라이센스 키를 암호화 할 수 있다고 생각합니다. 그런 다음 개인 키로 암호를 해독하고 다시 암호화 할 수도 있습니다.

당신은 당신이 실제로 바로 고객에서 물건을 받고 만들기 위해 고객 당 별도의 공개 / 개인 키 쌍을 유지할 수 – 지금 당신은 키에 대한 책임이 있습니다 …


답변

무엇을하든 ‘디 컴파일’될 수 있습니다. 그냥 분해하면됩니다. 또는 상수를 찾기 위해 메모리 덤프를보십시오. 컴퓨터가 그것들을 알아야하기 때문에 여러분의 코드도 알아야합니다.

이것에 대해 어떻게해야합니까?

키를 코드에서 하드 코딩 된 상수로 제공하지 마십시오. 사용자 별 설정으로 유지하십시오. 사용자가 해당 키를 관리하도록합니다.


답변

@jatanp : 또는 더 좋은 방법은 디 컴파일하고 라이선스 코드를 제거하고 다시 컴파일 할 수 있다는 것입니다. Java를 사용하면이 문제에 대한 적절한 해킹 방지 솔루션이 있다고 생각하지 않습니다. 사악한 작은 동글조차도 Java로 이것을 막을 수 없습니다.

내 비즈니스 관리자는 이것에 대해 걱정하고 너무 많이 생각합니다. 그러나 다시 우리는 라이선스 조건을 준수하는 경향이있는 대기업에 애플리케이션을 판매합니다. 일반적으로 빈 카운터와 변호사 덕분에 안전한 환경입니다. 라이센스가 올바르게 작성된 경우 자체 디 컴파일하는 행위는 불법 일 수 있습니다.

그래서 나는 당신이 당신의 응용 프로그램을 찾고있는 것처럼 정말로 강화 된 보호가 필요합니까? 고객 기반은 어떻게 생겼습니까? (기업? 아니면 10 대 게이머 대중, 어디가 더 문제가 될까요?)


답변

라이선스 솔루션을 찾고 있다면 TrueLicense API를 확인할 수 있습니다 . 비대칭 키 사용을 기반으로합니다. 그러나 애플리케이션이 크랙 될 수 없다는 의미는 아닙니다. 모든 애플리케이션은 충분한 노력으로 크랙 될 수 있습니다. 정말 중요한 것은 Stu가 대답 했듯이 귀하에게 얼마나 강력한 보호가 필요한지 파악하는 것입니다.


답변

효과적인 오프라인 불법 복제 방지 방법이 없다고 생각합니다. 비디오 게임 산업은 여러 번 시도해 왔으며 그들의 프로그램은 항상 크랙되었습니다. 유일한 해결책은 프로그램이 서버와 온라인으로 연결되어 실행되어야하므로 lincense 키를 확인할 수 있고 라이센스 사용자가 한 번에 하나의 활성 연결 만 있는지 확인할 수 있습니다. 이것이 월드 오브 워크래프트 또는 디아블로의 작동 방식입니다. 심지어 보안을 우회하기 위해 개발 된 개인 서버가 있습니다.

그렇긴하지만 중대형 기업이 불법 복제 소프트웨어를 사용한다고 생각하지 않습니다. 라이선스 비용이 적기 때문입니다 (아마도 프로그램에 대해 얼마나 많은 비용을 청구해야하는지 모르겠습니다). 평가판 비용.