Reading and writing to memory

This commit is contained in:
kamkow1
2025-03-09 20:31:53 +01:00
parent cc14cab9b5
commit 643616cc14
2 changed files with 50 additions and 0 deletions

View File

@@ -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
}