1+ from binaryninja import BinaryView , log_info , log_error , Symbol , SymbolType , interaction
2+ from binaryninja .interaction import InteractionHandler
3+ from reait .api import RE_authentication , RE_search , RE_nearest_symbols_batch , RE_analyze_functions , RE_name_score , RE_functions_data_types , RE_functions_data_types_poll , RE_get_analysis_id_from_binary_id , RE_get_functions_from_analysis
4+ from concurrent .futures import ThreadPoolExecutor , as_completed
5+ from typing import List , Dict , Tuple
6+ import math
7+ from revengai .utils .datatypes import apply_data_types as apply_data_types_util
8+ import time
9+ from revengai .utils import rename_function as rename_function_util
10+ from libbs .api import DecompilerInterface
11+ from libbs .decompilers .binja .interface import BinjaInterface
12+ from libbs .artifacts import _art_from_dict
13+ from libbs .artifacts import (
14+ Function ,
15+ FunctionArgument ,
16+ GlobalVariable ,
17+ Enum ,
18+ Struct ,
19+ Typedef ,
20+ )
21+
22+ class ViewFunctionInPortal :
23+ def __init__ (self , config ):
24+ self .config = config
25+
26+
27+ def view_function_in_portal (self , bv : BinaryView , options : Dict ) -> None :
28+ """Match functions from the binary against RevEng.AI database"""
29+ try :
30+ log_info ("RevEng.AI | Starting function searching in portal" )
31+ function_addr = options .get ("function" , None )
32+
33+ functions_containing = bv .get_functions_containing (function_addr )
34+
35+ if not functions_containing :
36+ log_error (f"RevEng.AI | Function not found at 0x{ function_addr :x} " )
37+ raise Exception ("Function not found at address" )
38+
39+ function = functions_containing [0 ]
40+ log_info (f"RevEng.AI | Function: { function .name } at 0x{ function .start :x} (Clicked address: 0x{ function_addr :x} )" )
41+
42+ binary_id = self .config .get_binary_id (bv )
43+ if not binary_id :
44+ raise Exception ("Analysis not found. Please choose one using 'Choose Source' feature." )
45+
46+ analysis = RE_get_analysis_id_from_binary_id (binary_id ).json ()
47+ analyzed_functions = RE_get_functions_from_analysis (analysis ["analysis_id" ]).json ()["data" ]["functions" ]
48+
49+ analyzed_function = next ((f for f in analyzed_functions if (f ["function_vaddr" ] + bv .image_base ) == function .start ), None )
50+ if not analyzed_function :
51+ log_error (f"RevEng.AI | Function { function .name } not found in analyzed functions" )
52+ raise Exception ("Function not found in analyzed functions" )
53+
54+ url = f"https://portal.reveng.ai/function/{ analyzed_function ['function_id' ]} "
55+ InteractionHandler ().open_url (url )
56+
57+ return True , "Function found in portal"
58+
59+ except Exception as e :
60+ log_error (f"RevEng.AI | Error in function matching: { str (e )} " )
61+ return False , str (e )
0 commit comments