Skip to content

Commit aac7967

Browse files
committed
Code for Episode 9
1 parent 5a4d070 commit aac7967

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

scanflow/src/main.rs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use memflow_win32::{Error, Result};
77

88
use simplelog::{Config, LevelFilter, TermLogger, TerminalMode};
99

10+
use std::collections::BTreeSet;
1011
use std::convert::TryInto;
1112

1213
mod value_scanner;
@@ -46,19 +47,12 @@ fn main() -> Result<()> {
4647
//let replace_str = b"Hello world from memflow!";
4748

4849
let mut value_scanner = ValueScanner::default();
49-
5050
let mut typename: Option<String> = None;
5151
let mut buf_len = 0;
5252

5353
let mut disasm = Disasm::default();
54-
disasm.collect_globals(&mut process)?;
55-
5654
let mut pointer_map = PointerMap::default();
5755

58-
for (&instr, &global) in disasm.map().iter().filter(|(_, &o)| o == 0xa9770.into()) {
59-
println!("{:x} -> {:x}", instr, global);
60-
}
61-
6256
while let Ok(line) = get_line() {
6357
let line = line.trim();
6458

@@ -87,9 +81,14 @@ fn main() -> Result<()> {
8781
process.proc_info.proc_arch.size_addr(),
8882
)?;
8983
}
84+
"globals" | "g" => {
85+
disasm.reset();
86+
disasm.collect_globals(&mut process)?;
87+
println!("Global variable references found: {:x}", disasm.map().len());
88+
}
9089
"offset_scan" | "os" => {
91-
if let (Some(lrange), Some(urange), Some(max_depth), filter_addr) =
92-
scan_fmt_some!(args, "{} {} {} {x}", usize, usize, usize, [hex u64])
90+
if let (Some(use_di), Some(lrange), Some(urange), Some(max_depth), filter_addr) =
91+
scan_fmt_some!(args, "{} {} {} {} {x}", String, usize, usize, usize, [hex u64])
9392
{
9493
if pointer_map.map().is_empty() {
9594
pointer_map.create_map(
@@ -98,12 +97,21 @@ fn main() -> Result<()> {
9897
)?;
9998
}
10099

101-
let matches = pointer_map.find_matches(
102-
lrange,
103-
urange,
104-
max_depth,
105-
value_scanner.matches(),
106-
);
100+
let matches = if use_di == "y" {
101+
if disasm.map().is_empty() {
102+
disasm.collect_globals(&mut process)?;
103+
}
104+
let set: BTreeSet<_> = disasm.map().values().copied().collect();
105+
pointer_map.find_matches_addrs(
106+
lrange,
107+
urange,
108+
max_depth,
109+
value_scanner.matches(),
110+
set.into_iter(),
111+
)
112+
} else {
113+
pointer_map.find_matches(lrange, urange, max_depth, value_scanner.matches())
114+
};
107115

108116
println!("Matches found: {}", matches.len());
109117

@@ -124,7 +132,10 @@ fn main() -> Result<()> {
124132
println!("{:x}", m);
125133
}
126134
} else {
127-
println!("usage: os {{lower range}} {{upper range}} {{max depth}}");
135+
println!(
136+
"usage: os {{y/[n]}} {{lower range}} {{upper range}} {{max
137+
depth}} ({{filter}})"
138+
);
128139
}
129140
}
130141
_ => {

scanflow/src/pointer_map.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,15 +98,16 @@ impl PointerMap {
9898
}
9999
}
100100

101-
pub fn find_matches(
101+
pub fn find_matches_addrs(
102102
&self,
103103
lrange: usize,
104104
urange: usize,
105105
max_depth: usize,
106106
search_for: &[Address],
107+
addrs: impl Iterator<Item = Address>,
107108
) -> Vec<(Address, Vec<(Address, isize)>)> {
108109
let mut matches = vec![];
109-
for &k in self.map.keys() {
110+
for k in addrs {
110111
self.walk_down_range(
111112
k,
112113
lrange,
@@ -120,6 +121,22 @@ impl PointerMap {
120121
}
121122
matches
122123
}
124+
125+
pub fn find_matches(
126+
&self,
127+
lrange: usize,
128+
urange: usize,
129+
max_depth: usize,
130+
search_for: &[Address],
131+
) -> Vec<(Address, Vec<(Address, isize)>)> {
132+
self.find_matches_addrs(
133+
lrange,
134+
urange,
135+
max_depth,
136+
search_for,
137+
self.map.keys().copied(),
138+
)
139+
}
123140
}
124141

125142
pub fn signed_diff(a: Address, b: Address) -> isize {

0 commit comments

Comments
 (0)