2012-08-21 3 views
2

최근 Gamecih라는 루트 사용자 용 앱을 사용하여 속이는 사람들에게 몇 가지 문제가있었습니다. Gamecih는 런타임에 게임을 일시 중지하고 변수를 변경합니다.ProGuard를 사용하여 난독 화 소스 코드

사기꾼이 런타임에 어떤 변수를 변경해야하는지 알기는 어려울 지 모르지만 코드를 이해하기 어렵지만 다른 문제가 발생할 수도 있습니다.

Javas Serializable 인터페이스를 사용하여 게임 객체를 직렬화 한 다음 파일에 기록합니다. 이제 "Player"클래스의 객체를 직렬화한다고 가정 해 보겠습니다. 직렬화되어 파일에 저장됩니다. 그런 다음 사용자가 Proguard 구현과 함께 업데이트를 다운로드합니다. Proguard는 클래스 및 클래스 멤버 이름의 이름을 바꿉니다. 이미 저장된 Player 객체를 읽을 때 중대한 오류가 발생하지 않습니까?

게임을 아직 시작하지 않은 경우 문제가되지 않습니다. 그러나 이제 일부 플레이어는 동일한 저장된 게임 (RPG)을 몇 달 동안 사용하고 있습니다. 그들은 업데이트를 다운로드하고 처음부터 다시 시작해야한다면 꽤 열 받게 될 것입니다.

나는 Proguard에게 특정 클래스를 난독 화하지 않도록 지시 할 수 있지만, 난 정말 난독 화해야하는 플레이어 클래스입니다.

명확한 설명 :의 나는 다음과 같은 간단한 읽을 수있게 클래스가 있다고 가정 해 봅시다 :

public class Player { 

    private int gold; 
    private String name; 
    //Lots more. 

    public Player(String name) 
    { 
     this.name = name; 
    } 
    public int getGold() { 
     return gold; 
    } 
    public void setGold(int gold) { 
     this.gold = gold; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 

플레이어는 직렬화 만들고 파일에 저장됩니다. 내가 난독을 구현 한 후에는 다음과 같습니다

public class Axynasf { 

    private int akdmakn; 
    private String anxcmjna; 

    public Axynasf(String adna) 
    { 
     anxcmjna=adna; 
    } 
    public int getAkdmakn() { 
     return akdmakn; 
    } 
    public void setAkdmakn(int akdmakn) { 
     this.akdmakn = akdmakn; 
    } 
    public String getAnxcmjna() { 
     return anxcmjna; 
    } 
    public void setAnxcmjna(String anxcmjna) { 
     this.anxcmjna = anxcmjna; 
    } 
} 

내가 지금 업데이 트와 Player가 읽을 수있게 버전이 해당 업데이트를 다운로드있는 플레이어를 게시 할 것을 상상해보십시오. 해당 Object를 읽으려고 할 때 다른 멤버 이름과 다른 클래스 이름이 있습니다. ClassCastException 또는 그와 비슷한 것을 얻을 가능성이 큽니다.

+1

왜곡 된 이유는 무엇입니까? 일부 게이머가 속이기를 원한다면, 마치 당신이나 다른 사람들에게 영향을주는 것과 같은 것이 아닙니다. – SJuan76

+1

@ SJuan76 : 글로벌 최고 점수 목록과 PvP 전투가 있기 때문에. – Emiam

+0

게임에 대한 좀 더 deatil 도움이 될 것입니다. 또한 나는 당신이 문제를 일으킬 수있는 클라이언트 쪽에서 무엇을하고 있는지 정확히 이해하지 못합니까? –

답변

1

Proguard의 전문가가 아니지만 직렬화를 중단한다고 가정하는 것이 맞다고 생각합니다.

이 문제를 해결할 수있는 방법 중 하나는 현재 저장 구조 위에 레이어를 구현하는 것일 수 있습니다. Proguard에게 어떤 클래스를 난독 화하지 말라고 알릴 수 있습니다. 플레이어 (및 모든 객체)는 현재 그대로두고 난독 화하지 않습니다. 오브젝트가 직렬화가 해제되면 새로운 레이어 (난독 화됨)로 전달하여 게임의 나머지 부분을 처리합니다. 난독 화되지 않은 오브젝트를 유지하지 않으면 사기꾼이 문제를 일으킬 수 있습니다. 게임을하는 동안 (로드 타임이 아님). 동시에 플레이어의 게임 파일을 직렬화에 의존하지 않는 다른 저장 옵션으로 옮길 수 있습니다. 이렇게하면 나중에 이러한 문제를 쉽게 처리 할 수 ​​있습니다.자바에서 다른 클래스에 직렬화 된 클래스를 업그레이드

:

ProGuard에서의 호환 직렬화를 보장
+0

플레이어 (파일에 저장된대로)를 obPlayer (정확한 사본이지만 난독 화)로 확장 할 수 있으므로 실제로는 조용해야합니다. 그러나 저장된 파일에서 플레이어가 데이터를 변경하는 것을 중지하지 마십시오. – Elemental

1

  • JDK 문서 > 직렬화> 객체 입력 클래스> readResolve

  • JDK 문서> 연재> 객체 직렬화 예> 진화/대체

+1

게시해야한다는 점에 유의하십시오. 여기에있는 답변의 유용한 점,이 사이트 또는 게시물이 [ "답변하지 않음] (http://meta.stackexchange.com/q/8259)으로 삭제 될 위험이 있습니다. 원하는 경우 링크를 포함 할 수 있지만 '참조'로만 사용하십시오. 대답은 링크가 필요없이 독자적으로 서 있어야합니다. –

1

나는 앱 /라는 이름 승 PPL은 바르의 @ 런타임을 업데이트 할 수 있습니다 이해합니다.

멤버 이름을 변경하면 값이 계속 힌트를 제공합니다. 난독 화되면 클래스 이름이 변경되지만 새 이름은 포럼에서 끝납니다. 이렇게 충분하지 않습니다.

업데이트 할 때 수행 할 수있는 작업은 시작시 직렬화 된 데이터를 이전 객체에로드하고 "새로운"난독 화 클래스로 전송하거나 사용자 정의 직렬화를 사용하거나 (deviceID 값을 사용하여 XOR하거나 Gmail은 덜 명백하게하기 위해 주소를 지정합니다).

플레이어 데이터도 여러 클래스로 만들어보십시오.

0

내가 당신의 상황에서 어떻게 할 것인지 :

  1. 출시 난독 화 및 비 난독 클래스 업데이 트. 플레이어가로드되면 두 클래스 모두에서 시도합니다. 플레이어가 non-obf로로드 된 경우 그런 다음이 클래스를 난독 화 클래스에 매핑합니다.
  2. 플레이어가 저장되면 난독 화 클래스로 저장됩니다.
  3. 적절한 시간이 지나면 난독 화 된 클래스만으로 업데이트가 해제됩니다.