2008-09-29 8 views
4

리버스 엔지니어링 할 수없는 형식으로 Java 프로그램을 배포 할 수 있습니까?리버스 엔지니어링 할 수없는 Java 프로그램 만들기

내 응용 프로그램을 실행 가능한 JAR 파일로 변환하는 방법을 알고 있지만 코드를 리버스 엔지니어링 할 수 없거나 적어도 그렇게 쉽게 만들 수 없도록하고 싶습니다.

소스 코드의 난독 화는 중요하지 않습니다 ... 코드를 이해하기 어렵지만 숨길 수는 없습니다.

이와 관련된 질문은 여전히, 원본 소스에 액세스 할 것이다 그래서 응용 프로그램을 유지하는 것은 문제가되지 않을 것, How to lock compiled Java classes to prevent decompilation?

나는이 프로그램을 완료하면

입니다. 응용 프로그램이 배포되는 경우 사용자가 해당 응용 프로그램을 디 컴파일 할 수 없기를 바랍니다. 난독 화는 사용자가 여전히 디 컴파일 할 수 있기 때문에이를 달성하지 못하며 조치 흐름을 따르는 데 어려움이 있지만 코드를보고 잠재적으로 정보를 가져올 수 있습니다.

원격 액세스와 관련된 코드에 정보가있는 경우 걱정됩니다. 사용자가 제공 한 사용자 ID와 암호를 사용하여 응용 프로그램이 연결되는 호스트가 있습니다. 그 주소가 소스 코드 안에 있다면 사용자의 호스트 주소를 숨기는 방법이 있습니까?

+0

이미 여기에서 질문했습니다. 여기에 이미 문의되었습니다 : http://stackoverflow.com/questions/49379/how-to-lock-compiled-java-classes-to-prevent-decompilation – Craig

+0

왜 중요한가요? 사용자가 연결중인 IP 주소에서 데이터베이스 서비스를 실행하고 있는지 모를 것입니까? – user359996

답변

11

YGuard으로 JAR 파일을 난독화할 수 있습니다. 소스 코드는이지만 컴파일 된 클래스는 난독 화되지 않으므로 나중에 코드를 유지 관리하는 데는 문제가 없습니다.

일부 문자열을 숨기려면 암호화 할 수 있으므로 소스 코드를 살펴 보는 것이 더 어려워집니다 (JAR 파일을 난독 화하면 더 좋습니다).

+4

그는 소스 코드 난독 화 때문에 소스 코드와 아무런 관련이없는 결과 jar 클래스를 난독 화한다고 말하고 있습니다. – albertein

+0

실제로 바이너리 난독 화가 허용됩니다. 그렇지 않다면, 그의 질문은 정말로 "어떻게 코드를 난처하게 할 수 있습니까?"라고 나는 obfuscator를 사용할 수 없다. 바이너리 난독 화는 완벽하지는 않지만 당신이 얻는 것만 큼 좋다. – jsight

+0

나는 그가 생성 된 바이트 코드의 난독 화를 의미한다고 생각하지만, 명확하게 편집해야한다. 난독 화 된 바이트 코드는 여전히 리버스 엔지니어링 할 수 있지만 꽤 형식은 아닙니다. – JeeBee

2

난 당신이 왜 이렇게하는 것을 원하는지 물어 유혹 해요,하지만 난 ... 혼자

나는 JVM이의 CLR처럼 할 수 있어야한다는 것입니다 볼 수있는 문제를 떠날거야 intrepert에 JIT를 컴파일하고 실행하려면 코드를 작성하십시오. 더 복잡하게 만들 수는 있지만 바이트 코드에 대한 사양이 문서화되어 있고 x86 어셈블러 사양보다 훨씬 높은 수준에 존재한다는 점을 감안할 때 프로세스 흐름을 "숨길"수는 없습니다. 처음부터 프로그램이 작동하기를 바랍니다.

7

핵심어의 일부로 내정을 가진 언어로 작성하고 있습니다. 이는 사양이 널리 알려져있는 파일을 .class으로 생성합니다 (따라서 다른 공급 업체가 Java 컴파일러 및 해석기의 클린 룸 구현을 제작할 수 있습니다).

이것은 공개적으로 사용 가능한 디 컴파일러가 있음을 의미합니다. 소요되는 모든 작업은 Google 검색으로 이루어진 것입니다. 귀하의 것과 동일한 작업을 수행하는 Java 코드가 있습니다. 주석이없고 변수 이름 중 일부 (함수 이름은 동일하게 유지됨).

정말로, 난독 화는 C 또는 일부 완전히 컴파일 된 언어로 갈 필요없이 (디 컴파일 된 코드는 이미 약간 혼란 스러울지라도) 얻을 수있는 모든 것입니다.

8

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

사용자가 항상 사용자의 바이트 코드를 가지고 있으며 Jad이므로 소스 코드를 숨길 수는 없습니다.

+0

. 그것은 저작권 '관리'와 같습니다. 당신은 당신의 컴퓨터가 그것을 읽을 수 있고 (그리고 그것을 실행시킬 수 있도록) 프로그램을주고 싶지만, 사용자가 그것을 읽고 복사하는 것을 원하지는 않을 것입니다. 꽤 부 자연스러운 일입니다. – helios

+0

Java를 원시 코드로 컴파일하는 것이 유일한 현실적인 솔루션 인 것으로 보이며 난독 화보다 낫습니다. – KJW

1

할 수 없습니다.

컴파일 할 수있는 모든 항목을 디 컴파일 할 수 있습니다. 당신이 할 수있는 최선의 방법은 지옥을 혼란스럽게 만드는 것입니다.

그렇다면 Quantum Cryptography에는 흥미로운 점이 있습니다. 기본적으로 메시지를 읽으려는 시도는 메시지를 변경합니다. 이것이 소스 코드에 적용될 수 있는지 여부는 알 수 없습니다.

+0

프로세서가 그것을 읽지 못하게하는 한, 확실합니다.) – tloach

+1

글쎄, 그건 안전 할거야. 그렇지 않을거야. –

15

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

리버스 엔지니어링이란 코드을 전혀 암시하지 않는 프로세스입니다. 기본적으로 기본 메커니즘을 이해하고이를 모방하려고합니다. 예를 들어 MS 연구소의 JScript는 코드에 액세스하지 않고 Netscape의 JavaScript 동작을 복사하여 표시합니다. 복사본이 너무 완벽하여 버그도 복사되었습니다.

+0

Gizmo, 내 의견을 삭제하거나 수정해야한다고 생각합니다. 이 질문을 읽는 누군가는 Elie가 쉬운 편집 취소를 막을 수있는 방법을 찾고 있음을 이해합니다. 당신은 머리카락을 쪼개고 있고 그것은 정말로 대답이 아닙니다. 또는 올바른 구문을 포함하도록 의견을 업데이트 할 수 있습니다. Pls 도움이! –

+6

미안하지만 나는 그렇게하지 않을 것이다. 나는 틀린 질문에 잘못된 대답을하는 것보다 좋은 질문에 좋은 대답을하는 것을 선호한다. 특히 AlbertEin의 답변이 "현재 누군가가 URL을 찾지 못하도록 막는 것" 디 컴파일 된 코드 ". – gizmo

+2

* 의도 된 * 질문에 답하고 * 리터럴 * 질문의 단점을 설명하는 주석을 추가 할 수 있습니다. – user359996

3

해석 된 언어를 사용하지 마십시오? 어쨌든 당신은 무엇을 보호하려고합니까? 가치가 충분하다면 리버스 엔지니어링이 가능합니다. 대부분의 프로젝트를 리버스 엔지니어링 할만큼 충분히 돌보는 사람은 거의 없습니다. 난독 화는 적어도 최소한의 장애물을 제공합니다.

intellectual property (IP)이 다른 메커니즘을 통해 보호되어 있는지 확인하십시오. 특히 보안 코드의 경우 사람들이 구현을 검사하여 보안이 소스가 아닌 알고리즘에 있음을 확인하는 것이 중요합니다.

1

코드를 원시 기계 언어로 컴파일해도 어셈블리 언어로 디 컴파일하여 프로세스 흐름 (OlyDbg, IDA Pro)을 따르는 모든 종류의 프로그램이 있습니다.

1

웹 서비스로 만드십시오. 그럼 당신은 소스 코드를 볼 수있는 유일한 사람입니다.

0

어떤 점에서 해석되면 무엇이든 "깨끗한 상태"로 처리되어야합니다. 코드가 JAD를 통해 실행되면 문자열이 명확하게 표시됩니다. 앱과 함께 암호화 키를 배포하거나 기본 ceasar 암호를 사용하여 호스트 연결 정보를 암호화하고 런타임에 해독 할 수 있습니다 ...

그러나 처리하는 동안 어느 시점에서 호스트 연결 정보를 순서대로 정리해야합니다 앱이 호스트에 연결하는 ...

그래서 당신은 정적으로 숨길 수 있지만, 디버거

+0

JAD가 Java 5 코드 이상에서는 제대로 작동하지 않습니다. –

0

이 불가능를 실행하면 런타임 동안 그것을 숨길 수 없습니다. CPU는 프로그램을 실행해야합니다. 즉, 프로그램은 CPU가 이해할 수있는 형식이어야합니다. CPU는 인간보다 훨씬 못마땅합니다. Ergo, CPU가 프로그램을 이해할 수 있다면 인간이 할 수 있습니다.

1

할 수 없습니다. 이것은 Java 문제가 아닙니다. 컴파일 할 수있는 모든 언어는 Java 용으로 디 컴파일 될 수 있습니다.

누군가 실제로 그림을 표시하지 않고 사진을 보여 주려고합니다. 그것은 불가능합니다. 응용 프로그램 수준에서 숨기더라도 호스트를 숨길 수는 없습니다. 누군가는 Wireshark 또는 다른 네트워크 스니퍼를 통해 계속 그레이핑 할 수 있습니다.

0

코드 숨기기에 대한 염려가있어 어쨌든 ProGuard을 실행합니다.

0

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

응용 프로그램을 서버 코드와 클라이언트 응용 프로그램으로 분리하고 서버 코드에서 알고리즘의 중요한 부분을 숨기고 클라우드 서버에서 실행하면 데이터 수집기 ​​및 senter로만 작동하는 클라이언트 코드를 배포하면됩니다.

이렇게해도 클라이언트 코드가 디 컴파일됩니다. 너는 아무것도 잃지 않는다.

하지만 성능 및 사용자 편의성이 저하됩니다.

나는 이것이 당신이 찾고있는 해답이 아닐지 모르지만 단지 소스 코드를 보호한다는 다른 생각을 제기하는 것이라고 생각한다.