Skip to main content

binaryninja/
similarity.rs

1//! Function similarity providers, sessions, and result rendering.
2//!
3//! This functionality is **only** available in the Ultimate edition.
4
5use binaryninjacore_sys::{
6    BNSimilarityAnnotationType, BNSimilarityApplyStatus, BNSimilarityEntityId,
7    BNSimilarityEntityRef, BNSimilarityEntityType, BNSimilarityProviderId, BNSimilarityResultId,
8    BNSimilaritySessionCompletionQuery, BNSimilaritySessionId, BNSimilaritySessionNodeId,
9    BNSimilaritySessionResolverId, BNSimilarityViewType,
10};
11
12pub mod graph;
13pub mod node;
14pub mod provider;
15pub mod render;
16pub mod session;
17
18pub use graph::*;
19pub use node::*;
20pub use provider::*;
21pub use render::*;
22pub use session::*;
23
24/// The kind of object represented by a similarity entity.
25pub type SimilarityEntityType = BNSimilarityEntityType;
26
27/// The result of applying a similarity match.
28pub type SimilarityApplyStatus = BNSimilarityApplyStatus;
29
30/// The kind of view produced when rendering a result.
31pub type SimilarityViewType = BNSimilarityViewType;
32
33/// The change represented by a rendered address range.
34pub type SimilarityAnnotationType = BNSimilarityAnnotationType;
35
36new_id_type!(
37    /// Identifies an entity within a similarity session node.
38    SimilarityEntityId,
39    u32,
40    BNSimilarityEntityId,
41    value
42);
43
44new_id_type!(
45    /// Identifies a result within a similarity session node.
46    SimilarityResultId,
47    u64,
48    BNSimilarityResultId,
49    value
50);
51
52new_id_type!(
53    /// Identifies a similarity session node.
54    SimilaritySessionNodeId,
55    u32,
56    BNSimilaritySessionNodeId,
57    value
58);
59
60new_id_type!(
61    /// Identifies a similarity session.
62    SimilaritySessionId,
63    u32,
64    BNSimilaritySessionId,
65    value
66);
67
68new_id_type!(
69    /// Identifies a similarity provider instance.
70    SimilarityProviderId,
71    u32,
72    BNSimilarityProviderId,
73    value
74);
75
76new_id_type!(
77    /// Identifies a similarity resolver instance.
78    SimilaritySessionResolverId,
79    u32,
80    BNSimilaritySessionResolverId,
81    value
82);
83
84/// Chooses which similarity session completion data to read or update.
85///
86/// A query cannot select both a provider and a resolver. An empty query selects the whole session.
87#[derive(Debug, Copy, Clone, Default, PartialEq, Eq)]
88pub struct SimilaritySessionCompletionQuery {
89    node_id: Option<SimilaritySessionNodeId>,
90    provider_id: Option<SimilarityProviderId>,
91    resolver_id: Option<SimilaritySessionResolverId>,
92}
93
94impl SimilaritySessionCompletionQuery {
95    /// Selects the whole session.
96    pub fn for_session() -> Self {
97        Self::default()
98    }
99    /// Selects a node.
100    pub fn for_node(node_id: SimilaritySessionNodeId) -> Self {
101        Self {
102            node_id: Some(node_id),
103            ..Self::default()
104        }
105    }
106    /// Selects a provider across the session.
107    pub fn for_provider(provider_id: SimilarityProviderId) -> Self {
108        Self {
109            provider_id: Some(provider_id),
110            ..Self::default()
111        }
112    }
113    /// Selects a resolver across the session.
114    pub fn for_resolver(resolver_id: SimilaritySessionResolverId) -> Self {
115        Self {
116            resolver_id: Some(resolver_id),
117            ..Self::default()
118        }
119    }
120    /// Selects a provider within the current selection.
121    pub fn with_provider(mut self, provider_id: SimilarityProviderId) -> Self {
122        self.provider_id = Some(provider_id);
123        self.resolver_id = None;
124        self
125    }
126    /// Selects a resolver within the current selection.
127    pub fn with_resolver(mut self, resolver_id: SimilaritySessionResolverId) -> Self {
128        self.provider_id = None;
129        self.resolver_id = Some(resolver_id);
130        self
131    }
132
133    /// Returns the selected node, if any.
134    pub fn node_id(&self) -> Option<SimilaritySessionNodeId> {
135        self.node_id
136    }
137
138    /// Returns the selected provider, if any.
139    pub fn provider_id(&self) -> Option<SimilarityProviderId> {
140        self.provider_id
141    }
142
143    /// Returns the selected resolver, if any.
144    pub fn resolver_id(&self) -> Option<SimilaritySessionResolverId> {
145        self.resolver_id
146    }
147}
148
149impl From<SimilaritySessionCompletionQuery> for BNSimilaritySessionCompletionQuery {
150    fn from(value: SimilaritySessionCompletionQuery) -> Self {
151        Self {
152            hasNodeId: value.node_id.is_some(),
153            nodeId: value.node_id.unwrap_or(SimilaritySessionNodeId(0)).into(),
154            hasProviderId: value.provider_id.is_some(),
155            providerId: value.provider_id.unwrap_or(SimilarityProviderId(0)).into(),
156            hasResolverId: value.resolver_id.is_some(),
157            resolverId: value
158                .resolver_id
159                .unwrap_or(SimilaritySessionResolverId(0))
160                .into(),
161        }
162    }
163}
164
165/// Identifies an entity within a session node.
166#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
167pub struct SimilarityEntityRef {
168    pub node_id: SimilaritySessionNodeId,
169    pub entity_id: SimilarityEntityId,
170}
171
172/// Information about an entity.
173#[derive(Debug, Clone, PartialEq, Eq, Hash)]
174pub struct SimilarityEntityInfo {
175    pub entity_type: SimilarityEntityType,
176    /// The address of the entity within its [`crate::binary_view::BinaryView`].
177    pub address: u64,
178    /// The display name of the entity.
179    pub name: String,
180}
181
182impl From<BNSimilarityEntityRef> for SimilarityEntityRef {
183    fn from(value: BNSimilarityEntityRef) -> Self {
184        Self {
185            node_id: value.nodeId.into(),
186            entity_id: value.entityId.into(),
187        }
188    }
189}
190
191impl From<SimilarityEntityRef> for BNSimilarityEntityRef {
192    fn from(value: SimilarityEntityRef) -> Self {
193        Self {
194            nodeId: value.node_id.into(),
195            entityId: value.entity_id.into(),
196        }
197    }
198}