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
| // gcc cred.c -o cred
// cc cred.c -o cred -xarch=v9
// ./cred `ps -o user,pid,addr,args -p $$ |grep st13277 | awk '{print $3}'`
// ./cred 30029089570
//
#include "/local/patch/Solaris/8_Recommended/108528-29/SUNWhea/reloc/usr/include/sys/proc.h"
#include "/usr/include/sys/cred.h"
//
#include <stdio.h>
#include <stdlib.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <unistd.h>
//
main(int argc, char *argv[])
{
char xadrstproc[20];
int kmem = open("/dev/kmem", "r+");
long adrstproc;
long adrstcred;
//
struct proc myproc, *pstproc;
struct cred mycred, *pstcred;
//
printf("\n\tHello, cred !\n\n");
//
printf("\nargv[1] =%s (%%s)\n", argv[1]); // ceci est l'argument ascii du prog.
sprintf(xadrstproc, "0x%s", argv[1]); // ceci est la conversion de l'adresse ascii de la stucture proc.
printf("xadrstproc =%s (%%s)\n", xadrstproc); // ceci est l'argument ascii préfixé par 0x.
adrstproc=strtol(xadrstproc, NULL, 0); // enfournage de la chaine ascii dans un (long) long.
printf("adrstproc =%lld (%%lld)\n", adrstproc); // ceci est l'adr. déci la stucture proc.
printf("adrstproc =%llu (%%llu)\n", adrstproc); // ceci est l'adresse u-s de la stucture proc.
printf("adrstproc =%llx (%%llx)\n", adrstproc); // ceci est l'adresse hexa de la stucture proc.
printf("adrstproc =%p (%%p)\n\n", (void *) adrstproc); // ceci est un ptr vers la stucture proc.
//
pstproc = (struct proc *)adrstproc;
printf("pstproc =%p (%%p)\n\n", pstproc);
printf("pstproc->p_exec=%llx\n", pstproc->p_exec);
printf("pstproc->p_as=%llx\n", pstproc->p_as);
//
llseek(kmem, adrstproc, SEEK_SET); // ceci passe par /dev/kmem
read(kmem, &myproc, sizeof myproc); // Et avec un peu de chance tu te retrouves avec
// // la structure proc de ton process dans myproc.
// accès aux membres :
printf("myproc.p_exec =%llu (%%llu)\n", myproc.p_exec);
printf("myproc.p_exec =%p (%%p)\n", (void *) myproc.p_exec);
printf("myproc.p_as =%llu (%%llu)\n", myproc.p_as);
printf("myproc.p_as =%p (%%p)\n", (void *) myproc.p_as);
// et aussi ensuite :
// printf("myproc.p_lockp =%llu (%%llu)\n", myproc.p_lockp);
// le membre suivant ne m'intéresse pas non plus : kmutex_t p_crlock; /* lock for p_cred */
//
printf("myproc.p_cred =%llu (%%llu)\n", myproc.p_cred); // ce cinquième membre de "proc"
printf("myproc.p_cred =%p (%%p)\n\n", (void *) myproc.p_cred); // est un ptr vers "cred".
printf("pstproc =%p (%%p)\n\n", pstproc);
//
printf("pstproc->p_exec=%llx\n", pstproc->p_exec);
printf("pstproc->p_as=%llx\n", pstproc->p_as);
//
printf("\n");
}
//
// gcc cred.c -o cred
// gcc cred.c -o cred -O3 -mcpu=v9
// cc cred.c -o cred -O5 -xarch=v9
// ./cred `ps -o user,pid,addr,args -p $$ |grep st13277 | awk '{print $3}'` |
Partager