1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#include <stdio.h>
typedef unsigned int uint;
/* Below is a structure containing information for the following
* registers:
* **********
* General purpose:
* EAX EBX ECX EDX
* Segment registers:
* CS DS ES FS GS SS
* Index and pointers:
* ESI EDI EBP EIP ESP
*/
struct cpu_registers_contents {
/* General purpose registers: */
uint eax;
uint ebx;
uint ecx;
uint edx;
/* Segment registers: */
/* Unsure of data type; TODO: Find out datatype. */
/* Index and pointer registers: */
/* TODO: Figure out datatype of index */
uint ebp;
uint eip;
uint esp;
} reg;
void getRegisters(void);
int main() {
getRegisters();
printf("Contents of registers:\n\t");
printf("General purpose registers:\n\t\t");
printf("eax: %6d\n\t\tebx: %6d\n\t\tecx: %6d\n\t\tedx: %6d\n\t",
reg.eax, reg.ebx, reg.ecx, reg.edx);
printf("Segment registers: As yet unable to get.\n\t");
printf("Index registers: As yet unable to get.\n\t");
printf("Pointer registers:\n\t\t");
printf("ebp: %6d\n\t\teip: unable to get\n\t\tesp: %6d\n",
reg.ebp, /* reg.eip, */ reg.esp);
return 0;
}
/* getRegisters() -- set values in struct cpu_registers_contents to the values
* of the appropriate CPU registers.
* Return value: void (none);
* Arguments: void (none).
*/
void getRegisters(void) {
int temp;
/* Get general purpose registers: */
asm("movl %%eax, %0\n" :"=r"(temp));
reg.eax = temp;
asm("movl %%ebx, %0\n" :"=r"(temp));
reg.ebx = temp;
asm("movl %%ecx, %0\n" :"=r"(temp));
reg.ecx = temp;
asm("movl %%edx, %0\n" :"=r"(temp));
reg.edx = temp;
/* Get pointer addresses */
asm("movl %%ebp, %0" :"=r"(temp));
reg.ebp = temp;
asm("movl %%esp, %0" :"=r"(temp));
reg.esp = temp;
}
|
output:
root@chris:/home/chris# gcc -Wall -pedantic getRegisters.c
root@chris:/home/chris# ./a.out
Contents of registers:
General purpose registers:
eax: 1100946112
ebx: 4195872
ecx: 0
edx: 1237406696
Segment registers: As yet unable to get.
Index registers: As yet unable to get.
Pointer registers:
ebp: 1237406448
eip: unable to get
esp: 1237406448 | |