internal static field[] get_fields(ulong ti_address, ulong address) { libtysila.Layout ti_l = Program.arch.ass.GetTysosTypeLayout(); libtysila.Layout fi_l = Program.arch.ass.GetTysosFieldLayout(); ulong field_pointer = mem.get_mem(ti_address + (ulong)ti_l.InstanceFieldOffsets["IntPtr Fields"]); if (field_pointer != 0) { List <obj.field> fields = new List <field>(); ulong cur_field = mem.get_mem(field_pointer); while (cur_field != 0) { string field_name = get_string(mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["String _Name"])); int flags = (int)mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["UInt32 Flags"], 4); int f_offset = (int)mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["Int32 offset"], 4); string field_type = get_type_fullname(mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["libsupcs.TysosType _FieldType"])); ulong field_ti = mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["libsupcs.TysosType _FieldType"]); if ((flags & 0x10) == 0x0) { // is an instance field int len = get_data_length(field_type); ulong val = mem.get_mem(address + (ulong)f_offset, len); bool is_vt = false; string field_extends_name = get_type_fullname(mem.get_mem(field_ti + (ulong)ti_l.InstanceFieldOffsets["libsupcs.TysosType Extends"])); if (((field_extends_name == "[mscorlib]System.ValueType") && (field_type != "[mscorlib]System.Enum")) || (field_extends_name == "[mscorlib]System.EnumType")) { is_vt = true; } ulong field_size = (ulong)Program.arch.data_size; if (is_vt) { field_size = (ulong)mem.get_mem(field_ti + (ulong)ti_l.InstanceFieldOffsets["Int32 ClassSize"], 4); } fields.Add(new field { name = field_name, type = field_type, value = val, is_vt = is_vt, ti_addr = field_ti, offset = f_offset, size = field_size }); } field_pointer += (ulong)Program.arch.address_size; cur_field = mem.get_mem(field_pointer); } return(fields.ToArray()); } return(new field[] { }); }
static string get_type_fullname(ulong ti_address) { if (ti_address == 0) { return(""); } libtysila.Layout ti_l = Program.arch.ass.GetTysosTypeLayout(); libtysila.Layout a_l = Program.arch.ass.GetTysosAssemblyLayout(); string name = get_string(mem.get_mem(ti_address + (ulong)ti_l.InstanceFieldOffsets["String TypeName"])); string ns = get_string(mem.get_mem(ti_address + (ulong)ti_l.InstanceFieldOffsets["String TypeNamespace"])); string assembly_name = get_string(mem.get_mem(mem.get_mem(ti_address + (ulong)ti_l.InstanceFieldOffsets["System.Reflection.Assembly _Assembly"]) + (ulong)a_l.InstanceFieldOffsets["String assemblyName"])); string full_name = "[" + assembly_name + "]" + ns + "." + name; return(full_name); }
internal static obj get_obj(ulong address) { bool is_obj = false; ulong vtbl_address; ulong ti_address = 0; // try and get a vtable at the contents of this address vtbl_address = mem.get_mem(address); ulong offset; string vtbl_name = mem.get_symbol(vtbl_address, out offset); if (vtbl_name.EndsWith("TI")) { // try and get a typeinfo at the contents of the vtbl ti_address = mem.get_mem(vtbl_address); string ti_name = mem.get_symbol(ti_address, out offset); if ((offset == 0) && (ti_name.EndsWith("TI"))) { is_obj = true; } } if (is_obj) { // if an object try and interpret its typeinfo obj obj = new obj(); libtysila.Layout ti_l = Program.arch.ass.GetTysosTypeLayout(); libtysila.Layout fi_l = Program.arch.ass.GetTysosFieldLayout(); string full_name = get_type_fullname(ti_address); string extends_name = get_type_fullname(mem.get_mem(ti_address + (ulong)ti_l.InstanceFieldOffsets["libsupcs.TysosType Extends"])); if (((extends_name == "[mscorlib]System.ValueType") && (full_name != "[mscorlib]System.Enum")) || (extends_name == "[mscorlib]System.EnumType")) { obj.is_vt = true; } else { obj.is_vt = false; } obj.type = full_name; obj.addr = address; if (full_name == "[mscorlib]System.String") { obj.value = get_string(address); } else { obj.value = get_fields(ti_address, address); /*ulong field_pointer = mem.get_mem(ti_address + (ulong)ti_l.InstanceFieldOffsets["IntPtr Fields"]); * * if (field_pointer != 0) * { * List<obj.field> fields = new List<field>(); * * ulong cur_field = mem.get_mem(field_pointer); * * while (cur_field != 0) * { * string field_name = get_string(mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["String _Name"])); * int flags = (int)mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["Int32 Flags"], 4); * int f_offset = (int)mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["Int32 offset"], 4); * string field_type = get_type_fullname(mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["tysos.TysosType _FieldType"])); * ulong field_ti = mem.get_mem(cur_field + (ulong)fi_l.InstanceFieldOffsets["tysos.TysosType _FieldType"]); * * if ((flags & 0x10) == 0x0) * { * // is an instance field * int len = get_data_length(field_type); * ulong val = mem.get_mem(address + (ulong)f_offset, len); * bool is_vt = false; * * string field_extends_name = get_type_fullname(mem.get_mem(field_ti + (ulong)ti_l.InstanceFieldOffsets["tysos.TysosType Extends"])); * if (((field_extends_name == "[mscorlib]System.ValueType") && (field_type != "[mscorlib]System.Enum")) || * (field_extends_name == "[mscorlib]System.EnumType")) * is_vt = true; * * fields.Add(new field { name = field_name, type = field_type, value = val, is_vt = is_vt, ti_addr = field_ti }); * } * * field_pointer += (ulong)Program.arch.address_size; * cur_field = mem.get_mem(field_pointer); * } * * obj.value = fields.ToArray(); * } */ } return(obj); } else { // if not an object, then interpret it as an unsigned integer in the native // byte length ulong val = mem.get_mem(address, Program.arch.data_size); obj obj = new obj(); obj.addr = address; switch (Program.arch.data_size) { case 4: obj.type = "[mscorlib]System.UInt32"; obj.value = (uint)val; break; case 8: default: obj.type = "[mscorlib]System.UInt64"; obj.value = (ulong)val; break; } obj.is_vt = true; return(obj); } }
Layout LoadLayout(libtysila.Layout l, SymbolTable stab) { Layout ret = new Layout(); ret.Name = l.typeinfo_object_name; SymbolTable.Symbol s = stab.Symbols[l.typeinfo_object_name]; ret.offset = s.offset; ret.vaddr = s.vaddr; foreach (libtysila.Layout.Field f in l.InstanceFields) { Layout.Field newf = new Layout.Field(); int space_idx = f.name.IndexOf(' '); newf.FieldType = f.name.Substring(0, space_idx); newf.Name = f.name.Substring(space_idx + 1); newf.Offset = f.offset; newf.Length = f.size; newf.l = ret; newf.ftype = Layout.Field.FType.Value; foreach (libtysila.Metadata.CustomAttributeRow car in f.field.field.CustomAttrs) { string caname = libtysila.Mangler2.MangleMethod(libtysila.Metadata.GetMTC(car.Type, new libtysila.Assembler.TypeToCompile(), null, stab.ass), stab.ass); if (caname == "_ZX29NullTerminatedListOfAttributeM_0_7#2Ector_Rv_P2u1tW6System4Type") { newf.ftype = Layout.Field.FType.NTArray; } } if (f.field.fsig.Type is libtysila.Signature.BaseType) { libtysila.Signature.BaseType bt = f.field.fsig.Type as libtysila.Signature.BaseType; switch (bt.Type) { case libtysila.BaseType_Type.Boolean: case libtysila.BaseType_Type.Byte: case libtysila.BaseType_Type.Char: case libtysila.BaseType_Type.I: case libtysila.BaseType_Type.I1: case libtysila.BaseType_Type.I2: case libtysila.BaseType_Type.I4: case libtysila.BaseType_Type.I8: case libtysila.BaseType_Type.Object: case libtysila.BaseType_Type.R4: case libtysila.BaseType_Type.R8: case libtysila.BaseType_Type.String: case libtysila.BaseType_Type.U: case libtysila.BaseType_Type.U1: case libtysila.BaseType_Type.U2: case libtysila.BaseType_Type.U4: case libtysila.BaseType_Type.U8: newf.FieldType = bt.Type.ToString(); break; } } ret.Fields.Add(newf); } Layouts.Add(ret.vaddr, ret); return(ret); }