2009-11-09 3 views
3

자바 응용 프로그램 (소스없는 jar)에서 하드 코딩 된 연결 문자열을 수정하고 싶습니다.Java 바이트 코드 (jar)로 문자열 수정

jar을 역 컴파일 한 다음 원본을 변경하고 새 jar로 다시 컴파일 할 수 있다고 생각하지만이 방법이 더 빠릅니까?

편집 :

  • 그것은 독립 실행 형 응용 프로그램이 아닌 내가이 난독 화 된 의심 나는 내 자신의 코드
  • 에서로드 해요 항아리입니다 : 틈새 과학 응용 프로그램, 무단 저자.
  • 응용 프로그램도 충분를 실행하는 동안 "메모리"문자열을 수정 수반 솔루션,하지만 적합하지

답변

4

나는 코드는 난독 화되지 않은 제공, 디 컴파일 아마 가장 빠른 방법이라고 생각 디 컴파일/컴파일 왕복은 불가능합니다. 당신은 코드를 디 컴파일하여 어쨌든 연결 문자열을 찾을 것입니다. 따라서 이미 반쪽에 있습니다.

더 중요한 것은이 방법을 사용하여 연결 문자열을 속성 파일로 끌어 와서 한 번만 역 컴파일을 수행하면됩니다.

+2

물론 코드가 난독 화되지 않은 한. – Stroboskop

+0

문자열을 찾거나 코드를 적용하여 특성 파일에서 읽는 비트는 어느 것입니까? 문자열을 쉽게 사용할 수 있다면 (즉, 조각화되거나 난독 화되지 않는 경우) 속성 파일을 읽는 것이 어려울 것이라고 생각합니다. –

+0

디 컴파일과 다시 컴파일을 언급하고있었습니다. 메소드와 필드 이름에 대해 "new", "class"등과 같은 보호 된 이름을 사용하는 일부 난독 화기를 기억합니다. – Stroboskop

10

해당 jar를 사용하는 응용 프로그램에서는 reflection을 사용하여 연결 문자열을 설정할 수 있습니다. 반사는 개인 설정자에게도 사용 가능합니다.

분명히 setter가 public이면 분명히 반영 할 수 있습니다.

+1

브루노에 동의합니다. 반영은이 문제에 대한 최선의 해결책입니다. setter 메서드 또는 멤버 변수를 알고 싶지만 obv. 어쨌든 바이트 코드를 디 컴파일하거나 편집하는 경우이를 알 필요가 있습니다. – bguiz

+0

독립 실행 형 응용 프로그램이므로 프로그래밍 방식으로 수정하면 찾고자하는 대상이 아닙니다. – pufferfish

+1

필드 수정을 통해 안정적으로 작동하지 않을 수 있습니다. 예 : 필드가'public static final String' 인 경우 컴파일러에 의해 상수로 인라인되었을 수 있습니다. 나는 그것이 일어날 지 모르겠지만 ... – sleske

0

Jar 파일은 종종 압축되지 않기 때문에 주소가 Jar 파일에 일반 텍스트로 표시 될 가능성이 적습니다. 이전 주소와 새로운 문자가 같은 수의 문자를 사용한다면 바이너리 데이터를 두려워하지 않는 편집기 (Vim을 사용)를 사용하여 Jar를 편집하고 텍스트를 검색하고 변경하면됩니다. 그것은 원시적이지만 매우 간단합니다.

작동하지 않는 경우 다른 방법 중 하나가 필요합니다.

물론이 방법이 실패 할 경우에 대비하여 jar의 백업 복사본을 보관할 수 있습니다.

+0

Jar 압축 여부는 중요하지 않습니다. 그것은 단지 ZIP 압축이고, 단지 ZIP 도구를 사용하여 압축을 풀고 재 압축합니다. – sleske

0

jar 파일은 특정 구조의 ZIP 파일이므로 zip 도구 (WinZip 등)를 사용하여 클래스 파일을 추출 할 수 있습니다. 16 진수 편집기를 사용하여 클래스 파일을 수정합니다 (새 연결 문자열의 길이가 이전 것과 같으면 너무 어려워서는 안 됨). 그 후에 jar 파일로 다시 압축합니다.

물론 위에서 설명한 다른 모든 가능성이 작동하지 않는 경우에만 시도해야합니다.

0

난 당신이 이미 생각하지만, .jar 파일의 컴파일 방법을 이런 식으로 뭔가 보이는 경우, 아마 당신이 단순히 상속을 사용할 수 있습니다 가정 ...

공공 문자열 getConnectionString을() {

그러면 클래스를 확장하고 메서드를 재정의하여 새 문자열을 반환하고 대신 클래스를 사용하십시오. 분명히 수퍼 클래스가 final이 아니고 메서드가 final이 아니고 public 또는 protected (동일한 패키지 이름을 사용할 수있는 경우) 일 경우에만 작동합니다.