Skip to content

Commit cbbacb6

Browse files
committed
fix: Look for string data in both read-only sections and segments
Fixes #2.
1 parent 6d658b0 commit cbbacb6

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

binja_plugin/actions.py

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import List
33

44
from binaryninja.binaryview import BinaryView, DataVariable
5-
from binaryninja.enums import MediumLevelILOperation
5+
from binaryninja.enums import MediumLevelILOperation, SectionSemantics
66
from binaryninja.log import Logger
77
from binaryninja.mediumlevelil import MediumLevelILConst
88
from binaryninja.plugin import BackgroundTaskThread
@@ -74,29 +74,45 @@ def run(self):
7474
self.bv.segments,
7575
)
7676
)
77-
if len(readonly_segments) == 0:
78-
logger.log_error("Could not find any read-only segment in binary, exiting")
77+
78+
readonly_sections = list(
79+
filter(
80+
lambda section: section.semantics
81+
== SectionSemantics.ReadOnlyDataSectionSemantics,
82+
self.bv.sections.values(),
83+
)
84+
)
85+
86+
if len(readonly_segments) == 0 and len(readonly_sections) == 0:
87+
logger.log_error(
88+
"Could not find any read-only segments or sections in binary, exiting"
89+
)
7990
return
8091

8192
self.bv.begin_undo_actions()
82-
# Obtain all data vars which are pointers to data in readonly data segments
83-
data_vars_to_ro_segment_data: List[DataVariable] = []
93+
# Obtain all data vars which are pointers to data in read-only data segments or sections
94+
data_vars_to_readonly_data: List[DataVariable] = []
8495
for (
8596
_data_var_addr,
8697
candidate_string_slice_data_ptr,
8798
) in self.bv.data_vars.items():
8899
if isinstance(candidate_string_slice_data_ptr.type, PointerType):
89-
for readonly_segment in readonly_segments:
90-
if candidate_string_slice_data_ptr.value in readonly_segment:
91-
data_vars_to_ro_segment_data.append(
100+
for readonly_segment_or_section in (
101+
readonly_segments + readonly_sections
102+
):
103+
if (
104+
candidate_string_slice_data_ptr.value
105+
in readonly_segment_or_section
106+
):
107+
data_vars_to_readonly_data.append(
92108
candidate_string_slice_data_ptr
93109
)
94110
logger.log_debug(
95111
f"Found pointer var at {candidate_string_slice_data_ptr.address:#x} ({candidate_string_slice_data_ptr}) pointing to {candidate_string_slice_data_ptr.value:#x} "
96112
)
97113

98114
recovered_string_slices: List[RustStringSlice] = []
99-
for candidate_string_slice_data_ptr in data_vars_to_ro_segment_data:
115+
for candidate_string_slice_data_ptr in data_vars_to_readonly_data:
100116
# Try to read an integer following the data var,
101117
# and treat it as a candidate for a string slice length.
102118
candidate_string_slice_len_addr = (

0 commit comments

Comments
 (0)