Java检查主类

Java检查主类,java,mainclass,Java,Mainclass,我的一个java产品出现了一个问题,在这个问题中,玩家会运行一个作弊类作为主类。有什么方法可以让我检查主类的运行情况吗?我已经尝试添加UID,但他们似乎已经通过了。这并不是一个健壮的防弹解决方案,但您可以尝试查看线程的堆栈跟踪,并确保您的类是最后一个元素: final StackTraceElement[] stack = Thread.currentThread().getStackTrace(); if (! stack[stack.length-1].getClassName().equ

我的一个java产品出现了一个问题,在这个问题中,玩家会运行一个作弊类作为主类。有什么方法可以让我检查主类的运行情况吗?我已经尝试添加UID,但他们似乎已经通过了。

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

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

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

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

我认为您可以使用这样的方法

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

  }
}

这不是绝对正确的,但是他们必须使用与主类相同的散列编译一个作弊主类。使用适当的散列算法使用作弊主类会很复杂。

这只会让它变得有点困难。您无法检查他们是否将您的类用作主类。Java的工作方式几乎总是有可能伪造东西。你唯一可以强制执行的方法是完全混淆你的代码,让你很难不使用自己的主类。@彼得:说清楚,你是说他们可以编译一个具有相同FQCN的类,对吗?没错。。。我同意,考虑到Java动态加载和链接类的方式,这个问题可能无法解决。@GregKopff,如果他们使用两个主类,比如运行一个类来搜索主类,该怎么办?@Charles先生:我不理解你的评论-只有一个“主类”如果您将“main class”定义为JVM入口点。@GregKopff他们正在使用一个反射客户端,在该客户端中查找我的主类。但是,他们把reflect类作为主类运行,而不是我的主类。很抱歉,如果我可能会引起混淆的话。不幸的是,这与讨论的所有其他解决方案都存在相同的问题:用一个指示的类替换进行检查的类,或者删除调用检查程序的类,都是微不足道的。