From 5369407082db53b68a1100e7b5391a1e9c36e621 Mon Sep 17 00:00:00 2001 From: Orfeas <38209077+0xfea5@users.noreply.github.com> Date: Tue, 16 Apr 2024 00:19:57 +0300 Subject: Parse /proc/pid/maps --- src/vm.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/vm.c (limited to 'src/vm.c') diff --git a/src/vm.c b/src/vm.c new file mode 100644 index 0000000..8e62426 --- /dev/null +++ b/src/vm.c @@ -0,0 +1,77 @@ +#include +#include +#include +#include +#include +#include "vm.h" +#include "util.h" + +static void strtrim (char *str) +{ + char *begin = str; + while (isspace(*begin)) { + begin++; + } + size_t len = strlen(begin); + char *end = begin + len; + while (end > begin && isspace(*end)) { + end++; + } + + memmove(str, begin, end - begin + 1); +} + +VMMapping* parse_vmmap (int pid) +{ + char fmaps_path[128]; + sprintf(fmaps_path, "/proc/%d/maps", pid); + FILE *fmaps; + + if ((fmaps = fopen(fmaps_path, "r")) == NULL) { + perror("fopen"); + exit(1); + } + + uint64_t begin, end; + char perms[16]; + char filename[1024]; + VMMapping *head = NULL; + VMMapping *cur = NULL; + + while( + fscanf(fmaps, "%lx-%lx %15s %*x %*x:%*x %*u%1023[^\n]", + &begin, &end, perms, filename) != EOF) { + strtrim(filename); + + VMMapping *new_mapping = xmalloc(sizeof(VMMapping)); + *new_mapping = (VMMapping) { + .begin = begin, + .end = end, + .r = perms[0] == 'r', + .w = perms[1] == 'w', + .x = perms[2] == 'x', + .s = perms[3] == 's', + .p = perms[3] == 'p', + .name = strdup(filename), + .next = NULL, + }; + + if (head) { + cur->next = new_mapping; + cur = new_mapping; + } else { + head = cur = new_mapping; + } + + LOG("%lx-%lx %c%c%c%c %s\n", + cur->begin, + cur->end, + cur->r ? 'r' : '-', + cur->w ? 'w' : '-', + cur->x ? 'x' : '-', + cur->s ? 's' : 'p', + cur->name); + } + + return head; +} -- cgit v1.2.3