2013-06-12 14 views
-1

我的一個java產品中有一個問題,其中玩家將運行一個作弊類作爲主類。有沒有辦法讓我可以檢查正在運行的主要類?我嘗試添加一個UID,但他們似乎已經過去了。對於主類的Java檢查

回答

0

這很難說是一個強大的和防彈的解決方案,但你可以嘗試看着線程的堆棧跟蹤,並確保你的類是最後一個元素:

final StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 

if (! stack[stack.length-1].getClassName().equals(YourClass.class.getName())) 
{ 
    // abort 
} 

然而,沒有什麼可以阻止別人編譯一個具有與您的合法課程相同的完全合格課程名稱並替換原來的課程的課程。

+0

只是讓它有點難。你不能檢查他們是否將你的課程作爲主要課程。 Java的工作方式幾乎總是可以欺騙的東西。他們只能這樣做,也許強制的事情是完全混淆你的代碼,並且很難不使用你自己的主類。 – Peter

+0

@Peter:很清楚,你是說他們可以編譯一個具有相同FQCN權限的類?這是真的......我同意這個問題可能無法解決給予Java動態加載和鏈接類的方式。 –

+0

@GregKopff怎麼樣,如果他們使用2個主類,就像一個類跑到搜索主類一樣? –

0

我想你可以使用這樣的事情,

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 

import org.apache.commons.io.IOUtils; 

public class Checker { 
    private static final String HASH_MAIN_CLASS = "Hash of your valid Main class"; 

    public boolean isExecutingValidMainClass() throws IOException{ 
    StackTraceElement[] stack = Thread.currentThread().getStackTrace(); 
    String mainClassName = stack[stack.length-1].getClassName(); 

    String pathToMainClass = mainClassName.replaceAll("\\.", File.separator) + ".class"; 

    InputStream inputStream = AppMain.class.getClassLoader().getResourceAsStream(pathToMainClass); 

    byte[] mainClassBytes = IOUtils.toByteArray(inputStream); 

    if(HASH_MAIN_CLASS.equals(byteArrayHash(mainClassBytes))){ 
     return true; 
    }else{ 
     return false; 
    } 
    } 

    private String byteArrayHash(byte[] byteArray){ 

    //Calculate hash for byte array 

    //Return hash for byte array 

    } 
} 

這是不可能不犯錯,但他們將不得不編譯作弊主類相同的哈希,你的主類。使用一個合適的哈希算法會使用一個作弊主類很複雜。

+1

不幸的是,這與所討論的其他所有解決方案都有同樣的問題:用一個指示類替換檢查的類,或者取消檢查程序的類是微不足道的。 –