I dunno how well old this information is, since I'm new to albion, but here's some "detection" methods I found. There are two which I have found and are both obscured using reflection methods. It creates a list of hashed assemblies that are loaded in the game, which is included each time a SelectCharacter and/or ChangeCluster packet is sent. Be careful when running public cheats! Most likely the server maintains a blacklist of hashes of publicly available assemblies.
Below you can find the detection methods and their reversed counterparts respectively.
are constructor
Code:
public are()
{
object obj = Type.GetType(ara.g[9]).GetMethod(ara.g[10]).Invoke(null, null);
object obj2 = obj.GetType().GetType().GetMethod(ara.g[18], new Type[]
{
typeof(string)
}).Invoke(obj.GetType(), new string[]
{
ara.g[11]
});
Type type = (Type)obj2.GetType().GetProperty(ara.g[16]).GetGetMethod().Invoke(obj2, null);
IEnumerable<ParameterInfo> parameters = type.GetMethod(ara.g[12]).GetParameters();
if (are.b == null)
{
are.b = new Func<ParameterInfo, int, ParameterExpression>(are.a);
}
ParameterExpression[] parameters2 = parameters.Select(are.b).ToArray<ParameterExpression>();
MethodCallExpression body = Expression.Call(Expression.Constant(aq9.aj()), aq9.aj().GetType().GetMethod(ara.g[13], new Type[]
{
typeof(string)
}), new Expression[]
{
Expression.Constant(string.Empty, typeof(string))
});
Delegate @delegate = Expression.Lambda(type, body, parameters2).Compile();
MethodInfo method = obj2.GetType().GetMethod(ara.g[17]);
method.Invoke(obj2, new object[]
{
obj,
@delegate
});
}
Code:
public are() {
AppDomain.CurrentDomain.AssemblyLoad += (sender, args) => aq9.au(string.Empty);
}
aq9.au
Code:
public void au(string A_0)
{
EventData a_ = ara.a(new adr
{
a5k = aq9.z,
a5l = "Horst" + (long.MaxValue - aq9.z),
a5m = 0,
a5n = 0,
a5s = Guid.Empty.ToByteArray(),
a5r = "",
a5w = new float[2],
a5x = GameTimeStamp.Zero,
a5y = 180f,
a50 = 0L,
a5z = 0f,
a51 = 1000f,
a52 = 1000f,
a53 = 0f,
a54 = GameTimeStamp.Zero,
a55 = 100f,
a56 = 100f,
a57 = 0f,
a58 = GameTimeStamp.Zero,
a6g = null,
a6h = null
});
this.az(a_);
}
aq9.az
Code:
public void az(EventData A_0)
{
try
{
object obj = Type.GetType(ara.g[9]).GetMethod(ara.g[10]).Invoke(null, null);
object[] array = (object[])obj.GetType().GetMethod(ara.g[14]).Invoke(obj, null);
int i = 0;
while (i < array.Length)
{
object obj2 = array[i];
string text = (string)obj2.GetType().GetProperty(ara.g[15]).GetGetMethod().Invoke(obj2, null);
ConstructorInfo constructor = ajy.a(ara.g[8]).GetConstructor(new Type[]
{
typeof(string),
ajy.a(ara.g[7]),
ajy.a(ara.g[6]),
ajy.a(ara.g[5])
});
object obj3 = Enum.ToObject(ajy.a(ara.g[7]), 3);
object obj4 = Enum.ToObject(ajy.a(ara.g[6]), 1);
object obj5 = Enum.ToObject(ajy.a(ara.g[5]), 3);
object obj6 = null;
try
{
obj6 = constructor.Invoke(new object[]
{
text,
obj3,
obj4,
obj5
});
}
catch (Exception)
{
aop.a.Add(-1);
goto IL_2AD;
}
goto IL_178;
IL_2AD:
i++;
continue;
IL_178:
ConstructorInfo constructor2 = ajy.a(ara.g[4]).GetConstructor(new Type[]
{
ajy.a(ara.g[8])
});
object obj7 = constructor2.Invoke(new object[]
{
obj6
});
PropertyInfo property = ajy.a(ara.g[4]).GetProperty(ara.g[3]);
object value = property.GetValue(obj7, null);
Type type = value.GetType();
PropertyInfo property2 = type.GetProperty(ara.g[2]);
long num = (long)property2.GetValue(value, null);
int num2 = (int)num;
MethodInfo method = ajy.a(ara.g[4]).GetMethod(ara.g[1]);
byte[] a_ = (byte[])method.Invoke(obj7, new object[]
{
num2
});
MethodInfo method2 = ajy.a(ara.g[4]).GetMethod(ara.g[0]);
method2.Invoke(obj7, null);
aop.a.Add(ara.a(a_));
goto IL_2AD;
}
}
catch (Exception)
{
}
}
Code:
// aop.a
public static HashSet<int> _assemblyHashes = new HashSet<int>();
// aq9.az
public void StoreLoadedAssemblies(EventData eventData) {
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) {
try {
var fileStream = new FileStream(assembly.Location, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
var binaryReader = new BinaryReader(fileStream);
var assemblyLength = binaryReader.BaseStream.Length;
var assemblyBytes = binaryReader.ReadBytes(assemblyLength);
var assemblyHash = Hash(assemblyBytes);
binaryReader.Close();
_assemblyHashes.Add(assemblyHash);
}
catch (Exception) {
_assemblyHashes.Add(-1);
}
}
}
// ara.a
public static int Hash(byte[] bytes) {
var hash = -0x7EE3623B;
foreach (var @byte in bytes) {
hash ^= @byte;
hash *= 0x01000193;
}
hash += hash << 13;
hash ^= hash >> 07;
hash += hash << 03;
hash ^= hash >> 17;
hash += hash << 05;
return hash;
}
*Update* 13 November 2017 (patch 1.0.340.102503:
are -> as9
aq9.au -> as4.au
aq9.az -> as4.a2