@@ -7,6 +7,7 @@ use memflow_win32::{Error, Result};
7
7
8
8
use simplelog:: { Config , LevelFilter , TermLogger , TerminalMode } ;
9
9
10
+ use std:: collections:: BTreeSet ;
10
11
use std:: convert:: TryInto ;
11
12
12
13
mod value_scanner;
@@ -46,19 +47,12 @@ fn main() -> Result<()> {
46
47
//let replace_str = b"Hello world from memflow!";
47
48
48
49
let mut value_scanner = ValueScanner :: default ( ) ;
49
-
50
50
let mut typename: Option < String > = None ;
51
51
let mut buf_len = 0 ;
52
52
53
53
let mut disasm = Disasm :: default ( ) ;
54
- disasm. collect_globals ( & mut process) ?;
55
-
56
54
let mut pointer_map = PointerMap :: default ( ) ;
57
55
58
- for ( & instr, & global) in disasm. map ( ) . iter ( ) . filter ( |( _, & o) | o == 0xa9770 . into ( ) ) {
59
- println ! ( "{:x} -> {:x}" , instr, global) ;
60
- }
61
-
62
56
while let Ok ( line) = get_line ( ) {
63
57
let line = line. trim ( ) ;
64
58
@@ -87,9 +81,14 @@ fn main() -> Result<()> {
87
81
process. proc_info . proc_arch . size_addr ( ) ,
88
82
) ?;
89
83
}
84
+ "globals" | "g" => {
85
+ disasm. reset ( ) ;
86
+ disasm. collect_globals ( & mut process) ?;
87
+ println ! ( "Global variable references found: {:x}" , disasm. map( ) . len( ) ) ;
88
+ }
90
89
"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 ] )
93
92
{
94
93
if pointer_map. map ( ) . is_empty ( ) {
95
94
pointer_map. create_map (
@@ -98,12 +97,21 @@ fn main() -> Result<()> {
98
97
) ?;
99
98
}
100
99
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
+ } ;
107
115
108
116
println ! ( "Matches found: {}" , matches. len( ) ) ;
109
117
@@ -124,7 +132,10 @@ fn main() -> Result<()> {
124
132
println ! ( "{:x}" , m) ;
125
133
}
126
134
} 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
+ ) ;
128
139
}
129
140
}
130
141
_ => {
0 commit comments