Skip to content

Commit 4fc8417

Browse files
fix program header rebase issue in non-PIE exes, and export program header
info through DEMON event
1 parent 74e5770 commit 4fc8417

File tree

4 files changed

+57
-11
lines changed

4 files changed

+57
-11
lines changed

src/demon/demon_core.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,29 @@ dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr)
180180
scratch_end(scratch);
181181
return result;
182182
}
183+
184+
internal String8
185+
dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange)
186+
{
187+
String8 block = {0};
188+
void *raw = dmn_process_read_raw(arena, process, vrange);
189+
if(raw)
190+
{
191+
block = str8(raw, dim_1u64(vrange));
192+
}
193+
return block;
194+
}
195+
196+
internal void *
197+
dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange)
198+
{
199+
Temp temp = temp_begin(arena);
200+
void *buffer = push_array(arena, U8, dim_1u64(vrange));
201+
U64 read_size = dmn_process_read(process, vrange, buffer);
202+
if(read_size != dim_1u64(vrange))
203+
{
204+
buffer = 0;
205+
temp_end(temp);
206+
}
207+
return buffer;
208+
}

src/demon/demon_core.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ struct DMN_Event
7676
U32 flags; // DMN_TrapFlags, if `DMN_EventKind_SetBreakpoint`
7777
S32 signo;
7878
S32 sigcode;
79+
Rng1U64 elf_phdr_vrange;
80+
U64 elf_phdr_entsize;
7981
U64 instruction_pointer;
8082
U64 stack_pointer;
8183
U64 user_data;
@@ -195,6 +197,8 @@ internal U64 dmn_rsp_from_thread(DMN_Handle thread);
195197
//~ rjf: Process Reading Helper Functions (Helpers, Implemented Once)
196198

197199
internal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr);
200+
internal String8 dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange);
201+
internal void * dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange);
198202

199203
////////////////////////////////
200204
//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS)

src/demon/linux/demon_core_linux.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,11 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process)
367367
DMN_LNX_ModuleInfoNode *n = push_array(arena, DMN_LNX_ModuleInfoNode, 1);
368368
SLLQueuePush(list.first, list.last, n);
369369
list.count += 1;
370-
n->v.vaddr_range = shift_1u64(phdr_info.range, base_vaddr);
371-
n->v.name = aux.execfn;
370+
n->v.vaddr_range = r1u64(base_vaddr, base_vaddr + dim_1u64(phdr_info.range));
371+
n->v.name = aux.execfn;
372+
n->v.phvaddr = aux.phdr;
373+
n->v.phentsize = aux.phent;
374+
n->v.phcount = aux.phnum;
372375
}
373376

374377
//- rjf: iterate link maps
@@ -426,7 +429,10 @@ dmn_lnx_module_info_list_from_process(Arena *arena, DMN_LNX_Entity *process)
426429
SLLQueuePush(list.first, list.last, n);
427430
list.count += 1;
428431
n->v.vaddr_range = r1u64(linkmap.base, linkmap.base + dim_1u64(module_phdr_info.range));
429-
n->v.name = linkmap.name;
432+
n->v.name = linkmap.name;
433+
n->v.phvaddr = phvaddr;
434+
n->v.phentsize = phentsize;
435+
n->v.phcount = phcount;
430436
}
431437

432438
// rjf: iterate
@@ -1108,14 +1114,16 @@ dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params)
11081114
module->id = n->v.name;
11091115
{
11101116
DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);
1111-
e->kind = DMN_EventKind_LoadModule;
1112-
e->process = dmn_lnx_handle_from_entity(process);
1113-
e->thread = dmn_lnx_handle_from_entity(main_thread);
1114-
e->module = dmn_lnx_handle_from_entity(module);
1115-
e->arch = process->arch;
1116-
e->address = n->v.vaddr_range.min;
1117-
e->size = dim_1u64(n->v.vaddr_range);
1118-
e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name);
1117+
e->kind = DMN_EventKind_LoadModule;
1118+
e->process = dmn_lnx_handle_from_entity(process);
1119+
e->thread = dmn_lnx_handle_from_entity(main_thread);
1120+
e->module = dmn_lnx_handle_from_entity(module);
1121+
e->arch = process->arch;
1122+
e->address = n->v.vaddr_range.min;
1123+
e->size = dim_1u64(n->v.vaddr_range);
1124+
e->string = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, n->v.name);
1125+
e->elf_phdr_vrange = r1u64(n->v.phvaddr, n->v.phvaddr + n->v.phentsize * n->v.phcount);
1126+
e->elf_phdr_entsize = n->v.phentsize;
11191127
}
11201128
}
11211129

src/demon/linux/demon_core_linux.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,9 @@ struct DMN_LNX_ModuleInfo
216216
{
217217
Rng1U64 vaddr_range;
218218
U64 name;
219+
U64 phvaddr;
220+
U64 phentsize;
221+
U64 phcount;
219222
};
220223

221224
typedef struct DMN_LNX_ModuleInfoNode DMN_LNX_ModuleInfoNode;
@@ -261,6 +264,9 @@ struct DMN_LNX_Entity
261264
U64 id;
262265
int fd;
263266
B32 expecting_dummy_sigstop;
267+
U64 phvaddr;
268+
U64 phentsize;
269+
U64 phcount;
264270
};
265271

266272
typedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode;
@@ -311,6 +317,8 @@ internal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src);
311317
#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
312318
#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))
313319
internal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr);
320+
internal void * dmn_lnx_read_raw(Arena *arena, int memory_fd, Rng1U64 vrange);
321+
internal String8 dmn_lnx_read_block(Arena *arena, int memory_fd, Rng1U64 vrange);
314322

315323
//- rjf: pid => info extraction
316324
internal String8 dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid);

0 commit comments

Comments
 (0)