diff --git a/src/demon/demon_core.c b/src/demon/demon_core.c index 75cca59e..bba2dc69 100644 --- a/src/demon/demon_core.c +++ b/src/demon/demon_core.c @@ -180,3 +180,29 @@ dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr) scratch_end(scratch); return result; } + +internal String8 +dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange) +{ + String8 block = {0}; + void *raw = dmn_process_read_raw(arena, process, vrange); + if(raw) + { + block = str8(raw, dim_1u64(vrange)); + } + return block; +} + +internal void * +dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange) +{ + Temp temp = temp_begin(arena); + void *buffer = push_array(arena, U8, dim_1u64(vrange)); + U64 read_size = dmn_process_read(process, vrange, buffer); + if(read_size != dim_1u64(vrange)) + { + buffer = 0; + temp_end(temp); + } + return buffer; +} diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index b46f316b..e158e8ab 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -76,6 +76,8 @@ struct DMN_Event U32 flags; // DMN_TrapFlags, if `DMN_EventKind_SetBreakpoint` S32 signo; S32 sigcode; + Rng1U64 elf_phdr_vrange; + U64 elf_phdr_entsize; U64 instruction_pointer; U64 stack_pointer; U64 user_data; @@ -195,6 +197,8 @@ internal U64 dmn_rsp_from_thread(DMN_Handle thread); //~ rjf: Process Reading Helper Functions (Helpers, Implemented Once) internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr); +internal String8 dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange); +internal void * dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange); //////////////////////////////// //~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS) diff --git a/src/demon/linux/demon_core_linux.c b/src/demon/linux/demon_core_linux.c index 8f613189..da822d95 100644 --- a/src/demon/linux/demon_core_linux.c +++ b/src/demon/linux/demon_core_linux.c @@ -367,8 +367,11 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process) DMN_LNX_ModuleInfoNode *n = push_array(arena, DMN_LNX_ModuleInfoNode, 1); SLLQueuePush(list.first, list.last, n); list.count += 1; - n->v.vaddr_range = shift_1u64(phdr_info.range, base_vaddr); - n->v.name = aux.execfn; + n->v.vaddr_range = r1u64(base_vaddr, base_vaddr + dim_1u64(phdr_info.range)); + n->v.name = aux.execfn; + n->v.phvaddr = aux.phdr; + n->v.phentsize = aux.phent; + n->v.phcount = aux.phnum; } //- rjf: iterate link maps @@ -426,7 +429,10 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process) SLLQueuePush(list.first, list.last, n); list.count += 1; n->v.vaddr_range = r1u64(linkmap.base, linkmap.base + dim_1u64(module_phdr_info.range)); - n->v.name = linkmap.name; + n->v.name = linkmap.name; + n->v.phvaddr = phvaddr; + n->v.phentsize = phentsize; + n->v.phcount = phcount; } // rjf: iterate @@ -1108,14 +1114,16 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params) module->id = n->v.name; { DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events); - e->kind = DMN_EventKind_LoadModule; - e->process = dmn_lnx_handle_from_entity(process); - e->thread = dmn_lnx_handle_from_entity(main_thread); - e->module = dmn_lnx_handle_from_entity(module); - e->arch = process->arch; - e->address = n->v.vaddr_range.min; - e->size = dim_1u64(n->v.vaddr_range); - e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name); + e->kind = DMN_EventKind_LoadModule; + e->process = dmn_lnx_handle_from_entity(process); + e->thread = dmn_lnx_handle_from_entity(main_thread); + e->module = dmn_lnx_handle_from_entity(module); + e->arch = process->arch; + e->address = n->v.vaddr_range.min; + e->size = dim_1u64(n->v.vaddr_range); + e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name); + e->elf_phdr_vrange = r1u64(n->v.phvaddr, n->v.phvaddr + n->v.phentsize * n->v.phcount); + e->elf_phdr_entsize = n->v.phentsize; } } diff --git a/src/demon/linux/demon_core_linux.h b/src/demon/linux/demon_core_linux.h index 297fdb3a..8fd38499 100644 --- a/src/demon/linux/demon_core_linux.h +++ b/src/demon/linux/demon_core_linux.h @@ -216,6 +216,9 @@ struct DMN_LNX_ModuleInfo { Rng1U64 vaddr_range; U64 name; + U64 phvaddr; + U64 phentsize; + U64 phcount; }; typedef struct DMN_LNX_ModuleInfoNode DMN_LNX_ModuleInfoNode; @@ -261,6 +264,9 @@ struct DMN_LNX_Entity U64 id; int fd; B32 expecting_dummy_sigstop; + U64 phvaddr; + U64 phentsize; + U64 phcount; }; typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode; @@ -311,6 +317,8 @@ internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src); #define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) #define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr)) internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr); +internal void * dmn_lnx_read_raw(Arena *arena, int memory_fd, Rng1U64 vrange); +internal String8 dmn_lnx_read_block(Arena *arena, int memory_fd, Rng1U64 vrange); //- rjf: pid => info extraction internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid);