Skip to content

Commit e548efa

Browse files
committed
improving and solving bugs
1 parent c182e9b commit e548efa

7 files changed

Lines changed: 78 additions & 139 deletions

File tree

features/auto_unstrip/auto_unstrip.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ def _rename_function(self, bv: BinaryView, addr: int, new_name: str, new_name_ma
2323
log_info(f"RevEng.AI | Function at {hex(addr)} already has name {func.name}")
2424
return False
2525

26-
new_symbol = Symbol(SymbolType.FunctionSymbol, addr, new_name_mangled)
26+
new_symbol = Symbol(SymbolType.FunctionSymbol, addr, new_name)
2727
bv.define_user_symbol(new_symbol)
2828

29-
log_info(f"RevEng.AI | Renamed function at {hex(addr)} to {new_name_mangled}")
29+
log_info(f"RevEng.AI | Renamed function at {hex(addr)} to {new_name}")
3030
return True
3131

3232
except Exception as e:

features/choose_source/choose_source.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,24 @@ def choose_source(self, bv: BinaryView, chose: str):
1212
try:
1313
log_info(f"RevEng.AI | Chose: {chose}")
1414
binary_id = chose.split("ID: ")[1].split(" -")[0]
15-
self.config.binary_id = binary_id
1615
log_info(f"RevEng.AI | Binary ID: {self.config.binary_id}")
1716
# TODO: implement array like to store binary id and binaryhash and filesize
17+
18+
self.config.set_current_info(binary_id)
19+
1820
return True
1921
except Exception as e:
2022
log_error(f"RevEng.AI | Failed to choose source: {str(e)}")
2123
return False
2224

2325
def get_analysis(self, bv: BinaryView):
2426
try:
25-
self.base_addr = bv.image_base
26-
self.path = bv.file.filename
27-
log_info(f"RevEng.AI | Path: {self.path}")
27+
log_info(f"RevEng.AI | Path: {bv.file.filename}")
2828
log_info(f"RevEng.AI | Binary ID: {self.config.binary_id}")
2929

30-
results = RE_search(fpath=self.path).json()["query_results"]
30+
# TODO: check if the binary is already in the database
31+
32+
results = RE_search(fpath=bv.file.filename).json()["query_results"]
3133

3234
if not len(results):
3335
raise Exception("Binary not found in RevEng.AI, try processing the binary again.")

features/choose_source/choose_source_dialog.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ def init_ui(self):
6363
background-color: #4400ff;
6464
}
6565
""")
66-
self.ok_button.clicked.connect(self.choose_source)
66+
self.ok_button.clicked.connect(self._choose_source)
6767
self.cancel_button = QPushButton("Cancel")
6868
self.cancel_button.setStyleSheet("""
6969
QPushButton {
@@ -110,7 +110,7 @@ def _on_analysis_load_error(self, error_msg):
110110
)
111111
self.reject()
112112

113-
def choose_source(self):
113+
def _choose_source(self):
114114
if not self.combo.currentText():
115115
log_warn("RevEng.AI | Source selection is required")
116116
QMessageBox.warning(

features/configuration/__init__.py

Lines changed: 4 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,10 @@
22
from .config import Config
33
from .config_dialog import ConfigDialog
44
from PySide6.QtWidgets import QMessageBox
5-
from PySide6.QtCore import QThread, pyqtSignal
6-
import threading
7-
8-
class ConfigInitThread(QThread):
9-
finished = pyqtSignal(bool, str, object) # success, message, bv
10-
11-
def __init__(self, config, bv):
12-
super().__init__()
13-
self.config = config
14-
self.bv = bv
15-
16-
def run(self):
17-
try:
18-
status, message = self.config.init_config(self.bv)
19-
self.finished.emit(status, message, self.bv)
20-
except Exception as e:
21-
self.finished.emit(False, str(e), self.bv)
225

236
class ConfigurationFeature():
247
def __init__(self):
258
self.config = Config()
26-
self._thread_lock = threading.Lock()
27-
self._active_threads = {}
289
self._register_binary_view_event()
2910
log_info("RevEng.AI | Configuration Feature initialized")
3011

@@ -45,62 +26,16 @@ def get_config(self):
4526
return self.config
4627

4728
def _register_binary_view_event(self):
48-
BinaryViewType.add_binaryview_initial_analysis_completion_event(self._add_binaryview_finalized_event) # TODO: Use binaryview_finalized_event instead, but without load 3 times
29+
BinaryViewType.add_binaryview_finalized_event(self._add_binaryview_finalized_event) # TODO: Use binaryview_finalized_event instead, but without load 3 times
4930
# TODO: Nao usar binaryview_finalized_event para checkar creds, resulta em comandos nao carregando.q
5031
log_info("RevEng.AI | Registered binary view event handler")
5132

5233
def _add_binaryview_finalized_event(self, bv):
5334
try:
54-
log_info(f"RevEng.AI | Binary view finalized: {bv.file.original_filename}")
35+
if bv.view_type == "Raw":
36+
return
5537

56-
# Use thread-safe approach
57-
with self._thread_lock:
58-
# Cancel any existing thread for this binary
59-
binary_key = bv.file.original_filename
60-
if binary_key in self._active_threads:
61-
old_thread = self._active_threads[binary_key]
62-
if old_thread.isRunning():
63-
old_thread.terminate()
64-
old_thread.wait()
65-
66-
# Create new thread for this binary
67-
thread = ConfigInitThread(self.config, bv)
68-
thread.finished.connect(self._on_config_init_finished)
69-
self._active_threads[binary_key] = thread
70-
thread.start()
71-
72-
except Exception as e:
73-
log_error(f"RevEng.AI | Error in binary view event handler: {str(e)}")
74-
75-
def _on_config_init_finished(self, status, message, bv):
76-
try:
77-
# Clean up thread reference
78-
with self._thread_lock:
79-
binary_key = bv.file.original_filename
80-
if binary_key in self._active_threads:
81-
del self._active_threads[binary_key]
82-
83-
if status:
84-
log_info("RevEng.AI | Configuration initialized successfully")
85-
elif message == "Binary not found in RevEng.AI, try processing the binary again.":
86-
QMessageBox.warning(
87-
None,
88-
"RevEng.AI - Binary Not Found",
89-
"This binary has not been processed in the RevEng.AI platform yet.\n\n"
90-
"Please upload and process the binary first using the 'RevEng.AI > Upload Binary' option "
91-
"before using other RevEng.AI features.",
92-
QMessageBox.Ok
93-
)
94-
else:
95-
log_error(f"RevEng.AI | Configuration initialization failed: {message}")
96-
97-
except Exception as e:
98-
log_error(f"RevEng.AI | Error in config init finished handler: {str(e)}")
99-
100-
101-
def _add_binaryview_finalized_event_old(self, bv):
102-
try:
103-
log_info(f"RevEng.AI | Binary view finalized: {bv.file.original_filename}")
38+
log_info(f"RevEng.AI | Binary view finalized: {bv.file.filename}")
10439
status, message = self.config.init_config(bv)
10540
if status:
10641
log_info("RevEng.AI | Configuration initialized successfully")

features/configuration/config.py

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from 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

45
class 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

features/upload/upload.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ def upload_binary(self, bv: BinaryView, options: dict):
9595
log_info(f"RevEng.AI | Binary ID: {analysis['binary_id']}")
9696
log_info(f"RevEng.AI | Analysis ID: {analysis_info['analysis_id']}")
9797

98-
self.config.set_binary_id(analysis["binary_id"])
99-
self.config.set_analysis_id(analysis_info["analysis_id"])
98+
# TODO: Set binary and analysis id in config in form of id in array in settings
10099

101100
PeriodicChecker().start_checking(bv, analysis["binary_id"])
102101

utils/base_auth_feature.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ def register(self):
1010
pass
1111

1212
def is_valid(self, bv: BinaryView):
13-
return self.config.is_configured == "True"
13+
return self.config.is_configured == True

0 commit comments

Comments
 (0)