Esempio n. 1
0
def PackageInfo(jmgr, os_target, sql, args):
    sql.connect_table(tables['package_info'])
    sql.connect_table(tables['package_dependency'])

    pkgname = args[0]
    pkg_id = get_package_id(sql, pkgname)

    pkg_info = os_target.get_package_info(pkgname)
    pkg_deps = os_target.get_package_dependency(pkgname)

    # Clean up records
    sql.delete_record(tables['package_info'],
                      'pkg_id=\'' + Table.stringify(pkg_id) + '\'')
    sql.delete_record(tables['package_dependency'],
                      'pkg_id=\'' + Table.stringify(pkg_id) + '\'')

    pkg_info['pkg_id'] = pkg_id
    sql.append_record(tables['package_info'], pkg_info)

    for dep in pkg_deps:
        dep_id = get_package_id(sql, dep)
        values = dict()
        values['pkg_id'] = pkg_id
        values['dependency'] = dep_id
        sql.append_record(tables['package_dependency'], values)

    sql.commit()
def BinarySymbol(jmgr, os_target, sql, args):
    sql.connect_table(tables['binary_list'])
    sql.connect_table(tables['binary_symbol'])

    pkgname = args[0]
    bin = args[1]
    dir = args[2]

    if len(args) > 3:
        ref = args[3]
        if not package.reference_exists(dir, ref):
            dir = None
            ref = None
    else:
        ref = None

    unpacked = False
    if not dir:
        (dir, pkgname, _) = package.unpack_package(os_target, args[0])
        if not dir:
            return
        unpacked = True

    exc = None
    try:
        path = dir + '/' + bin
        if not os.path.exists(path):
            raise Exception('path ' + path + ' does not exist')

        symbols = os_target.get_binary_symbols(dir, bin)
        pkg_id = get_package_id(sql, pkgname)
        bin_id = get_binary_id(sql, bin)

        condition = 'pkg_id=' + Table.stringify(
            pkg_id) + ' and bin_id=' + Table.stringify(bin_id)
        sql.delete_record(tables['binary_symbol'], condition)

        for sym in symbols:
            values = dict()
            values['pkg_id'] = pkg_id
            values['bin_id'] = bin_id
            values['symbol_name'] = sym.name
            values['version'] = sym.version
            values['func_addr'] = sym.addr

            sql.append_record(tables['binary_symbol'], values)

        sql.update_record(tables['binary_list'], {'callgraph': False},
                          condition)
        sql.commit()

    except Exception as err:
        exc = sys.exc_info()

    if (ref and package.dereference_dir(dir, ref)) or unpacked:
        package.remove_dir(dir)
    if exc:
        raise exc[1], None, exc[2]
Esempio n. 3
0
def AnalyzePackageSource(jmgr, os_target, sql, args):
    pkg_name = args[0]
    if len(args) > 1:
        pkg_id = args[1]
    else:
        pkg_id = get_package_id(sql, pkg_name)

    sql.postgresql_execute('SELECT analyze_package_source(%d)' % (pkg_id))
    sql.commit()
Esempio n. 4
0
def BinaryInstr(jmgr, os_target, sql, args):
    sql.connect_table(tables['binary_call'])
    sql.connect_table(tables['binary_call_unknown'])
    sql.connect_table(tables['binary_opcode_usage'])
    sql.connect_table(tables['binary_call_missrate'])
    # sql.connect_table(tables['instr_list'])
    # sql.connect_table(tables['prefix_counts'])

    pkgname = args[0]
    bin = args[1]
    dir = args[2]
    pkg_id = get_package_id(sql, pkgname)

    if len(args) > 3:
        ref = args[3]
        if not package.reference_exists(dir, ref):
            dir = None
            ref = None
    else:
        ref = None

    unpacked = False
    if not dir:
        (dir, pkgname, _) = package.unpack_package(os_target, args[0])
        if not dir:
            return
        unpacked = True

    exc = None
    try:
        if not os.path.exists(dir + bin):
            raise Exception('path ' + dir + bin + ' does not exist')

        bin_id = get_binary_id(sql, bin)
        os_target.analysis_binary_instr_linear(sql, dir, bin, pkg_id, bin_id)

        condition = 'pkg_id=' + Table.stringify(
            pkg_id) + ' and bin_id=' + Table.stringify(bin_id)
        sql.update_record(tables['binary_list'], {'callgraph': False},
                          condition)
        sql.commit()

    except Exception as err:
        exc = sys.exc_info()

    if (ref and package.dereference_dir(dir, ref)) or unpacked:
        package.remove_dir(dir)
    if exc:
        raise exc[1], None, exc[2]
Esempio n. 5
0
def AnalyzeExecutableSource(jmgr, os_target, sql, args):
    pkg_name = args[0]
    bin = args[1]
    if len(args) > 2:
        pkg_id = args[2]
    else:
        pkg_id = get_package_id(sql, pkg_name)
    if len(args) > 3:
        bin_id = args[3]
    else:
        bin_id = get_binary_id(sql, bin)

    sql.postgresql_execute('SELECT analyze_executable_source(%d, %d)' %
                           (pkg_id, bin_id))
    sql.commit()
Esempio n. 6
0
def AnalyzeLinking(jmgr, os_target, sql, args):
    pkg_name = args[0]

    if len(args) > 1:
        pkg_id = args[1]
    else:
        pkg_id = get_package_id(sql, pkg_name)

    sql.postgresql_execute(
        'SELECT analyze_linking(%d, lnk_id, true,  false) FROM binary_link WHERE pkg_id=%d AND linking=false'
        % (pkg_id, pkg_id))
    sql.postgresql_execute(
        'SELECT analyze_linking(%d, bin_id, false, false) FROM binary_list WHERE pkg_id=%d AND linking=false and type != \'scr\''
        % (pkg_id, pkg_id))
    sql.commit()
Esempio n. 7
0
def AnalyzeLibrary(jmgr, os_target, sql, args):
    pkg_name = args[0]
    bin = args[1]

    if args[2]:
        pkg_id = args[2]
    else:
        pkg_id = get_package_id(sql, pkg_name)

    if args[3]:
        bin_id = args[3]
    else:
        bin_id = get_binary_id(sql, bin)

    sql.postgresql_execute('SELECT analyze_library(%d, %d)' % (pkg_id, bin_id))
    sql.commit()
Esempio n. 8
0
def append_binary_list(sql, pkgname, dir, binaries):
    sql.connect_table(tables['binary_list'])
    sql.connect_table(tables['binary_link'])
    sql.connect_table(tables['binary_interp'])

    pkg_id = get_package_id(sql, pkgname)
    insert_values = []

    for (bin, type, interpreter) in binaries:
        bin_id = get_binary_id(sql, bin)
        values = dict()
        values['type'] = type

        if type == 'lnk':
            link = os.readlink(dir + bin)
            target = os.path.join(os.path.dirname(bin), link)
            target_id = get_binary_id(sql, target)
            values['pkg_id'] = pkg_id
            values['lnk_id'] = bin_id
            values['target'] = target_id
            values['linking'] = False
        else:
            values['pkg_id'] = pkg_id
            values['bin_id'] = bin_id
            if type == 'scr':
                interp_id = get_binary_id(sql, interpreter)
                values['interp'] = interp_id
                values['callgraph'] = True
            else:
                values['callgraph'] = False
            values['linking'] = False

        insert_values.append(values)

    condition = 'pkg_id=' + Table.stringify(pkg_id)
    sql.delete_record(tables['binary_list'], condition)
    sql.delete_record(tables['binary_link'], condition)
    sql.delete_record(tables['binary_interp'], condition)

    for values in insert_values:
        if values['type'] == 'lnk':
            sql.append_record(tables['binary_link'], values)
        else:
            sql.append_record(tables['binary_list'], values)
            if values['type'] == 'scr':
                sql.append_record(tables['binary_interp'], values)
def BinaryDependency(jmgr, os_target, sql, args):
    sql.connect_table(tables['binary_dependency'])
    sql.connect_table(tables['binary_interp'])

    pkgname = args[0]
    bin = args[1]
    dir = args[2]

    if len(args) > 3:
        ref = args[3]
        if not package.reference_exists(dir, ref):
            dir = None
            ref = None
    else:
        ref = None

    unpacked = False
    if not dir:
        (dir, pkgname, _) = package.unpack_package(os_target, args[0])
        if not dir:
            return
        unpacked = True

    exc = None
    try:
        if not os.path.exists(dir + bin):
            raise Exception('path ' + dir + bin + ' does not exist')

        dependencies = os_target.get_binary_dependencies(dir, bin)
        interp = os_target.get_binary_interpreter(dir, bin)
        pkg_id = get_package_id(sql, pkgname)
        bin_id = get_binary_id(sql, bin)
        if interp:
            interp = get_binary_id(sql, interp)

        condition = 'pkg_id=' + Table.stringify(
            pkg_id) + ' and bin_id=' + Table.stringify(bin_id)
        sql.delete_record(tables['binary_dependency'], condition)
        sql.delete_record(tables['binary_interp'], condition)

        for dep in dependencies:
            values = dict()
            values['pkg_id'] = pkg_id
            values['bin_id'] = bin_id
            values['dependency'] = dep
            sql.append_record(tables['binary_dependency'], values)

        if interp:
            values = dict()
            values['pkg_id'] = pkg_id
            values['bin_id'] = bin_id
            values['interp'] = interp
            sql.append_record(tables['binary_interp'], values)

        sql.update_record(tables['binary_list'], {'linking': False}, condition)
        sql.commit()

    except Exception as err:
        exc = sys.exc_info()

    if (ref and package.dereference_dir(dir, ref)) or unpacked:
        package.remove_dir(dir)
    if exc:
        raise exc[1], None, exc[2]