Bilgisayara Takılan USB ve USB Verilerini Loglama

Merhaba. Bir süredir üzerinde çalıştığım projeyi hem toplulukla beraber daha iyi hale getirebilmek için hem de başkalarına kod örneği açısından yardımcı olabilmek için bir kaç bug ile beraber paylaşmak istiyorum.

Bu kodlar ne yapıyor?

  • Bilgisaya takılan USB’ye bilgisayardan bir dosya atılınca atılan dosyanın adını logluyor. (log.txt)
  • Dosyanın USB’ye atılma tarihini logluyor.
  • Dosyanın kullanıcı tarafından silinme riskine karşın bir kopyasını tekrar diskte oluşturuyor. (C:\Users\{Kullanıcı Adı}\AppData\Local\USB)

Bilinen Bug’lar

  • USB ilk takıldığında içindeki tüm veri sanki bilgisayardan kopyalanmış gibi loglama işlemine tabi tutuluyor.
  • Blgisayardan USB’ye kopyalama işlemi bitmeden loglama yapılırsa ‘Permission Denied’ hatası veriyor. (time.sleep(5))
  • Birden fazla USB takıldığında sadece son takılan için bu işlemler uygulanıyor.
import os
import time
import socket
import shutil
import win32api
import win32file
from sys import exit
from getpass import getuser
from datetime import datetime

drivesList = []
b = ''
files = []

user = getuser()

USBLoc = 'C:\\Users\\{0}\\AppData\\Local\\USB'.format(user)

try:
    os.mkdir(USBLoc)
except OSError:
    print('Dizin zaten mevcut %s' % USBLoc)
    print('Devam ediliyor...\n')
else:
    print ("Dizin başarıyla oluşturuldu: %s" % USBLoc)

def listDir(disk):   
    for r, d, f in os.walk(disk):
        [files1.append(os.path.join(r, file)) for file in f]

    with open('./cache2.tmp', 'w') as cache:
        for i in files1:
            cache.write(i + '\n')

def readCache(loc):
    for r, d, f in os.walk(loc):
        [files2.append(os.path.join(r, file)) for file in f]
        
    with open('./cache.tmp', 'w') as cache:
        for i in files2:
            cache.write(i + '\n')

    with open('./cache.tmp', 'r') as reader:
        for line in reader.readlines():
            readedFile1.append(line)

    with open('./cache2.tmp', 'r') as reader:
        for line in reader.readlines():
            readedFile2.append(line)
    
def Diff(li1, li2):
    return list(set(li1) - set(li2))

def checkDrives():
    drives = win32api.GetLogicalDriveStrings()
    drives = drives.split('\000')[:-1]

    return [i for i in drives if win32file.GetDriveType(i) == win32file.DRIVE_REMOVABLE]
    
while True:
    try:
        a = ', '.join(checkDrives())
                
        if not ':' in a:
            pass
        else:
            files1 = []
            files2 = []
            readedFile1 = []
            readedFile2 = []

            listDir('E:\\')
            time.sleep(5)
            readCache('E:\\')

            getDiff = Diff(readedFile1, readedFile2)
            
            b = a

        if b != a or len(getDiff) > 0:
            now = datetime.now()
            current_time = now.strftime("%H:%M")
            listDir(a)
            with open('log.txt', 'a+') as log:
                log.write(socket.gethostname() + '-' + current_time + '-' + a)
                log.write('--' + str(getDiff) + '\n\n')
                for i in getDiff:
                    a = i[::-1]
                    b = a[1:]
                    c = b[::-1]
                    shutil.copy(c, USBLoc)
                    
                    print(c)
            
    except KeyboardInterrupt:
        exit()

Eklenecek Özellikler

  • USB’ye atılan dosyalar her türlü kötü amaçlı kişiye karşın diskte farklı bir dizine daha kendini kaydediyor. Bu kaydedilen dosyalar bir süre sonra büyük boyutlara ulaşabilir. Bu yüzden kaydedilen dosyaların belli bir süre sonra otomatik silinmesi eklenecek.
  • Sadece istenilen formattaki dosyaların loglarının tutulması eklenecek. (Ör: sadece .txt dosyaları kopyalanırsa kodlar işlensin)

Log dosyasının kopyasını mı saklıyor diskte?

Hayır, USB’ye atılan dosyaları saklıyor direkt. Mantığı şu: mesela bilgisayarınızda önemli bir excel dosyası var diyelim. Başka birinin bunu görmemesi gerekiyor. Ancak birileri sizden habersiz bir şekilde dosyayı USB takarak kopyalıyor. log.txt dosyası dosyanın sadece adını tutuyor. Ben bu önemli dosyanın adını b dosyası yaparak atarsam log.txt’de ‘b dosyası’ olarak görünüyor. Ancak benim yazdığım kodda hem log olarak dosya adını tutuyor hem de kopyalanmış dosyanın bir kopyasını diskte başka bir yere kaydediyor. Yani b dosyasının içini açıp bakabiliyorum hangi dosya olduğuna bu sayede.

Diskte çok yer kaplamaması için kopyalanan dosyalar haftada 1 silinebilir. En son böyle bir şey düşündüm ama henüz kodlarını yazmadım.

Güzelmiş, herhangi bir geliştirme süreci devam etti mi? Güncel halini paylaşma imkanınız var mı?

Ubuntu /media/username dizini için yapabilirmisiniz ?

Kullanılması gereken sistem çağrıları farklı, dizin adı değiştirmek yetmez.

1 Beğeni

üstünden biraz zaman geçmiş ama yine de buna ihtiyacım var benim takılan usblerin adını listleleyen bir şeye ihtiyacım var örnek verecek olursam
D:
E:
gibi hangilrinin takılı olduğunu görmem gerekiyor böyle bir şey mümkün müdür?