Skip to content

Commit 2ae29bf

Browse files
Merge pull request #87 from wcampbell0x2a/print-asm-or-symbol-in-deref
2 parents 844cc12 + b60e7b5 commit 2ae29bf

File tree

8 files changed

+238
-50
lines changed

8 files changed

+238
-50
lines changed

images/screenshot.png

-343 Bytes
Loading

src/deref.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@ use log::debug;
66
pub struct Deref {
77
pub map: VecDeque<u64>,
88
pub repeated_pattern: bool,
9+
pub final_assembly: String,
910
}
1011

1112
impl Deref {
1213
pub fn new() -> Self {
13-
Self { map: VecDeque::new(), repeated_pattern: false }
14+
Self { map: VecDeque::new(), repeated_pattern: false, final_assembly: String::new() }
1415
}
1516

16-
/// Attempts to insert a `u64` value. Returns `true` if inserted, `false` otherwise.
17+
/// Attempts to insert a `u64` value and prevents repeated patterns
18+
///
19+
/// Returns `true` if inserted, `false` otherwise.
1720
pub fn try_push(&mut self, value: u64) -> bool {
1821
self.map.push_back(value);
1922

src/gdb.rs

+194-33
Large diffs are not rendered by default.

src/main.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ impl App {
289289
} else if r.is_heap() {
290290
is_heap = true;
291291
break;
292-
} else if r.is_path(filepath) {
292+
} else if r.is_path(filepath) || r.is_exec() {
293293
// TODO(23): This could be expanded to all segments loaded in
294294
// as executable
295295
is_text = true;
@@ -316,6 +316,12 @@ enum Written {
316316
Stack(Option<String>),
317317
/// Requested Memory Read (for hexdump)
318318
Memory,
319+
/// Requested Asm At $pc
320+
AsmAtPc,
321+
/// Requested symbol at addr for register (from deref)
322+
SymbolAtAddrRegister((String, u64)),
323+
/// Requested symbol at addr for stack (from deref)
324+
SymbolAtAddrStack(String),
319325
}
320326

321327
fn main() -> Result<(), Box<dyn Error>> {

src/mi.rs

+16-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ use std::collections::HashMap;
44
use log::debug;
55
use regex::{CaptureMatches, Regex};
66

7+
/// Amount of bytes requested during deref to get symbol/asm
8+
pub const INSTRUCTION_LEN: usize = 8;
9+
710
fn match_inner_items(haystack: &str) -> CaptureMatches {
811
// compile once and re-use
912
// NOTE: this only parses nested 3 {} deep, more and this will fail!
@@ -52,6 +55,14 @@ impl MemoryMapping {
5255
self.path == Some(filepath.to_owned())
5356
}
5457

58+
pub fn is_exec(&self) -> bool {
59+
if let Some(permissions) = &self.permissions {
60+
permissions.contains('x')
61+
} else {
62+
false
63+
}
64+
}
65+
5566
/// Mapping contains the `addr`
5667
pub fn contains(&self, addr: u64) -> bool {
5768
(addr > self.start_address) && (addr < self.end_address)
@@ -405,10 +416,14 @@ pub fn data_read_memory_bytes(addr: u64, hex_offset: u64, len: u64) -> String {
405416
format!("-data-read-memory-bytes 0x{addr:02x}+0x{hex_offset:02x} {len}")
406417
}
407418

408-
pub fn data_disassemble(before: usize, amt: usize) -> String {
419+
pub fn data_disassemble_pc(before: usize, amt: usize) -> String {
409420
format!("-data-disassemble -s $pc-{before} -e $pc+{amt} -- 0")
410421
}
411422

423+
pub fn data_disassemble(start: usize, amt: usize) -> String {
424+
format!("-data-disassemble -s {start} -e {start}+{amt} -- 0")
425+
}
426+
412427
#[cfg(test)]
413428
mod tests {
414429
use super::*;

src/snapshots/heretek__tests__render_app.snap

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ snapshot_kind: text
66
"─────────────────────────────────────────────────────────────────────|heretek-v0.1.0-rc12|──────────────────────────────────────────────────────────────────────"
77
" Press q to exit, i to enter input | F1 main | F2 registers | F3 stack | F4 instructions | F5 output | F6 mapping | F7 hexdump | Heap | Stack | Code "
88
"Registers───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"
9-
" rax ➛ 0x401825 ➛ 0x40ec8348e5894855 "
9+
" rax ➛ 0x401825 ➛ main "
1010
" rbx ➛ 0x1 "
1111
" rcx ➛ <rcx_0> ➛ 0x04 "
1212
" rdx ➛ <rdx_0> ➛ <rdx_1> ➛ "<rdx_2>" "
@@ -15,9 +15,9 @@ snapshot_kind: text
1515
" rbp ➛ <rbp_0> ➛ <rbp_1> ➛ <rbp_2> ➛ 0x00 "
1616
"Stack───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"
1717
" <stack_0> ➛ <stack_6> ➛ <stack_6_0> ➛ <stack_6_1> ➛ <rbp_1> ➛ <rbp_2> ➛ 0x00 "
18-
" <stack_1> ➛ 0x40f022 ➛ 0x81840fc08548 "
19-
" <stack_2> ➛ 0x494b00 ➛ 0x440000001c "
20-
" <stack_3> ➛ 0x4a40e8 ➛ 0x476630 ➛ 0xe5894855fa1e0 "
18+
" <stack_1> ➛ 0x40f022 ➛ malloc "
19+
" <stack_2> ➛ 0x494b00 ➛ sbb $0x0,%al "
20+
" <stack_3> ➛ 0x4a40e8 ➛ DW.ref.__gcc_pe "
2121
" <stack_4> ➛ 0x00 "
2222
" <stack_5> ➛ 0x4ab198 ➛ 0x00 "
2323
" <stack_6> ➛ <stack_6_0> ➛ <stack_6_1> ➛ <rbp_1> ➛ <rbp_2> ➛ 0x00 "

src/ui/mod.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,15 @@ pub fn apply_val_color(cell: &mut Cell, is_stack: bool, is_heap: bool, is_text:
121121

122122
/// Add deref value to cells
123123
pub fn add_deref_to_cell(
124-
values: &Deref,
124+
deref: &Deref,
125125
cells: &mut Vec<Cell>,
126126
app: &App,
127127
filepath: &str,
128128
longest_cells: &mut usize,
129129
) {
130-
for (i, v) in values.map.iter().enumerate() {
130+
for (i, v) in deref.map.iter().enumerate() {
131131
// check if ascii if last deref
132-
if i + 1 == values.map.len() && *v > 0xff {
132+
if i + 1 == deref.map.len() && *v > 0xff {
133133
let bytes = (*v).to_le_bytes();
134134
if bytes
135135
.iter()
@@ -149,9 +149,12 @@ pub fn add_deref_to_cell(
149149
apply_val_color(&mut cell, is_stack, is_heap, is_text);
150150
cells.push(cell);
151151
}
152-
if values.repeated_pattern {
152+
if deref.repeated_pattern {
153153
cells.push(Cell::from("➛ [loop detected]").style(Style::new().fg(GRAY)));
154154
}
155+
if !deref.final_assembly.is_empty() {
156+
cells.push(Cell::from(format!("➛ {}", deref.final_assembly)).style(Style::new().fg(GRAY)));
157+
}
155158
if cells.len() > *longest_cells {
156159
*longest_cells = cells.len();
157160
}

src/ui/registers.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ pub fn draw_registers(app: &App, f: &mut Frame, register: Rect) {
2929
let empty = PathBuf::from("");
3030
let binding = filepath_lock.as_ref().unwrap_or(&empty);
3131
let filepath = binding.to_string_lossy();
32-
for (i, (name, register, vals)) in regs.iter().enumerate() {
32+
for (i, (name, register, derefs)) in regs.iter().enumerate() {
3333
if let Some(reg) = register {
3434
if !reg.is_set() {
3535
continue;
@@ -44,10 +44,10 @@ pub fn draw_registers(app: &App, f: &mut Frame, register: Rect) {
4444
Cell::from(format!(" {name}")).style(Style::new().fg(PURPLE));
4545
let (is_stack, is_heap, is_text) = app.classify_val(val, &filepath);
4646

47-
let mut extra_vals = Vec::new();
47+
let mut extra_derefs = Vec::new();
4848
add_deref_to_cell(
49-
vals,
50-
&mut extra_vals,
49+
derefs,
50+
&mut extra_derefs,
5151
app,
5252
&filepath,
5353
&mut longest_extra_val,
@@ -61,7 +61,7 @@ pub fn draw_registers(app: &App, f: &mut Frame, register: Rect) {
6161
reg_name = reg_name.style(Style::new().fg(RED));
6262
}
6363
let mut row = vec![reg_name, cell];
64-
row.append(&mut extra_vals);
64+
row.append(&mut extra_derefs);
6565
rows.push(Row::new(row));
6666
}
6767
}

0 commit comments

Comments
 (0)