From a4b2c07ff946363bc6465b301e94c0f3bd2f8de7 Mon Sep 17 00:00:00 2001 From: Jakob Kaivo Date: Fri, 31 May 2024 15:20:09 -0400 Subject: add __memperm() for checking current memory permissions --- src/__memperm.c | 36 ++++++++++++++++++++++++++++++++++++ src/_forced/mmap.h | 1 + src/_memperm.h | 9 +++++++++ 3 files changed, 46 insertions(+) create mode 100644 src/__memperm.c create mode 100644 src/_memperm.h (limited to 'src') diff --git a/src/__memperm.c b/src/__memperm.c new file mode 100644 index 00000000..e3bcd64d --- /dev/null +++ b/src/__memperm.c @@ -0,0 +1,36 @@ +#include +#include +#include "_memperm.h" + +int __memperm(void *ptr) +{ + uintptr_t addr = (uintptr_t)ptr; + int ret = PROT_NONE; + + FILE *map = fopen("/proc/self/maps", "r"); + if (map == NULL) { + return -1; + } + + while (!feof(map)) { + uintmax_t low = 0; + uintmax_t high = 0; + char perms[5]; + fscanf(map, "%ju-%ju %4s%*s\n", &low, &high, perms); + if (low <= addr && high >= addr) { + if (perms[0] == 'r') { + ret |= PROT_READ; + } + if (perms[1] == 'w') { + ret |= PROT_WRITE; + } + if (perms[2] == 'x') { + ret |= PROT_EXEC; + } + break; + } + } + + fclose(map); + return ret; +} diff --git a/src/_forced/mmap.h b/src/_forced/mmap.h index 65c1ef01..24256479 100644 --- a/src/_forced/mmap.h +++ b/src/_forced/mmap.h @@ -5,6 +5,7 @@ #define PROT_NONE 0x0 #define PROT_READ 0x1 #define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 #define MAP_PRIVATE 0x02 #define MAP_FAILED (void*)(-1) #define MAP_ANONYMOUS (0x20) diff --git a/src/_memperm.h b/src/_memperm.h new file mode 100644 index 00000000..d32d93f8 --- /dev/null +++ b/src/_memperm.h @@ -0,0 +1,9 @@ +#ifndef ___MEMPERM_H__ +#define ___MEMPERM_H__ + +/* for PROT_READ, PROT_WRITE, and PROT_EXEC */ +#include "_forced/mmap.h" + +int __memperm(void *); + +#endif -- cgit v1.2.1