public string GetCustomAttribute(Il2CppImageDefinition imageDef, int customAttributeIndex, uint token, string padding = "") { if (il2Cpp.Version < 21) { return(string.Empty); } var attributeIndex = metadata.GetCustomAttributeIndex(imageDef, customAttributeIndex, token); if (attributeIndex >= 0) { var imageName = metadata.GetStringFromIndex(imageDef.nameIndex); var methodPointer = il2Cpp.GetCustomAttributeGenerator(imageName, attributeIndex, attributeIndex - imageDef.customAttributeStart); var fixedMethodPointer = il2Cpp.GetRVA(methodPointer); var attributeTypeRange = metadata.attributeTypeRanges[attributeIndex]; var sb = new StringBuilder(); for (var i = 0; i < attributeTypeRange.count; i++) { var typeIndex = metadata.attributeTypes[attributeTypeRange.start + i]; sb.AppendFormat("{0}[{1}] // RVA: 0x{2:X} Offset: 0x{3:X} VA: 0x{4:X}\n", padding, executor.GetTypeName(il2Cpp.types[typeIndex], false, false), fixedMethodPointer, il2Cpp.MapVATR(methodPointer), methodPointer); } return(sb.ToString()); } else { return(string.Empty); } }