|
|
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.