-1

我在我的一个 java 产品中遇到了一个问题,其中玩家会运行一个作弊类作为主类。有没有一种方法可以检查主类是否正在运行?我尝试添加 UID,但他们似乎通过了它。

4

2 回答 2

0

这几乎不是一个健壮且防弹的解决方案,但您可以尝试查看线程的堆栈跟踪并确保您的类是最后一个元素:

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

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

但是,没有什么可以阻止有人使用与您的合法类相同的完全限定类名来编译一个类并替换您原来的类。

于 2013-06-12T13:15:09.030 回答
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 类使用适当的哈希算法会很复杂。

于 2013-06-12T14:17:30.527 回答