示例#1
0
    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)
示例#2
0
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
示例#3
0
#   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):