Reading and writing to memory
This commit is contained in:
@@ -11,6 +11,7 @@ print_pid();
|
||||
print_program_load_offset();
|
||||
mk_brk_addr(main_offset);
|
||||
list_brks();
|
||||
|
||||
log_inf("1 --------------------------------------------");
|
||||
dump_regs();
|
||||
var r14 = get_reg("r14");
|
||||
@@ -20,4 +21,12 @@ dump_regs();
|
||||
set_reg("r14", r14);
|
||||
log_inf("3 --------------------------------------------");
|
||||
dump_regs();
|
||||
|
||||
var r14_mem = mem_read(get_reg("r14"));
|
||||
log_inf("Memory at r14 " + r14_mem);
|
||||
mem_write(get_reg("r14"), "0x696969");
|
||||
log_inf("Memory at r14 " + mem_read(get_reg("r14")));
|
||||
mem_write(get_reg("r14"), r14_mem);
|
||||
log_inf("Memory at r14 " + mem_read(get_reg("r14")));
|
||||
|
||||
cont();
|
||||
|
||||
41
debugus.c
41
debugus.c
@@ -26,6 +26,8 @@
|
||||
|
||||
#define INIT_SCRIPT ".debugusrc.js"
|
||||
|
||||
// Registers
|
||||
|
||||
typedef enum {
|
||||
rax,
|
||||
rbx,
|
||||
@@ -139,6 +141,18 @@ Register get_reg_from_name(const char *name)
|
||||
}
|
||||
}
|
||||
|
||||
// Memory
|
||||
|
||||
uint64_t mem_read(pid_t pid, uint64_t addr)
|
||||
{
|
||||
return ptrace(PTRACE_PEEKDATA, pid, addr, NULL);
|
||||
}
|
||||
|
||||
void mem_write(pid_t pid, uint64_t addr, uint64_t v)
|
||||
{
|
||||
ptrace(PTRACE_POKEDATA, pid, addr, v);
|
||||
}
|
||||
|
||||
// How breakpoints work?
|
||||
// We can enable/disable breakpoints by putting/removing an int 3 instruction
|
||||
// into/from the executed program. int 3 will trigger a SIGTRAP, which we can
|
||||
@@ -316,6 +330,31 @@ void dbg_js_set_reg(js_State *js)
|
||||
js_pushundefined(js);
|
||||
}
|
||||
|
||||
void dbg_js_mem_read(js_State *js)
|
||||
{
|
||||
Dbg *dbg = getdbg();
|
||||
const char *addr_str = js_tostring(js, 1);
|
||||
uintptr_t addr;
|
||||
sscanf(addr_str, "0x%"SCNxPTR, &addr);
|
||||
uint64_t v = mem_read(dbg->pid, addr);
|
||||
char buf[20];
|
||||
snprintf(buf, sizeof(buf), "0x%"PRIx64, v);
|
||||
js_pushstring(js, buf);
|
||||
}
|
||||
|
||||
void dbg_js_mem_write(js_State *js)
|
||||
{
|
||||
Dbg *dbg = getdbg();
|
||||
const char *addr_str = js_tostring(js, 1);
|
||||
uintptr_t addr;
|
||||
sscanf(addr_str, "0x%"SCNxPTR, &addr);
|
||||
const char *value_str = js_tostring(js, 2);
|
||||
uint64_t value;
|
||||
sscanf(value_str, "0x%"SCNx64, &value);
|
||||
mem_write(dbg->pid, addr, value);
|
||||
js_pushundefined(js);
|
||||
}
|
||||
|
||||
void dbg_init_js(Dbg *dbg)
|
||||
{
|
||||
dbg->js = js_newstate(NULL, NULL, JS_STRICT);
|
||||
@@ -339,6 +378,8 @@ void dbg_init_js(Dbg *dbg)
|
||||
make_js_func(get_program_load_offset, 0);
|
||||
make_js_func(get_reg, 1 /*reg name*/);
|
||||
make_js_func(set_reg, 2 /* reg name, value*/);
|
||||
make_js_func(mem_read, 1 /*addr*/);
|
||||
make_js_func(mem_write, 2 /*addr, value*/);
|
||||
|
||||
#undef make_js_func
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user