|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
[c]funzione penosa da sistemare
salve gente!
ho scritto una bella funzioncina come parte di un progetto che non fa altro che prendere il contenuto di file simili a quello sotto e restituire uno alla volta i percorsi delle librerie condivise (quelle che sulla seconda colonna hanno una x) Codice:
08048000-0804f000 r-xp 00000000 03:41 179545 /usr/sbin/cron 0804f000-08050000 rw-p 00007000 03:41 179545 /usr/sbin/cron 08050000-08071000 rw-p 08050000 00:00 0 [heap] 49b26000-49b36000 r-xp 00000000 03:41 167470 /lib/libselinux.so.1 49b36000-49b37000 rw-p 00010000 03:41 167470 /lib/libselinux.so.1 4a19c000-4a1ae000 r-xp 00000000 03:41 179414 /lib/tls/libnsl-2.3.5.so 4a1ae000-4a1b0000 rw-p 00011000 03:41 179414 /lib/tls/libnsl-2.3.5.so 4a1b0000-4a1b2000 rw-p 4a1b0000 00:00 0 4e617000-4e62c000 r-xp 00000000 03:41 20093 /lib/ld-2.3.5.so 4e62c000-4e62e000 rw-p 00014000 03:41 20093 /lib/ld-2.3.5.so 4e742000-4e873000 r-xp 00000000 03:41 166233 /lib/tls/libc-2.3.5.so 4e873000-4e874000 r--p 00130000 03:41 166233 /lib/tls/libc-2.3.5.so 4e874000-4e877000 rw-p 00131000 03:41 166233 /lib/tls/libc-2.3.5.so 4e877000-4e87a000 rw-p 4e877000 00:00 0 4e904000-4e906000 r-xp 00000000 03:41 173226 /lib/tls/libdl-2.3.5.so 4e906000-4e908000 rw-p 00001000 03:41 173226 /lib/tls/libdl-2.3.5.so b7ea9000-b7eb3000 r-xp 00000000 03:41 51412 /lib/tls/libnss_files-2.3.5.so b7eb3000-b7eb5000 rw-p 00009000 03:41 51412 /lib/tls/libnss_files-2.3.5.so b7eb5000-b7ebc000 r-xp 00000000 03:41 51410 /lib/tls/libnss_compat-2.3.5.so b7ebc000-b7ebe000 rw-p 00006000 03:41 51410 /lib/tls/libnss_compat-2.3.5.so b7ef5000-b7f16000 rw-p b7ef5000 00:00 0 b7f16000-b7f1d000 r-xp 00000000 03:41 2354 /lib/libpam.so.0.79 b7f1d000-b7f1e000 rw-p 00007000 03:41 2354 /lib/libpam.so.0.79 b7f29000-b7f32000 r-xp 00000000 03:41 51414 /lib/tls/libnss_nis-2.3.5.so b7f32000-b7f34000 rw-p 00008000 03:41 51414 /lib/tls/libnss_nis-2.3.5.so b7f34000-b7f36000 rw-p b7f34000 00:00 0 bfe21000-bfe36000 rw-p bfe21000 00:00 0 [stack] ffffe000-fffff000 ---p 00000000 00:00 0 [vdso] ve la propongo: Codice:
char * getNextLibrariePath(FILE **file){
static char buffer[MAX_LINE];
char *temp = NULL;
size_t n;
FILE *proc = *file;
while(1){
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if(strstr(buffer,"x") == NULL){
getline(&temp,&n,proc);
continue;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
if((fscanf(proc,"%s",buffer)) != 1){
break;
}
return buffer;
}
return NULL;
}
non so quanto sia il limite di lunghezza, e questo mi creerebbe un problema di sicurezza in un demone che deve funzionare da firewall. idee su come risolvere che non comportino il passaggio al c++ (ho già pensato al port che mi darebbe molti vantaggi anche in altri punti, ma sarebbe tanto lavoro che ritarderebbe ancora l'uscita di una prima versioen anche solo semi funzionante). ciao! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Un buon esempio vale più di mille parole...
Compila e prova questo programma; per ogni dubbio, chiedi a man fscanf Codice:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *f = fopen("/proc/self/maps", "rb");
char *buf;
long long unsigned ino;
char type[5];
while (fscanf(f, "%*s%4s%*s%*s%lld", type, &ino)==2) {
if (ino && fscanf(f, "%as", &buf)==1) {
if (type[2]=='x' && ino)
printf("Happy hacking on file %s\n", buf);
free(buf);
}
}
fclose(f);
return 0;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 13-10-2005 alle 17:53. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
oops meglio questo (perché?
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
FILE *f = fopen("/proc/self/maps", "rb");
char buf[4096];
long long unsigned ino;
char type[5];
while (fscanf(f, "%*p-%*p%04s%*s%*s%lld", type, &ino)==2) {
if (ino && fgets(buf, 4096, f)) {
char *p = strchr(buf, '\n');
if (!p) {
printf("mmm strange file name...\n");
exit(-1);
} else {
if (type[2]=='x' && ino) {
*p = '\0';
p = strchr(buf, '/');
printf("Happy hacking on file %s\n", p);
}
}
}
}
fclose(f);
return 0;
}
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 13-10-2005 alle 18:26. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:03.



















