Pokaż wyniki 1 do 3 z 3

Temat: [Linux][nasm] data modyfikacji pliku

  1. #1

    Domyślnie [Linux][nasm] data modyfikacji pliku

    Witam,
    potrzebuje pobrać datę modyfikacji jakiegoś pliku.
    Znalazłem funkcje nr 108, która pobiera jakieś dane o pliku, w tym również czas, który mnie interesuje. Problem w tym, że te dane zwracane są jako struktura, w której są pola z czasem, który również jest strukturą. W jaki sposób można obsłużyć taką strukturę? Czy są to pokolei bajty w pamięci, czy trzeba jakaś specjalnie to robic?

    Kod:
    mov eax, 108	; pobranie statusu pliku
    mov ebx, [fileDescriptor]
    mov ecx, fStat	; struktura 'stat'
    int 80h
    w ecx ma być adres do owej struktury, tylko jak tę strutkure zaimplementowac?
    A może ktoś zna lepszą funkcję, która zwróci tylko czas modyfikacji pliku?

    dodatkowe info o funkcji 108: http://rudy.mif.pg.gda.pl/~bogdro/linux/przer80h_3.html

  2. #2

    Domyślnie

    Witam.
    Może nie rozwiążę do końca Twojego problem, jednak postaram się pomóc. Po pierwsze strukturę, którą pobieramy traktujemy jako kolejne bajty w pamięci. W odnośniku do strony, którą podałeś jest opisana ta struktura, jednak w moim przypadku jest ona nieco odmienna. Oto ona:

    Kod:
    struct stat {
    	unsigned long  st_dev;
    	unsigned long  st_ino;
    	unsigned short st_mode;
    	unsigned short st_nlink;
    	unsigned short st_uid;
    	unsigned short st_gid;
    	unsigned long  st_rdev;
    	unsigned long  st_size;
    	unsigned long  st_blksize;
    	unsigned long  st_blocks;
    	unsigned long  st_atime;
    	unsigned long  st_atime_nsec;
    	unsigned long  st_mtime;
    	unsigned long  st_mtime_nsec;
    	unsigned long  st_ctime;
    	unsigned long  st_ctime_nsec;
    	unsigned long  __unused4;
    	unsigned long  __unused5;
    };
    Jak widać zawiera ona kilka dodatkowych pól. Cała struktura zajmuje 64 bajty więc tyle powinniśmy zarezerwować pamięci dla niej. Sam czas modyfikacji pliku zajmuje 4 bajty i znajduje się (według moich obliczeń) 40 bajtów od początku. Dodatkowo zarezerwujemy 4 bajty dla samego czasu modyfikacji (mtime). Załóżmy, że mamy taki kod:

    Kod:
    mov eax, 108	; pobranie statusu pliku
    mov ebx, [fileDescriptor]
    mov ecx, fStat	; struktura 'stat'
    int 80h
    
    mov eax, [fStat + 40]	; kopiuj czas modyfikacji
    mov dword [mtime], eax	; i zapisz w zmiennej
    breaking_point:
    .
    .
    section .data
    fStat times 64 db 0
    mtime dd 0
    .
    .
    Teraz używając debuggera można sprawdzić czy dobrze pobraliśmy czas modyfikacji. Oto listing z sesji debuggera:

    Kod:
    (gdb) break breaking_point
    Breakpoint 1 at 0x80480b7
    (gdb) r
    Starting program
    (no debugging symbols found)
    
    Breakpoint 1, 0x080480b7 in breaking_point ()
    (gdb) p &fStat
    $1 = (<data variable, no debug info> *) 0x80490c0
    (gdb) x/64b 0x80490c0
    0x80490c0 <fStat>:       0x05    0x03    0x00    0x00    0xad    0x7b    0x06    0x00
    0x80490c8 <fStat+8>:     0xa4    0x81    0x01    0x00    0xe8    0x03    0x64    0x00
    0x80490d0 <fStat+16>:    0x00    0x00    0x00    0x00    0x0b    0x00    0x00    0x00
    0x80490d8 <fStat+24>:    0x00    0x10    0x00    0x00    0x08    0x00    0x00    0x00
    0x80490e0 <fStat+32>:    0x75    0x27    0xed    0x47    0x00    0x00    0x00    0x00
    0x80490e8 <fStat+40>:    0x9b    0x21    0xed    0x47    0x00    0x00    0x00    0x00
    0x80490f0 <fStat+48>:    0x9b    0x21    0xed    0x47    0x00    0x00    0x00    0x00
    0x80490f8 <fStat+56>:    0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
    Otrzymany wynik (0x47ed219b) można przekształcić w bardziej czytelny sposób używając C (funkcja ctime) lub Perla

    Kod:
    $ perl -le 'print scalar localtime 0x47ed219b'
    Fri Mar 28 16:49:31 2008
    Następnie ten wynik sprawdzamy czy rzeczywiście odpowiada czasu modyfikacji danego pliku np. przez polecenie 'ls -l'

    Jeżeli wszystko będzie w porządku, można dalej przekształcać ten czas (korzystając już z samego czasu w zmiennej mtime) do odpowiedniej postaci. Niestety tutaj trzeba będzie napisać jakieś własne makro lub poszukać gotowego rozwiązania.

  3. #3

    Domyślnie

    Dzięki wielkie, właśnie o to mi chodziło

Podobne wątki

  1. GNU/Linux to OS, Linux - kernel
    By m33 in forum Linux
    Odpowiedzi: 3
    Autor: 12-04-2007, 17:15
  2. any data easy wireless net
    By maxhack in forum Linux
    Odpowiedzi: 2
    Autor: 11-25-2007, 11:28
  3. Data Execution Prevention
    By ble34 in forum Newbie - dla początkujących!
    Odpowiedzi: 8
    Autor: 06-06-2007, 15:19
  4. Podmienianie pliku
    By LineageAbyss in forum Off Topic
    Odpowiedzi: 2
    Autor: 05-08-2007, 19:10
  5. Data retention
    By TQM in forum Inne metody
    Odpowiedzi: 0
    Autor: 03-12-2007, 11:45

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj