Ostatnio aktywny 1 month ago

shim_search.c Surowy
1// For RTLD_NEXT
2#define _GNU_SOURCE
3
4#include <stdio.h>
5#include <dlfcn.h>
6#include <stdlib.h>
7#include <string.h>
8
9static FILE *(*real_fopen)(const char *, const char *) = NULL;
10
11#define SEARCH_TOKEN_SIZE 6
12char mySearchToken[SEARCH_TOKEN_SIZE] = "That's";
13
14void *searchData(char *data, int len, void *start, void *end) {
15 void *i;
16
17 for(i = start; i < end; i += 1) {
18 if (memcmp(i, data, len) == 0 && i != (void *)data) {
19 return i;
20 }
21 }
22
23 return NULL;
24}
25
26
27FILE * fopen ( const char * filename, const char * mode ) {
28 printf("HUEBR, GIBE DATA PLOS, OR I REPORT U HUEHUE\n");
29 printf("MI NO LIK U FIL, MI UPEN HUE.TXT\n");
30
31 return real_fopen("hue.txt", "w");
32}
33
34void __attribute__((constructor)) initialize(void) {
35 real_fopen = dlsym(RTLD_NEXT, "fopen");
36
37 if (real_fopen == NULL) {
38 printf("What? We couldn't find our fopen!!!!\n");
39 exit(255); // This will crash the program since it isn't expecting to exit in the constructor
40 }
41
42 void *addr = searchData(mySearchToken, SEARCH_TOKEN_SIZE, (void *)0x4006e0, (void*)0x400791 ); // Thats for 64 bit.
43
44 printf("Token Addr: %p\n", addr);
45}