2016-06-03 5 views
1

배치 파일 (java -jar ..)로 실행되는 상업용 jar는 우리의 서명과 함께 배포됩니다. NOT은 JNLP로 트리거됩니다. 또한 추가 타사 라이브러리가 포함되어 있습니다. 악의적 인 사용자가 Java 클래스를 대체하면 서명 불일치로 인해 jar가 실행을 중지합니다. 그러나 그가 MANIFEST 파일을 항아리에서 제거하면 더 이상 검사가 없습니다. 어떤 클래스가 바뀌거나 바뀌면 어떻게 프로그램이 실행되는 것을 막을 수 있습니까? Verifying Jar Signature 차감 한 금액으로 하나의 옵션은 자바 소스에서 매니페스트 파일을 확인 할 수 How to verify a jar signed with jarsigner programmatically 같은 자바가 jar 파일의 인증서 파일 (매니페스트)을 변조하는 것을 방지합니다.

jarFile jar = new JarFile(new File("path/to/your/jar-file")); 

// This call will throw a java.lang.SecurityException if someone has tampered 
// with the signature of _any_ element of the JAR file. 
// Alas, it will proceed without a problem if the JAR file is not  signed at all 
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF")); 
Manifest manifest = new Manifest(is); 

로도

manifest.getCodeSigners(); 

등 CodeSigners을 확인하지만 무슨 일이 일어날 때를 시도하는 사람 항아리를 깨고, 디 컴파일을 수행합니다 (예를 들어 jad를 사용)? 디 컴파일을 막기 위해 일부 obfuscator를 적용했지만 디 컴파일 할 때 메서드 이름이 변경 되더라도 논리를 볼 수 있습니다. 그래서 난독 화는 충분하지 않습니다.

제안 사항은 무엇입니까? 좋은 접근법은 반사 API와 같은 복잡한 코드 검사 코드 작성, 왜곡 된 데이터 추가, goto로 된 일부 spagetti 코드 또는 디 컴파일러를 성공적으로 만들지 못하게하는 매니 페스트 변조를 방지하기위한 다른 절차를 조언 할 수 있습니까? 난 obfuscator에서 옵션을 확인했지만 난독 화 단계를 개선하고 강화하기 위해 코드 작성 단계에서 무엇을 할 수 있습니까?

+1

내가 한 일은 내 공개 키를 코드에 삽입하고 해당 공개 키를 사용하여 서명을 확인하는 것입니다. 다시 말하지만 완벽하지는 않습니다. 아무 것도 없지만 더 강력합니다. 그리고 거기에있는 명단과 인증서에 의존합니다. – EJP

답변

1

내가 아는 한 지금까지는이 문제에 대한 완벽한 해결책이 없습니다. this을 읽을 수 있지만 문제는 비슷합니다. 지금까지는 난독 화가 아마도 가장 쉬운 노력 일 것입니다. 내 말은, 코드 obfuscator를 사용하는 것뿐만 아니라 크래커가 논리 및 메서드 호출을 쉽게 추적 할 수 없도록 알고리즘을 숨기는 이상한 논리를 코딩하는 것입니다.