|
|
1.1 ! root 1: /* Attempt to find page tables in /dev/mem. */ ! 2: #include <stdio.h> ! 3: #define ONE_CLICK 0x400 /* Number of longs in a click. */ ! 4: #define MEM_SIZE 0x460000L /* Size of memory on qiqineb. */ ! 5: #define PRESENT 0x00000001L /* Present bit for Page Table Entries. */ ! 6: #define TRUE (1==1) ! 7: #define FALSE (1==2) ! 8: ! 9: main() ! 10: { ! 11: static unsigned long page_buffer[ONE_CLICK]; /* Load pages here. */ ! 12: ! 13: int fd; /* Handle for /dev/mem. */ ! 14: ! 15: unsigned long *base; /* Loop through all possible clicks. */ ! 16: unsigned long *walker; /* Loop through each long in a click. */ ! 17: ! 18: int nonzero_seen; /* Seen a nonzero element in this click? */ ! 19: ! 20: if (-1 == (fd = open("/dev/mem", 0))) { ! 21: perror("Can't open /dev/mem"); ! 22: exit (1); ! 23: } ! 24: for (base = 0; base < (unsigned long *) MEM_SIZE; base += ONE_CLICK) { ! 25: ! 26: if (-1 == read(fd, page_buffer, ONE_CLICK*sizeof(long)) ) { ! 27: perror("Read error"); ! 28: exit (1); ! 29: } ! 30: ! 31: nonzero_seen = FALSE; ! 32: ! 33: for (walker = page_buffer; ! 34: walker < page_buffer + ONE_CLICK; ! 35: ++walker) { ! 36: ! 37: /* There must be at least one nonzero entry. */ ! 38: if (0 != *walker) { ! 39: nonzero_seen = TRUE; ! 40: ! 41: /* All nonzero PTE's must be present. */ ! 42: if (0L == (*walker & PRESENT)) { ! 43: break; ! 44: } ! 45: } ! 46: ! 47: /* All PTE's must point at existant memory. */ ! 48: if (*walker > MEM_SIZE) { ! 49: break; ! 50: } ! 51: } ! 52: ! 53: if (nonzero_seen && (page_buffer + ONE_CLICK == walker)) { ! 54: printf("Possible page table: %x\n", base); ! 55: } ! 56: } ! 57: } /* main() */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.