11from binaryninja import Settings , log_info , log_error , BinaryView
2- from reait .api import re_conf , RE_authentication , RE_search
2+ from reait .api import re_conf , RE_authentication , RE_search , re_binary_id
3+ import json
34
45class Config :
56 def __init__ (self ):
67 self .settings = Settings ()
78 self .api_key = ""
89 self .host = ""
9- self .current_analysis = None
10- self .is_configured = None
10+ self .sha256 = ""
11+ self .is_configured = False
1112 self .binary_id = 0
1213 self .analysis_id = 0
1314 self ._load_config ()
@@ -16,107 +17,109 @@ def __init__(self):
1617 def _load_config (self ):
1718 settings = Settings ()
1819 settings .register_group ("revengai" , "RevEng.AI" )
19- settings .register_setting ("revengai.host" ,
20+ log_info (f"RevEng.AI | Registering settings" )
21+ log_info (settings .register_setting ("revengai.host" ,
2022 '{"title" : "Host URL",\
2123 "type" : "string",\
2224 "default" : "https://api.reveng.ai",\
23- "description" : "RevEng.AI Host URL"}' )
24- settings .register_setting ("revengai.api_key" ,
25+ "description" : "RevEng.AI Host URL"}' ))
26+ log_info ( settings .register_setting ("revengai.api_key" ,
2527 '{"title" : "API Key",\
2628 "type" : "string",\
2729 "default" : "",\
28- "description" : "API Key"}' )
29- settings .register_setting ("revengai.current_analysis" ,
30- '{"title" : "Current Analysis ID",\
31- "type" : "string",\
32- "default" : "",\
33- "description" : "Current Analysis ID"}' )
34- settings .register_setting ("revengai.is_configured" ,
35- '{"title" : "Is Configured",\
36- "type" : "string",\
37- "default" : "False",\
38- "description" : "Configuration Status"}' )
30+ "description" : "API Key"}' ))
31+ log_info (settings .register_setting ("revengai.all_analyses" ,
32+ '{"title" : "All Analyses",\
33+ "type" : "object",\
34+ "description" : "All Analyses"}' ))
3935
4036 self .host = settings .get_string ("revengai.host" , None )
4137 self .api_key = settings .get_string ("revengai.api_key" , None )
42- self .current_analysis = settings .get_string ("revengai.current_analysis" , None )
43- self .is_configured = settings .get_string ("revengai.is_configured" , None )
4438
4539 re_conf ["apikey" ] = self .api_key
4640 re_conf ["host" ] = self .host
41+ re_conf ["user_agent" ] = "RevEng.AI BinaryNinja Plugin"
4742
4843
4944 def save_config (self ) -> bool :
5045 try :
5146 log_info (f"RevEng.AI | Testing configuration: { self .host } { self .api_key [:4 ]} ..." )
52- re_conf [ "apikey" ] = self . api_key
53- re_conf [ "host" ] = self .host
54- RE_authentication ( )
55- log_info ( "RevEng.AI | Authentication successful!" )
56- self .is_configured = " True"
47+
48+ if not self .check_auth ():
49+ raise ( f"RevEng.AI | Authentication failed." )
50+
51+ self .is_configured = True
5752
5853 settings = Settings ()
5954 settings .set_string ("revengai.host" , self .host )
6055 settings .set_string ("revengai.api_key" , self .api_key )
61- settings .set_string ("revengai.is_configured" , self .is_configured )
6256
6357 return True
6458
6559 except Exception as e :
6660 log_info (f"RevEng.AI | Failed to save API key: { str (e )} " )
67- self .is_configured = "False"
68- settings = Settings ()
69- settings .set_string ("revengai.is_configured" , self .is_configured )
61+ self .is_configured = False
7062 return False
7163
7264
7365 def clear_config (self ):
7466 self .api_key = ""
7567 self .host = ""
76- self .current_analysis = None
7768 self .is_configured = False
7869 self .save_config ()
7970
80- def set_binary_id (self , binary_id : int ):
81- """Set the binary ID and store it in settings."""
82- self .binary_id = binary_id
71+
72+ def check_auth (self ):
73+ try :
74+ re_conf ["apikey" ] = self .api_key
75+ re_conf ["host" ] = self .host
76+ RE_authentication ()
77+ return True
78+ except Exception as e :
79+ return False
80+
81+ def get_all_analyses (self ):
8382 settings = Settings ()
84- settings .set_integer ("revengai.binary_id" , self .binary_id )
85- return
83+ all_analyses = settings .get_json ("revengai.all_analyses" , None )
84+ if all_analyses == "null" :
85+ return {}
86+ return all_analyses
87+
88+ def set_current_info (self , binary_id ):
89+ binary_id = int (binary_id )
90+ self .binary_id = binary_id
8691
87- def set_analysis_id ( self , analysis_id : int ):
88- """Set the analysis ID and store it in settings."""
89- self . analysis_id = analysis_id
92+ all_analyses = self . get_all_analyses ()
93+ all_analyses [ self . sha256 ] = { "binary_id" : binary_id }
94+ log_info ( f"RevEng.AI | All analyses: { all_analyses } " )
9095 settings = Settings ()
91- settings .set_integer ("revengai.analysis_id" , self .analysis_id )
92- return
96+
97+ settings .set_json ("revengai.all_analyses" , json .dumps (all_analyses ))
98+ log_info (f"RevEng.AI | Updated analysis for SHA256: { self .sha256 [:8 ]} ... with binary_id: { binary_id } " )
99+
93100
94101 def init_config (self , bv : BinaryView ):
95102 try :
96- """
97- log_info(f"RevEng.AI | Testing configuration: {self.host} {self.api_key[:4]}...")
98- re_conf["apikey"] = self.api_key
99- re_conf["host"] = self.host
100- RE_authentication()
101- log_info("RevEng.AI | Authentication successful!")
103+ if not self .check_auth ():
104+ self .is_configured = False
105+ raise (f"RevEng.AI | Authentication failed." )
106+
107+ self .is_configured = True
102108
103- self.is_configured = "True"
104- settings = Settings()
105- settings.set_string("revengai.is_configured", self.is_configured)
106- """
107- # TODO: Ignore search if binary appears in settings options
108- search_results = RE_search (fpath = bv .file .filename ).json ()["query_results" ]
109- if not len (search_results ):
110- raise Exception ("Binary not found in RevEng.AI, try processing the binary again." )
109+ self .sha256 = re_binary_id (bv .file .filename )
110+ log_info (f"RevEng.AI | SHA256: { self .sha256 } " )
111111
112+ all_analyses = self .get_all_analyses ()
113+ if self .sha256 in all_analyses :
114+ self .binary_id = all_analyses [self .sha256 ]["binary_id" ]
115+ else :
116+ search_results = RE_search (fpath = bv .file .filename ).json ()["query_results" ]
117+ if not len (search_results ):
118+ raise Exception ("Binary not found in RevEng.AI, try processing the binary again." )
119+
112120 return True , ""
113121
114122 except Exception as e :
115123 log_error (f"RevEng.AI | Failed to initialize configuration: { str (e )} " )
116- """
117- self.is_configured = "False"
118- settings = Settings()
119- settings.set_string("revengai.is_configured", self.is_configured)
120- """
121124 return False , str (e )
122125
0 commit comments