SystemCalls tests



  • Hallo,

    Auf meinem Testsystem, würde ich gerne den Systemcall der Verzeichnisse auflistet:
    getdents64 so umschreiben, dass er sämtliche verzeichnisse die den namen "root" oder "admin" enthalten nicht anzeigt. Das Syscall umleiten ist kein Problem.

    asmlinkage long hacked_getdents64(unsigned int fd, struct linux_dirent64 __user *dirent, unsigned int count)
    {
    	printk("test: " "%s", dirent->d_name);
    
    	return orig_getdents64(fd, dirent, count);
    }
    

    Habs damit versucht, aber was dann in der dmesg steht ist eigentlich nur "Müll" (?)

    dmesg

    [ 1064.554783] test: test: Module.markerstest: test: shellstest: hosts

    Entspricht nicht meinem Verzeichnisinhalt...

    Kann mir wer weiterhelfen?

    Danke



  • keiner?



  • ich bastel schon seit gestern an ner version also das struct wird erst in

    sys_getdents64(fd, dirent, count);
    

    initialisiert, also kannst den namen auch erst danach lesen, dann mußt aber noch das in ner for schleife durchlaufen sonst bekommst du nur den ersten eintrag...

    das verzeichnis plotten geht bei mir schon aber die datei da raus schneiden ist bischen tricky das fehlt noch wenn ich das hab post ichs mal evtl. so in 1-2 std. 😞

    lg lolo



  • also das war mal ne action 🙄 aber ich hoffe es macht jetzt was es soll, auch wenn ich den sinn noch nicht ganz verstanden hab, man kann über die console wenn man den namen weiß immer noch auf die ordner zugreifen, denke nicht das es das ist was du wolltest aber naja, ich bin froh das meine ersten experimente mehr oder weniger geklappt haben...
    also die version an der ich rum gepfuscht hab ist 2.6.32.3 und ich habs direct in die "getdents64" function ein gebaut das andere war mir zu umständlich ach ja und ein #define hab ich auch noch mit rein, der rest ist eigentlich fast identisch, aber wenn du das bei dir einbauen willst was ich ja nicht machen würd, kannst es eh vergleichen, genug geschwafelt, ich posts einfach mal 😉

    axo ich bin ja der meinung das man statt dem memmove() locker auch ein memcpy() nehmen kann da eh nur zurück kopiert wird

    und der ein oder andere bug versteckt sich da sicher auch noch, wies immer ist :p

    linux-2.6.32.3/fs/readdir.c

    //new helper macro :(
    #define DIRENT64_PTR_ADD(d,b) \
    	((struct linux_dirent64 __user *)(((void __user *)d) + b))
    
    SYSCALL_DEFINE3(getdents64, unsigned int, fd,
    		struct linux_dirent64 __user *, dirent, unsigned int, count)
    {
    	struct file * file;
    	struct linux_dirent64 __user * lastdirent;
    	//hatte *d vorhin ohne __user wenn das probleme macht
    	//versuchs mal ohne?
    	struct linux_dirent64 __user *d;//new
    	struct getdents_callback64 buf;
    	int bpos;//new
    	int offset;//new
    	int error;
    
    	error = -EFAULT;
    	if (!access_ok(VERIFY_WRITE, dirent, count))
    		goto out;
    
    	error = -EBADF;
    	file = fget(fd);
    	if (!file)
    		goto out;
    
    	buf.current_dir = dirent;
    	buf.previous = NULL;
    	buf.count = count;
    	buf.error = 0;
    
    	error = vfs_readdir(file, filldir64, &buf);
    	if (error >= 0)
    		error = buf.error;
    	/////////////////////
    	//v-new
    	count -= buf.count;
    
    	if (count > 0
    	&&  buf.previous) {
    
    		d = dirent;
    		offset = 0;
    		bpos = 0;
    
    		while (bpos < count) {
    
    			d = DIRENT64_PTR_ADD(dirent,bpos);
    
    			if (offset > 0) {
    				if (DIRENT64_PTR_ADD(d,offset) == buf.previous)
    					buf.previous = d;
    				memmove( d
    					,DIRENT64_PTR_ADD(d,offset)
    					,DIRENT64_PTR_ADD(d,offset)->d_reclen
    				);
    			}
    
    			if (d->d_type == DT_DIR
    			&& (strstr(d->d_name,"NOOBLOLO") != 0
    			||  strstr(d->d_name,"LOLONOOB") != 0)) {
    				printk( KERN_DEBUG
    					"LOLO_HIDE_FILE :: getdents64 :: %s"
    					,d->d_name
    				);
    				buf.count += d->d_reclen;
    				offset += d->d_reclen;
    				count -= d->d_reclen;
    				continue;
    			}
    
    			bpos += d->d_reclen;
    		}
    
    		//zero out the overhead
    		if (offset > 0) {
    			memset(
    				DIRENT64_PTR_ADD(
    					 buf.previous
    					,buf.previous->d_reclen
    				)
    			,0,offset);
    		}
    	}
    	//^-new
    	/////////////////////
    	lastdirent = buf.previous;
    	if (lastdirent) {
    		typeof(lastdirent->d_off) d_off = file->f_pos;
    		if (__put_user(d_off, &lastdirent->d_off))
    			error = -EFAULT;
    		else
    			error = count;
    	}
    	fput(file);
    out:
    	return error;
    }
    

    lg lolo


Anmelden zum Antworten