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]
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()
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]
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()
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()
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()
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]