示例#1
0
        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);
            }
        }