[FEATURE] Базовые проверки HWID на лживость

This commit is contained in:
Gravit 2019-10-16 22:40:36 +07:00
parent f0a235f12c
commit cd4e89dc15
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
5 changed files with 118 additions and 20 deletions

View file

@ -41,11 +41,6 @@ public OshiHWID toHWID()
return oshi; return oshi;
} }
@Override
public String getSerializeString() {
return toHWID().getSerializeString();
}
@Override @Override
public int getLevel() { public int getLevel() {
return toHWID().getLevel(); return toHWID().getLevel();
@ -60,4 +55,9 @@ public int compare(HWID hwid) {
public boolean isNull() { public boolean isNull() {
return toHWID().isNull(); return toHWID().isNull();
} }
@Override
public void normalize() {
}
} }

View file

@ -1,11 +1,14 @@
package pro.gravit.launcher.hwid; package pro.gravit.launcher.hwid;
public interface HWID { public interface HWID {
String getSerializeString();
int getLevel(); //Уровень доверия, насколько уникальные значения int getLevel(); //Уровень доверия, насколько уникальные значения
int getAntiLevel(); //Уровень лживости, насколько фальшивые значения
int compare(HWID hwid); int compare(HWID hwid);
boolean isNull(); boolean isNull();
void normalize();
} }

View file

@ -0,0 +1,71 @@
package pro.gravit.launcher.hwid;
public class HWIDCheckHelper {
public static int checkString(String str)
{
int result = 0;
//Считаем символы
char lastChar = '\0';
int combo = 0;
int maxCombo = 0;
//Считаем род символов
int lastCharType = -1;
int lastCharTypeCombo = 0;
int wtfCharTypeCombo = 0;
boolean skipLastCharType = true;
for(char c : str.toCharArray())
{
if(c == lastChar || Math.abs(c - lastChar) == 1 ||
( ( lastChar == '0' || lastChar == '9' ) && ( c == 'A' || c == 'a' ))) //Переход с 0 или 9 на A или a
{
lastChar = c;
combo++;
}
else
{
if(maxCombo < combo)
maxCombo = combo;
lastChar = c;
combo = 1;
}
int charType = getCharType(c);
if(lastCharType == charType) {
lastCharTypeCombo++;
//Нам подсунули серию из идущих подряд спец символов. Что за?
if((charType == -1 || charType == 3) && lastCharTypeCombo > 2)
{
wtfCharTypeCombo+=3;
}
//Нам подсунули серию из слишком большого числа идущих подряд чисел. Что за?
if((charType == 0) && lastCharTypeCombo > 4)
{
wtfCharTypeCombo++;
}
}
else
{
if(skipLastCharType && ( charType == -1 || charType == 3 ))
{
skipLastCharType = false;
}
else
{
skipLastCharType = true;
lastCharType = charType;
}
}
}
//Считаем результат
if(maxCombo > 3) result+= maxCombo * 3;
if(wtfCharTypeCombo > 1) result+= wtfCharTypeCombo * 2;
return result;
}
public static int getCharType(char c)
{
if(c >= '0' && c <= '9') return 0;
if(c >= 'A' && c <= 'Z') return 1;
if(c >= 'a' && c <= 'z') return 2;
if(c == ' ' || c == '-' || c == '_') return 3;
return -1;
}
}

View file

@ -1,16 +1,17 @@
package pro.gravit.launcher.hwid; package pro.gravit.launcher.hwid;
public class NoHWID implements HWID { public class NoHWID implements HWID {
@Override
public String getSerializeString() {
return "";
}
@Override @Override
public int getLevel() { public int getLevel() {
return 0; return 0;
} }
@Override
public int getAntiLevel() {
return 0;
}
@Override @Override
public int compare(HWID hwid) { public int compare(HWID hwid) {
return 0; return 0;
@ -20,4 +21,9 @@ public int compare(HWID hwid) {
public boolean isNull() { public boolean isNull() {
return true; return true;
} }
@Override
public void normalize() {
//Skip
}
} }

View file

@ -20,23 +20,23 @@ public class OshiHWID implements HWID {
@LauncherAPI @LauncherAPI
public String macAddr; public String macAddr;
@Override
public String getSerializeString() {
return gson.toJson(this);
}
@Override @Override
public int getLevel() //Уровень доверия, насколько уникальные значения public int getLevel() //Уровень доверия, насколько уникальные значения
{ {
int result = 0; int result = 0;
if (totalMemory != 0) result += 8; if (totalMemory != 0) result += 32;
if (serialNumber != null && !serialNumber.equals("unknown")) result += 12; if (serialNumber != null) result += isRealSerialNumber() ? 20 : 3;
if (HWDiskSerial != null && !HWDiskSerial.equals("unknown")) result += 30; if (HWDiskSerial != null && !HWDiskSerial.isEmpty()) result += 38;
if (processorID != null && !processorID.equals("unknown")) result += 10; if (processorID != null && !processorID.isEmpty()) result += 20;
if (macAddr != null && !macAddr.equals("00:00:00:00:00:00")) result += 15; if (macAddr != null && !macAddr.isEmpty()) result += 25;
return result; return result;
} }
@Override
public int getAntiLevel() {
return HWIDCheckHelper.checkString(serialNumber) + HWIDCheckHelper.checkString(HWDiskSerial);
}
@Override @Override
public int compare(HWID hwid) { public int compare(HWID hwid) {
if (hwid instanceof OshiHWID) { if (hwid instanceof OshiHWID) {
@ -58,6 +58,24 @@ public boolean isNull() {
return getLevel() < 15; return getLevel() < 15;
} }
@Override
public void normalize() {
HWDiskSerial = HWDiskSerial.trim();
serialNumber = serialNumber.trim();
processorID = processorID.trim();
macAddr = macAddr.trim();
}
public boolean isRealSerialNumber()
{
if(serialNumber.isEmpty()) return false;
if(serialNumber.equals("System Serial Number")) return false;
if(serialNumber.equals("To be filled by O.E.M.")) return false;
if(serialNumber.equals("unknown")) return false;
if(serialNumber.equals("None")) return false;
if(serialNumber.equals("Default string")) return false;
return true;
}
@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;