def update_idb(self): id = ida_enum.get_enum(self._name) if idc.BADADDR == id: id = ida_enum.add_enum(idc.BADADDR, self._name, idaapi.decflag()) keys = self._values.keys() keys.sort() for k in keys: ida_enum.add_enum_member(id, self._values[k], k)
def readStructMacro(path): """ Parses struct macros and updates a corresponding enum with their values :param path: the path to the file containing the macros :return: """ # parse macro file macroFile = open(path) members = [] structName = '' for line in macroFile.readlines(): if line.lstrip().startswith('\struct_entry'): if ', ' in line: name = line[line.index(')')+1 : line.index(',')] size = line[line.index(', ')+2 :].rstrip() if '//' in size: size = size[:size.index('//')].rstrip() if size.startswith('0x'): size = int(size, 16) else: size = int(size) else: name = line[line.index(')')+1 :].rstrip() if '//' in name: name = name[:name.index('//')].rstrip() size = 0 members.append((name, size)) if line.startswith('def_struct_offsets'): structName = line[line.index(', ')+2:].rstrip() print('parsed struct "' + structName + '"') # read into enum enumId = idc.get_enum(structName) if enumId == idaapi.BADADDR: enumId = idc.add_enum(idaapi.BADADDR, structName, idaapi.decflag()) # parse all enum members, needed to know what member to replace offset = 0x00 for member, size in members: enumMember = idc.get_enum_member(enumId, offset, 0, ida_enum.DEFMASK) if enumMember == idaapi.BADADDR: print("why???") idc.add_enum_member(enumId, structName + member, offset, idaapi.BADADDR) elif idc.get_enum_member_name(enumMember) != structName + member: # update member name, if value already exists print('\tupdate %s // 0x%X' % (structName + member, offset)) idc.set_enum_member_name(enumMember, structName + member) offset += size return True
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. import idaapi import idautils import idc import unittest import yaunit flags = [ idaapi.hexflag(), idaapi.charflag(), idaapi.decflag(), idaapi.octflag(), idaapi.binflag(), ] # name, enum_width 0->default, is bitfield, num_fields tests = [ ('std', 0, False, 0), ('std', 4, False, 0), ('bit', 0, True, 0), ('std_fields', 0, False, 0x20), ('bit_fields', 0, True, 0x20), ] def walk_enum(eid): def get_enums(bmask):