문제

리버스 엔지니어링 할 수없는 형식으로 Java 프로그램을 배포하는 방법이 있습니까?

응용 프로그램을 실행 가능한 JAR 파일로 변환하는 방법을 알고 있지만 코드를 리버스 엔지니어링 할 수 없거나 최소한 쉽지 않은지 확인하고 싶습니다.

소스 코드의 난독 화는 계산되지 않습니다 ... 코드를 이해하기 어렵지만 숨기지 않습니다.

관련 질문은입니다 분해를 방지하기 위해 컴파일 된 Java 클래스를 잠그는 방법은 무엇입니까?


프로그램을 완료하면 원래 소스에 여전히 액세스 할 수 있으므로 응용 프로그램을 유지하는 것은 문제가되지 않습니다. 응용 프로그램이 배포되면 사용자가 디 컴파일 할 수 있기를 원하지 않습니다. Obfuscation은 사용자가 여전히 소환 할 수 있으므로이를 달성하지 못하고 작업 흐름에 따라 어려움을 겪지 만 코드를보고 잠재적으로 정보를 제거 할 수 있습니다.

내가 걱정하는 것은 원격 액세스와 관련된 코드에 정보가 있는지 여부입니다. 응용 프로그램이 사용자가 제공 한 사용자 ID 및 비밀번호를 사용하여 연결하는 호스트가 있습니다. 해당 주소가 소스 코드 내부에있는 경우 사용자로부터 호스트의 주소를 숨길 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

항아리 파일을 난독화할 수 있습니다 yguard. 소스 코드를 난독 화하지 않습니다, 그러나 컴파일 된 클래스이므로 나중에 코드를 유지하는 데 아무런 문제가 없습니다.

문자열을 숨기려면 문자열을 암호화하여 소스 코드를 보는 것을 어렵게 만들 수 있습니다 (JAR 파일을 난독 화하는 경우 더 좋습니다).

다른 팁

짧은 대답은 "아니오, 존재하지 않습니다"입니다.

리버스 엔지니어링은 코드를 전혀 보지 않는 프로세스입니다.. 기본적으로 기본 메커니즘을 이해하고 모방하려고 노력하고 있습니다. 예를 들어, Code에 액세스하지 않고 Netscape의 JavaScript 동작을 복사하여 MS Labs에서 JScript가 나타납니다. 사본은 너무 완벽하여 버그조차 복사되었습니다.

타겟팅하는 플랫폼을 알고 있다면 Java를 다음과 같이 기본 코드로 컴파일하는 것을 얻으십시오. Excelsior Jet 또는 GCJ.

그 결과, 사용자는 항상 바이트 코드를 가지고 있고 Jad 그것.

당신은 핵심 언어의 일부로 성찰이있는 언어로 쓰고 있습니다. 그것은 생성됩니다 .class 사양이 널리 알려진 파일 (따라서 다른 공급 업체는 Java 컴파일러 및 통역사의 클린 룸 구현을 생성 할 수 있습니다).

이것은 공개적으로 이용 가능한 디 컴파일러가 있음을 의미합니다. 필요한 것은 몇 가지 Google 검색 뿐이며 귀하와 동일한 작업을 수행하는 Java 코드가 있습니다. 주석이없고 변수 이름 중 일부 (그러나 함수 이름은 동일하게 유지됨).

실제로, 난독 화는 당신이 얻을 수있는 모든 것입니다 (어쨌든 통합 된 코드는 이미 약간 난독 화 될 것입니다).

해석 된 언어를 사용하지 않습니까? 어쨌든 당신은 무엇을 보호하려고합니까? 충분히 가치가 있다면 역 엔지니어링 할 수 있습니다. 대부분의 프로젝트를 리버스 엔지니어링하기에 충분히 배려 할 가능성은 최소화됩니다. 난독 화는 최소한의 장애물을 제공합니다.

당신을 확인하십시오 지적 재산권 (IP)는 다른 메커니즘을 통해 보호됩니다. 특히 보안 코드의 경우 사람들이 구현을 검사하여 보안이 소스가 아닌 알고리즘에 있도록하는 것이 중요합니다.

나는 당신이 왜 이것을하고 싶은지 물어보고 싶어하지만, 나는 그것을 내버려 둘 것입니다 ...

내가 보는 문제는 CLR과 마찬가지로 JVM이 JIT 컴파일 및 실행을 위해 코드를 포함 할 수 있어야한다는 것입니다. 당신은 그것을 "복잡"하게 만들 수 있지만 바이트 코드의 사양이 다소 잘 문서화되어 있으며 x86 어셈블러 사양과 같은 것보다 훨씬 높은 수준으로 존재한다는 점을 감안할 때 프로세스 흐름을 "숨길 수는 없을 것입니다. 프로그램이 처음에 일할 수 있도록하기 위해.

할 수 없습니다.

컴파일 할 수있는 모든 것을 컴파일 할 수 있습니다. 당신이 할 수있는 최선은 지옥을 난독 화하는 것입니다.

즉, 양자 암호화에는 흥미로운 일이 일어나고 있습니다. 본질적으로 메시지를 읽으려고 시도하면 변경됩니다. 이것이 소스 코드에 적용될 수 있는지 모르겠습니다.

코드를 기본 기계 언어로 컴파일하더라도 본질적으로 어셈블리 언어로 소환하고 프로세스 흐름 (OLYDBG, IDA PRO)을 따라갈 수있는 모든 종류의 프로그램이 있습니다.

웹 서비스로 만듭니다. 그러면 소스 코드를 볼 수있는 유일한 사람입니다.

할 수 없습니다. 이것은 Java 문제가 아닙니다. 편집 할 수있는 모든 언어는 Java를 위해 소환 될 수 있습니다. 더 쉽습니다.

당신은 누군가에게 실제로 보여주지 않고 사진을 보여 주려고 노력하고 있습니다. 불가능합니다. 응용 프로그램 수준에서 숨어 있어도 호스트를 숨길 수도 있습니다. 누군가는 여전히 그것을 통해 그것을 잡을 수 있습니다 Wireshark 또는 다른 네트워크 스나이퍼.

누군가 위에서 말했듯이 리버스 엔지니어링은 항상 실행 파일을 소환 할 수 있습니다. 소스 코드 (또는 알고리즘)를 보호하는 유일한 방법은 실행 파일을 배포하지 않는 것입니다.

애플리케이션을 서버 코드와 클라이언트 앱으로 분리하고 서버 코드에서 알고리즘의 중요한 부분을 숨기고 클라우드 서버에서 실행하고 데이터 게터 및 센터로만 작동하는 클라이언트 코드를 배포하십시오.

이를 통해 클라이언트 코드조차 해제됩니다. 당신은 아무것도 잃지 않습니다.

그러나 확실히 이것은 성능과 사용자 편의성을 줄입니다.

나는 이것이 당신이 찾고있는 대답이 아니라 소스 코드를 보호한다는 다른 아이디어를 제기하기 위해 생각할 수 있다고 생각합니다.

어느 시점에서 해석 된 모든 것이 "명확하게"처리되어야합니다. 코드가 JAD를 통해 실행되면 문자열이 날짜가 명확하게 나타납니다. 앱으로 암호화 키를 배포하거나 기본 Ceasar 암호를 수행하여 호스트 연결 정보를 암호화하고 런타임에 해독 할 수 있습니다 ...

그러나 처리하는 동안 어느 시점에서 호스트 연결 정보는 앱이 호스트에 연결하려면 명확하게 설정해야합니다 ...

따라서 정적으로 숨길 수 있지만 디버거를 실행하면 런타임 중에 숨길 수 없습니다.

이건 불가능 해. CPU는 프로그램을 실행해야합니다. 즉, 프로그램은 CPU가 이해할 수있는 형식이어야합니다. CPU는 인간보다 훨씬 멍청합니다. Ergo, CPU가 귀하의 프로그램을 이해할 수 있다면 인간은 할 수 있습니다.

코드를 숨기는 것에 대한 우려가 있으면 나는 실행할 것입니다 대리자 그래도.

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