Ejemplo n.º 1
0
        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[] { });
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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);
        }