我在我的一个java产品中遇到了问题,其中玩家将作为主类运行作弊类。有没有办法检查主类运行?我已经尝试添加UID,但他们似乎已经过了它。
答案 0 :(得分:0)
这不是一个强大且无懈可击的解决方案,但您可以尝试查看线程的堆栈跟踪并确保您的类是最后一个元素:
final StackTraceElement[] stack = Thread.currentThread().getStackTrace();
if (! stack[stack.length-1].getClassName().equals(YourClass.class.getName()))
{
// abort
}
但是,没有什么可以阻止某人使用与合法类相同的完全限定类名编译类并替换原始类。
答案 1 :(得分: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
}
}
这不是绝对可靠的,但是他们必须使用与Main类相同的哈希编译作弊Main类。使用欺骗Main类,使用适当的哈希算法会很复杂。