Projects STRLCPY IDAGolangHelper Commits eb470e37
🤬
  • ■ ■ ■ ■ ■ ■
    GO_Utils/Firstmoduledata.py
    skipped 54 lines
    55 55   print(robase)
    56 56   return beg, beg+size*4, robase
    57 57   
     58 +def getTypeinfo117(addr, bt):
     59 + return getTypeinfo116(addr, bt)
     60 + 
    58 61  def getTypeinfo(addr, bt):
    59 62   addr += bt.size * 25
    60 63   beg = bt.ptr(addr)
    skipped 157 lines
  • ■ ■ ■ ■ ■ ■
    GO_Utils/Types.py
    skipped 142 lines
    143 143   creator.createTypes(self.standardTypes)
    144 144   creator.createTypes(self.commonTypes)
    145 145   
     146 +class Go117Types(GoTypes_BASE):
     147 + def __init__(self, creator):
     148 + super(Go117Types, self).__init__(creator)
     149 + self.standardTypes = [
     150 + ("type", [
     151 + ("size", "uintptr"),
     152 + ("ptrdata", "uintptr"),
     153 + ("hash", "__int32"),
     154 + ("flag", "__int8"),
     155 + ("align", "__int8"),
     156 + ("fieldAlign", "__int8"),
     157 + ("kind", "kind"),
     158 + ("equal", "*void"),
     159 + ("gcdata", "*unsigned char"),
     160 + ("string", "baseptr"),
     161 + ("ptrtothis", "baseptr"),
     162 + ])
     163 + ]
     164 + 
     165 + #this types depends on type structure so should be created after
     166 + self.commonTypes += [
     167 + ("uncommonType", [("pkgPath", "__int32"), ("mcount", "__int16"), ("unused1", "__int16"),("moff", "__int32"), ("unused2", "__int16")]),
     168 + ("method__", [("name", "__int32"), ("mtyp", "__int32"),("ifn","__int32"), ("tfn", "__int32")]),
     169 + ("structField",[
     170 + ("Name", "void *"),
     171 + ("typ", "*type"),
     172 + ("offset", "uintptr"),
     173 + ]),
     174 + ("structType", [
     175 + ("type","type"),
     176 + ("pkgPath", "void *"),
     177 + ("fields", "slice")
     178 + ]),
     179 + ("imethod", [
     180 + ("name", "baseptr"),
     181 + ("pkgPath", "baseptr"),
     182 + ]),
     183 + ("interfaceType",[
     184 + ("type", "type"),
     185 + ("pkgPath", "void *"),
     186 + ("methods", "slice")
     187 + ]),
     188 + ("funcType", [
     189 + ("type", "type"),
     190 + ("incount","__int16"),
     191 + ("outcount", "__int16")
     192 + ]),
     193 + ("mapType", [
     194 + ("type", "type"),
     195 + ("key","*type"),
     196 + ("elem","*type"),
     197 + ("bucket", "*type"),
     198 + ("hasher", "void *"),
     199 + ("keysize","__int8"),
     200 + ("elemsize","__int8"),
     201 + ("bucketsize","__int16"),
     202 + ("flags","__int32"),
     203 + ])
     204 + ]
     205 + 
     206 + creator.createTypes(self.standardTypes)
     207 + creator.createTypes(self.commonTypes)
     208 + self.creator = creator
     209 +
     210 + def update_robase(self, robase):
     211 + self.creator.configBase(robase)
     212 + 
    146 213  class Go17Types(GoTypes_BASE):
    147 214   def __init__(self, creator):
    148 215   super(Go17Types, self).__init__(creator)
    skipped 304 lines
    453 520   for i in range(size):
    454 521   self.processStructField(addr, i*sz)
    455 522   name = self.getName(offset)
     523 + while name[0] == "*":
     524 + name = name[1:]
    456 525   name = Utils.relaxName(name)
    457 526   name = "ut_" + name
    458 527   self.createUserTypeStruct(addr, name, size, size_new_struct)
    skipped 236 lines
    695 764  class TypeProcessing116(TypeProcessing19):
    696 765  
    697 766   def __init__(self, pos, endpos, step, settings, base_type):
    698  - super(TypeProcessing19, self).__init__(pos, endpos, step, settings, base_type)
     767 + super(TypeProcessing116, self).__init__(pos, endpos, step, settings, base_type)
    699 768   self.robase = base_type
    700 769   
    701 770   def getStructFieldOffset(self, sid, addr):
    skipped 8 lines
    710 779   self.handle_offset(addr)
    711 780   addr = self.getPtr(sid, offset, "bucket")
    712 781   self.handle_offset(addr)
     782 + 
     783 +class TypeProcessing117(TypeProcessing116):
     784 + def __init__(self, pos, endpos, step, settings, base_type):
     785 + super(TypeProcessing117, self).__init__(pos, endpos, step, settings, base_type)
     786 + self.robase = base_type
     787 + self.basetypes = dict()
     788 + self.basetypes['BOOL'] = 'unsigned __int8'
     789 + self.basetypes['UINT8'] = 'unsigned __int8'
     790 + self.basetypes['INT8'] = 'signed __int8'
     791 + self.basetypes['UINT16'] = 'unsigned __int16'
     792 + self.basetypes['INT16'] = 'signed __int16'
     793 + self.basetypes['UINT32'] = 'unsigned __int32'
     794 + self.basetypes['INT32'] = 'signed __int32'
     795 + self.basetypes['UINT64'] = 'unsigned __int64'
     796 + self.basetypes['INT64'] = 'signed __int64'
     797 + self.basetypes['UINT'] = 'unsigned __int64'
     798 + self.basetypes['INT'] = 'signed __int64'
     799 + self.basetypes['UINTPTR'] = 'unsigned __int64 *'
     800 + self.basetypes['FLOAT32'] = 'float'
     801 + self.basetypes['FLOAT64'] = 'double'
     802 + 
     803 + def get_str_from_struct(self, ea):
     804 + str_sz = idc.get_wide_byte(ea+1)
     805 + str_ea = ea + 2
     806 + 
     807 + sz, ea = self.get_str_sz(ea)
     808 + return self.get_str(ea, sz)
     809 + 
     810 + @staticmethod
     811 + def get_str_sz(ea):
     812 + print('getting str for {:x}'.format(ea))
     813 + ea += 1
     814 + c = idc.get_wide_byte(ea)
     815 + ea += 1
     816 + numbits = 0
     817 + sz = c & 0x7f
     818 + numbits += 7
     819 + while c & 0x80:
     820 + c = idc.get_wide_byte(ea)
     821 + ea += 1
     822 + sz |= (c & 0x7f) << numbits
     823 + numbits += 7
     824 + 
     825 + return sz, ea
     826 + return self.get_str(ea, sz)
     827 + 
     828 + 
     829 + def makeMap(self, offset):
     830 + idc.SetType(offset, "mapType")
     831 + sid = ida_struct.get_struc_id("mapType")
     832 + addr = self.getPtr(sid, offset, "key")
     833 + self.handle_offset(addr)
     834 + addr = self.getPtr(sid, offset, "elem")
     835 + self.handle_offset(addr)
     836 + addr = self.getPtr(sid, offset, "bucket")
     837 + self.handle_offset(addr)
     838 + 
     839 + def processStructField(self, addr, index):
     840 + offset = addr + index
     841 + sid = ida_struct.get_struc_id("structField")
     842 + ptr = self.getPtr(sid, offset, "Name")
     843 + ln = idc.get_wide_byte(ptr + 1)
     844 + fieldName = self.get_str(ptr + 2, ln)
     845 + Utils.rename(ptr, fieldName)
     846 + ptr = self.getPtr(sid, offset, "typ")
     847 + self.handle_offset(ptr)
     848 + 
     849 + def nameFromOffset(self, offset):
     850 + return self.get_str_from_struct(offset)
     851 + 
     852 + def getName(self, offset):
     853 + sid = ida_struct.get_struc_id("type")
     854 + name_off = self.getDword(sid, offset, "string")
     855 + string_addr = self.getOffset(name_off)
     856 + return self.get_str_from_struct(string_addr)
     857 + 
     858 + def processIMethod(self, offst):
     859 + sid = ida_struct.get_struc_id("imethod")
     860 + name = self.getDword(sid, offst, "name")
     861 + name += self.robase
     862 + return self.get_str_from_struct(name)
     863 +
     864 + def makeInterface(self, offset):
     865 + print('creating interface {:x}'.format(offset))
     866 + idc.SetType(offset, "interfaceType")
     867 + ifaceid = ida_struct.get_struc_id("interfaceType")
     868 + meth_offs = idc.get_member_offset(ifaceid, "methods")
     869 + slice_id = ida_struct.get_struc_id("slice")
     870 + size_off = idc.get_member_offset(slice_id, "len")
     871 + size = self.stepper.ptr(offset + meth_offs + size_off)
     872 + 
     873 + name = self.getName(offset)
     874 + while name[0] == "*":
     875 + name = name[1:]
     876 + name = Utils.relaxName(name)
     877 + itab_name = "itab_" + name
     878 + iface_name = 'iface_' + name
     879 + 
     880 + names = []
     881 + if size > 0:
     882 + addr = self.getPtr(slice_id, offset + meth_offs, "data")
     883 + idc.SetType(addr, "imethod")
     884 + sz = ida_struct.get_struc_size(ida_struct.get_struc_id("imethod"))
     885 + self.make_arr(addr, size, sz, "imethod")
     886 + names = self.processIMethods(addr, size)
     887 + if names is None:
     888 + return
     889 + 
     890 + # Reference - #https://github.com/teh-cmc/go-internals/blob/master/chapter2_interfaces/README.md#anatomy-of-an-interface
     891 + itab_fields = [("inter", "void *"), ("type", "void *"), ("hash", "__int32"),
     892 + ("unused", "__int32")]
     893 + for i in names:
     894 + itab_fields.append((i, "void *"))
     895 + 
     896 + itype = [(itab_name, itab_fields)]
     897 + self.settings.structCreator.createTypes(itype)
     898 + iface_fields = [('tab', f'{itab_name} *'), ('data', 'void *')]
     899 + itype = [(iface_name, iface_fields)]
     900 + self.settings.structCreator.createTypes(itype)
     901 + 
     902 + 
     903 + def createUserTypeStruct(self, addr, name, size, self_size):
     904 + print('creating struct {}'.format(name))
     905 + fields = []
     906 + sid = ida_struct.get_struc_id("structField")
     907 + sz = ida_struct.get_struc_size(sid)
     908 + sid_type = ida_struct.get_struc_id("type")
     909 + fields = []
     910 + curr_offset = 0
     911 + idc.set_cmt(addr, name, 0)
     912 + for i in range(size):
     913 + print('field in {:x}'.format(addr+i*sz))
     914 + fieldname = self.nameFromOffset(self.getPtr(sid, addr+i*sz,"Name"))
     915 + type_addr = self.getPtr(sid, addr+i*sz, "typ")
     916 + typename = self.getType(type_addr)
     917 + size = self.getPtr(sid_type, type_addr, "size")
     918 + if fieldname == "" or fieldname is None:
     919 + fieldname = "unused_"+Utils.id_generator()
     920 + offset = self.getStructFieldOffset(sid, addr+i*sz)
     921 + print(f"Get offset: {offset:x}")
     922 + if offset != curr_offset:
     923 + print("Offset missmatch.Got %d expected %d. Adding padding..." % (curr_offset, offset))
     924 + if offset < curr_offset:
     925 + raise("Too many bytes already")
     926 + while offset != curr_offset:
     927 + fields.append(("padding", "char"))
     928 + curr_offset += 1
     929 + curr_offset += size
     930 + print('fieldname = {}'.format(fieldname))
     931 + if size != 0:
     932 + fieldtype = None
     933 + offset_kind = idc.get_member_offset(sid_type, "kind")
     934 + kind_of_type = self.getKindEnumName(type_addr)
     935 + print(kind_of_type)
     936 + if kind_of_type == "STRUCT":
     937 + name_type = self.getName(type_addr)
     938 + while name_type[0] == "*":
     939 + name_type = name_type[1:]
     940 + name_type = Utils.relaxName(name_type)
     941 + name_type = "ut_" + name_type
     942 + 
     943 + if ida_struct.get_struc_id(name_type) != idc.BADADDR:
     944 + print("setting type %s" % name_type)
     945 + fieldtype = name_type
     946 + 
     947 + elif kind_of_type == "STRING":
     948 + fieldtype = "string"
     949 + 
     950 + elif kind_of_type == "SLICE":
     951 + fieldtype = "slice"
     952 + 
     953 + elif kind_of_type == "INTERFACE":
     954 + name_type = self.getName(type_addr)
     955 + while name_type[0] == "*":
     956 + name_type = name_type[1:]
     957 + name_type = Utils.relaxName(name_type)
     958 + name_type = "iface_" + name_type
     959 + 
     960 + if ida_struct.get_struc_id(name_type) != idc.BADADDR:
     961 + fieldtype = name_type
     962 + 
     963 + elif kind_of_type == "CHAN":
     964 + name_type = 'ut_runtime_hchan'
     965 + ptr_name_type = f'{name_type} *'
     966 + 
     967 + if ida_struct.get_struc_id(name_type) != idc.BADADDR:
     968 + fieldtype = ptr_name_type
     969 + 
     970 + elif kind_of_type == "MAP":
     971 + name_type = 'ut_runtime_hmap'
     972 + ptr_name_type = f'{name_type} *'
     973 + if ida_struct.get_struc_id(name_type) != idc.BADADDR:
     974 + fieldtype = ptr_name_type
     975 + 
     976 + elif kind_of_type == "FUNC":
     977 + fieldtype = 'void *'
     978 + 
     979 + elif kind_of_type == "PTR":
     980 + name_type = self.getName(type_addr)
     981 + while name_type[0] == "*":
     982 + name_type = name_type[1:]
     983 + name_type = Utils.relaxName(name_type)
     984 + name_type = "ut_" + name_type
     985 + ptr_name_type = f'{name_type} *'
     986 + 
     987 + if ida_struct.get_struc_id(name_type) != idc.BADADDR:
     988 + print("setting ptr type %s" % name_type)
     989 + fieldtype = ptr_name_type
     990 + 
     991 + elif kind_of_type in self.basetypes:
     992 + fieldtype = self.basetypes[kind_of_type]
     993 + 
     994 + if fieldtype is None:
     995 + if size == 1:
     996 + fieldtype = 'char'
     997 + else:
     998 + fieldtype = "char [%d]" % size
     999 + 
     1000 + fields.append((fieldname, fieldtype))
     1001 +
     1002 + if curr_offset != self_size:
     1003 + print("%x: Structure size mismatch: %x" % (addr, curr_offset))
     1004 + if self_size < curr_offset:
     1005 + raise("Too many bytes already")
     1006 + while self_size != curr_offset:
     1007 + fields.append(("padding", "char"))
     1008 + curr_offset += 1
     1009 + new_type = [(name, fields)]
     1010 + self.settings.structCreator.createTypes(new_type)
     1011 + new_type_sid = ida_struct.get_struc_id(name)
     1012 + sz = ida_struct.get_struc_size(new_type_sid)
     1013 + if sz != self_size:
     1014 + print("%x" % addr )
     1015 + raise Exception("Error at creating structure {}. {:x}!={:x}, fields={}".format(name, sz, self_size, fields))
     1016 + 
  • ■ ■ ■ ■ ■
    GO_Utils/Utils.py
    skipped 59 lines
    60 60   else:
    61 61   self.uintptr = (idc.FF_DWORD | idc.FF_DATA, -1, bt_obj.size)
    62 62  
     63 + self.baseptr = (idc.FF_DWORD | idc.FF_DATA, 0, 4)
     64 + 
     65 + def configBase(self, robase):
     66 + self.baseptr = (idc.FF_DWORD|idc.FF_0OFF, robase, 4)
     67 + 
    63 68   def createStruct(self, name):
    64 69   sid = ida_struct.get_struc_id(name)
    65  - if sid != -1:
     70 + if sid != idc.BADADDR:
    66 71   idc.del_struc(sid)
    67 72   sid = idc.add_struc(-1, name, 0)
    68 73   self.types_id['name'] = sid
    skipped 6 lines
    75 80   name = i[1]
    76 81   if name[0] == "*":
    77 82   name = name[1:]
    78  - if i[1] != "uintptr":
    79  - i1,i2,i3 = (idc.FF_BYTE|idc.FF_DATA, -1, 1)
    80  - else:
     83 + 
     84 + member_sid = ida_struct.get_struc_id(i[1])
     85 + if i[1] == 'baseptr':
     86 + i1, i2, i3 = self.baseptr
     87 + elif i[1] == 'uintptr':
    81 88   i1, i2, i3 = self.uintptr
     89 + elif member_sid != idc.BADADDR:
     90 + i1, i2, i3 = (idc.FF_STRUCT, member_sid, ida_struct.get_struc_size(member_sid))
     91 + elif i[1].endswith(' *'): # It is a pointer to some class
     92 + i1, i2, i3 = self.uintptr
     93 + else:
     94 + i1,i2,i3 = (idc.FF_BYTE|idc.FF_DATA, -1, 1)
     95 + 
    82 96   if name == i[1]:
    83 97   new_type = i[1]
    84 98   else:
    skipped 36 lines
  • ■ ■ ■ ■ ■
    GO_Utils/__init__.py
    skipped 107 lines
    108 108   self.typer = Types.Go17Types(self.structCreator)
    109 109   elif typ == 7: #1.10
    110 110   self.typer = Types.Go17Types(self.structCreator)
    111  - elif typ == 8: #1.10
     111 + elif typ == 8: #1.16
    112 112   self.typer = Types.Go116Types(self.structCreator)
     113 + elif typ == 9: #1.17
     114 + self.typer = Types.Go117Types(self.structCreator)
    113 115   
    114 116   def typesModuleData(self, typ):
    115 117   if typ < 2:
    skipped 21 lines
    137 139   elif typ == 8:
    138 140   beg, end, robase = Firstmoduledata.getTypeinfo116(fmd, self.bt_obj)
    139 141   self.processor = Types.TypeProcessing116(beg, end, self.bt_obj, self, robase)
     142 + elif typ == 9:
     143 + beg, end, robase = Firstmoduledata.getTypeinfo117(fmd, self.bt_obj)
     144 + self.typer.update_robase(robase)
     145 + self.processor = Types.TypeProcessing117(beg, end, self.bt_obj, self, robase)
    140 146   else:
    141 147   beg, end = Firstmoduledata.getTypeinfo(fmd, self.bt_obj)
    142 148   self.processor = Types.TypeProcessing(beg, end, self.bt_obj, self)
    skipped 4 lines
  • ■ ■ ■ ■ ■
    go_entry.py
    skipped 34 lines
    35 35  <Go1.8:{r8}>
    36 36  <Go1.9:{r9}>
    37 37  <Go1.10:{r10}>
    38  -<Go1.16:{r16}>{cGoVers}>
     38 +<Go1.16:{r16}>
     39 +<Go1.17:{r17}>{cGoVers}>
    39 40  <##Add standard go types:{iButton4}>
    40 41  <##Parse types by moduledata:{iButton5}>
    41 42  """, {
    skipped 2 lines
    44 45   'iButton3': Form.ButtonInput(self.OnButton3),
    45 46   'iButton4': Form.ButtonInput(self.OnButton4),
    46 47   'iButton5': Form.ButtonInput(self.OnButton5),
    47  - 'cGoVers': Form.RadGroupControl(("r2", "r3","r4","r5","r6","r7", "r8", "r9", "r10", "r16")),
     48 + 'cGoVers': Form.RadGroupControl(("r2", "r3","r4","r5","r6","r7", "r8", "r9", "r10", "r16", "r17")),
    48 49   'FormChangeCb': Form.FormChangeCb(self.OnFormChange),
    49 50   })
    50 51   
    skipped 51 lines
Please wait...
Page is in error, reload to recover