Skip to content

Commit 0577345

Browse files
rbranemesare
authored andcommitted
Implement Rust DisassemblyTextRenderer
1 parent a039d39 commit 0577345

File tree

3 files changed

+372
-6
lines changed

3 files changed

+372
-6
lines changed

rust/examples/disassemble.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use binaryninja::binary_view::{BinaryViewBase, BinaryViewExt};
2+
use binaryninja::disassembly::{DisassemblyOption, DisassemblySettings, DisassemblyTextRenderer};
3+
use binaryninja::function::Function;
4+
5+
fn disassemble(func: &Function) {
6+
let settings = DisassemblySettings::new();
7+
settings.set_option(DisassemblyOption::ShowAddress, false);
8+
settings.set_option(DisassemblyOption::WaitForIL, true);
9+
settings.set_option(DisassemblyOption::IndentHLILBody, false);
10+
settings.set_option(DisassemblyOption::ShowCollapseIndicators, false);
11+
settings.set_option(DisassemblyOption::ShowFunctionHeader, false);
12+
13+
let text_renderer = DisassemblyTextRenderer::from_function(func, Some(&settings));
14+
for basic_block in &func.basic_blocks() {
15+
for instr_addr in basic_block.iter() {
16+
// NOTE: If you want the annotations as well you can call text_renderer.disassembly_text
17+
if let Some((text, len)) = text_renderer.instruction_text(instr_addr) {
18+
// TODO: This only ever appears to return a single string?
19+
let text_string: Vec<_> = text.iter().map(|t| t.to_string()).collect();
20+
println!("{}", text_string.join(""));
21+
}
22+
}
23+
}
24+
}
25+
26+
pub fn main() {
27+
let filename = std::env::args().nth(1).expect("No filename provided");
28+
29+
println!("Starting session...");
30+
// This loads all the core architecture, platform, etc plugins
31+
let headless_session =
32+
binaryninja::headless::Session::new().expect("Failed to initialize session");
33+
34+
println!("Loading binary...");
35+
let bv = headless_session
36+
.load(&filename)
37+
.expect("Couldn't open file!");
38+
39+
println!("Filename: `{}`", bv.file().filename());
40+
println!("File size: `{:#x}`", bv.len());
41+
println!("Function count: {}", bv.functions().len());
42+
43+
for func in &bv.functions() {
44+
disassemble(func.as_ref());
45+
}
46+
}

0 commit comments

Comments
 (0)