我的一個java產品中有一個問題,其中玩家將運行一個作弊類作爲主類。有沒有辦法讓我可以檢查正在運行的主要類?我嘗試添加一個UID,但他們似乎已經過去了。對於主類的Java檢查
-1
A
回答
0
這很難說是一個強大的和防彈的解決方案,但你可以嘗試看着線程的堆棧跟蹤,並確保你的類是最後一個元素:
final StackTraceElement[] stack = Thread.currentThread().getStackTrace();
if (! stack[stack.length-1].getClassName().equals(YourClass.class.getName()))
{
// abort
}
然而,沒有什麼可以阻止別人編譯一個具有與您的合法課程相同的完全合格課程名稱並替換原來的課程的課程。
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
不幸的是,這與所討論的其他所有解決方案都有同樣的問題:用一個指示類替換檢查的類,或者取消檢查程序的類是微不足道的。 –
相關問題
- 1. 檢查Java中對象的子類
- 2. 檢查python中的java對象類型
- 3. 檢查對象是否屬於Java中的類
- 4. 對於理解類型檢查
- 5. 檢查設備類型對於GPUImage
- 6. 相對主要檢查?
- 7. SQL,JAVA查詢檢索基於所有列的主鍵
- 8. 檢查對象等於存儲在java對象中的數據
- 9. 檢查類對象
- 10. 檢查主java類中面板的事件
- 11. 爲什麼SBT不能檢測Java中的主類? (沒有檢測到主類)
- 12. 關於Java主題的查詢
- 13. 在java中檢查對象是否等於不等於覆蓋
- 14. Java 8類型檢查Collectors.groupingBy
- 15. 如何檢查一類JAVA
- 16. Java WatchEvent檢查類型?
- 17. Java和Python類型檢查
- 18. Java反射getDeclaredMethod類檢查
- 19. 的WordPress:主題檢查 - 對ENVATO
- 20. 尋找類似於Java中的拼寫檢查器的API
- 21. 檢查值對於給定
- 22. 檢查模擬對象的類類型
- 23. NSPredicate檢查對象類別的種類
- 24. 檢查持有Java對象的引用的類名稱
- 25. 關於對象聲明和健全性檢查的Java /處理
- 26. 對於一個Java類
- 27. OCaml:類型檢查對象
- 28. 如何檢查對象類
- 29. 檢查facebook對象類型
- 30. 檢查對象類型
只是讓它有點難。你不能檢查他們是否將你的課程作爲主要課程。 Java的工作方式幾乎總是可以欺騙的東西。他們只能這樣做,也許強制的事情是完全混淆你的代碼,並且很難不使用你自己的主類。 – Peter
@Peter:很清楚,你是說他們可以編譯一個具有相同FQCN權限的類?這是真的......我同意這個問題可能無法解決給予Java動態加載和鏈接類的方式。 –
@GregKopff怎麼樣,如果他們使用2個主類,就像一個類跑到搜索主類一樣? –