1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
use binaryninja::binary_view::{BinaryView, BinaryViewExt};
use binaryninja::rc::Ref as BNRef;
use binaryninja::symbol::Symbol as BNSymbol;
use binaryninja::symbol::SymbolType as BNSymbolType;
use warp::symbol::{Symbol, SymbolClass, SymbolModifiers};
pub fn from_bn_symbol(raw_symbol: &BNSymbol) -> Symbol {
// TODO: Use this?
let _is_export = raw_symbol.external();
let raw_symbol_name = raw_symbol.raw_name();
let symbol_name = raw_symbol_name.to_string_lossy();
match raw_symbol.sym_type() {
BNSymbolType::ImportAddress => {
Symbol::new(
symbol_name,
SymbolClass::Function,
// TODO: External = symbolic i guess
SymbolModifiers::External,
)
}
BNSymbolType::Data => {
Symbol::new(
symbol_name,
// TODO: Data?
SymbolClass::Data,
SymbolModifiers::default(),
)
}
BNSymbolType::Symbolic => {
Symbol::new(
symbol_name,
SymbolClass::Function,
// TODO: External = symbolic i guess
SymbolModifiers::External,
)
}
BNSymbolType::LocalLabel => {
// TODO: This is a placeholder for another symbol.
Symbol::new(symbol_name, SymbolClass::Data, SymbolModifiers::External)
}
BNSymbolType::External => Symbol::new(
symbol_name,
// TODO: External data?
SymbolClass::Function,
SymbolModifiers::External,
),
BNSymbolType::ImportedData => {
Symbol::new(symbol_name, SymbolClass::Data, SymbolModifiers::External)
}
BNSymbolType::LibraryFunction | BNSymbolType::Function => Symbol::new(
symbol_name,
SymbolClass::Function,
SymbolModifiers::default(),
),
BNSymbolType::ImportedFunction => Symbol::new(
symbol_name,
SymbolClass::Function,
// TODO: Exported?
SymbolModifiers::External,
),
}
}
pub fn to_bn_symbol_at_address(view: &BinaryView, symbol: &Symbol, addr: u64) -> BNRef<BNSymbol> {
let is_external = symbol.modifiers.contains(SymbolModifiers::External);
let _is_exported = symbol.modifiers.contains(SymbolModifiers::Exported);
let symbol_type = match symbol.class {
SymbolClass::Function if is_external => BNSymbolType::ImportedFunction,
// TODO: We should instead make it a Function, however due to the nature of the imports we are setting them to library for now.
SymbolClass::Function => BNSymbolType::LibraryFunction,
SymbolClass::Data if is_external => BNSymbolType::ImportedData,
SymbolClass::Data => BNSymbolType::Data,
_ => BNSymbolType::Data,
};
let raw_name = symbol.name.as_str();
let mut symbol_builder = BNSymbol::builder(symbol_type, &symbol.name, addr);
// Demangle symbol name (short is with simplifications).
if let Some(arch) = view.default_arch() {
if let Some((full_name, _)) =
binaryninja::demangle::demangle_generic(&arch, raw_name, Some(view), false)
{
symbol_builder = symbol_builder.full_name(full_name);
}
if let Some((short_name, _)) =
binaryninja::demangle::demangle_generic(&arch, raw_name, Some(view), false)
{
symbol_builder = symbol_builder.short_name(short_name);
}
}
symbol_builder.create()
}
|