• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

JoaoRodrigues

Script para remoção de Disk Knight

12 mensagens neste tópico

Para quem não conhece este autêntico flagelo:

“Disk Knight” was created by a 19-year-old in Chittagong named Ariful Islam.

The program is meant to stop virus processes originating from USB flash disks, however, its virus like behaviour means that it is now spreading uncontrollably on computers around Bangladesh via users’ USB disks—a real nuisance for IT administrators.

Users with more computer knowledge will be able to remove DiskKnight from their computers and flash disks following my instructions, however, I have already submitted samples of the file to our virus protection vendor Sophos as I’d rather not have some program stopping every process on my computer, including the useful ones! While I appreciate Mr. Islam’s wish to help the community deal with viruses, it is my belief the best approach is to educate users to protect themselves.

E aqui fica o código. Nota que isto precisa de uns belos testes.. não tenho amostras do vírus aqui à mão :)

# Disk Knight Remover
# Joao Rodrigues @ 2008

# This script will attempt to:
# 1. Stop any Knight.exe processes running
# 2. If process found, remove such process and reg key
# 3. Remove any Knight.exe and Autorun.inf from c:\windows

# If user chooses to check the pen:
# 1. Remove any Knight.exe and Autorun.inf

import os
import sys

################# Functions ##############################

def check_os(drive_letter):

    # Check Operative System

    st_temp = os.name

    if st_temp != 'nt':
        print "Only Windows Users are affected.."
        sys.exit(0)

    # Check if Knight is running

    process_list = os.popen('TASKLIST').read()

    if 'Knight.exe' in process_list:
        print 'Computer infected. Attempting to remove..'
    else:
        print 'Clean!'
        sys.exit(0)

    # Kill the process

    try:
        os.system('TSKILL Knight /a')
        os.system('TASKKILL /F /IM Knight.exe')
    except Exception, e:
        print 'Error while killing process. %s' %e

    # Delete the Registry Entry

    registry_keys = [r'HKLM\Software\Microsoft\Windows\CurrentVersion\Run',\
                   r'HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\Disk Knight']

    delete_1 = 'REG DELETE %s /v "Disk Knight" /f' %registry_keys[0]
    delete_2 = 'REG DELETE %s /f' %registry_keys[1]

    os.system(delete_1)
    os.system(delete_2)

    # Deleting Files in Hard Drive
    original_path = drive_letter+'\\'+'windows'
    for root, ls_dirs, ls_files in os.walk(original_path):
        for h in ls_files:
            if h == 'Knight.exe' or h == 'AutoRun.inf':
                path = str(i)+'\\'+str(h)
                set_att = 'attrib -s -h %s' %path
                del_file = 'del /q /f %s' %path
                os.system(set_att)
                os.system(del_file)

def check_pen(drive_letter):

    original_path = drive_letter
    for root, ls_dirs, ls_files in os.walk(original_path):
        for h in ls_files:
            if h == 'Knight.exe' or h == 'AutoRun.inf':
                print 'Pen Infected. Cleaning..'
                path = str(i)+'\\'+str(h)
                set_att = 'attrib -s -h %s' %path
                del_file = 'del /q /f %s' %path
                os.system(set_att)
                os.system(del_file)

def is_drive(option):
    return not os.system(option) # 0 if no drive

############### MAIN #################

choice = int(raw_input('Choose an option:\n[1] Check Drive\n[2] Quit\n'))

if choice == 2:
    print 'Bye bye '
    sys.exit(0)
elif choice == 1:
    while 1:
        drive = raw_input("Leave blank to exit\nPlease type the drive's letter (e.g. C:): ")
        if drive == '':
            print 'Bye '
            sys.exit(0)
        if is_drive(drive):
            which = int(raw_input('\nType 1 to check a USB PEN and 2 for a Hard Drive.'))
            if which == 2:
                check_os(drive)
                sys.exit(0)
            else:
                check_pen(drive)
                sys.exit(0)
        else:
            print "Drive %s does not exist" %hd_drive

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma coisa, mete um r antes da ' que começa as chaves no registo, para evitar erros de escapares caracteres como o n :)

(E quem é amigo quem é? :))

Outra coisa, podias ter flags passadas ao invocar o script, para evitar interacção com o raw_input :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E pensar que o Disk Knight começou por tentar ser um protector de discos...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Segunda Versão, seguindo o conselho do DjThyrax (acho que está porreira, tal como disse, não posso testar..... nem windows tenho :) )

# Disk Knight Remover, appropriately called Disk Princess 
# Joao Rodrigues @ 2008
# Version 0.2

# This script will attempt to:
# 1. Stop any Knight.exe processes running
# 2. If process found, remove such process and reg key
# 3. Remove any Knight.exe and Autorun.inf from c:\windows

# If user chooses to check the pen:
# 1. Remove any Knight.exe and Autorun.inf

import os
import sys

################# Functions ##############################

class Disk_Princess:
    """Usage: disk_princess <pen> / <pc> <drive_letter>\nExample: "disk_princess pc c:" """
    
    def __init__(self, which, drive): 
        if which == 'pen':
            self.check_pen(drive)
        elif which == 'pc':
            self.check_os(drive)


    def check_os(self, drive_letter):

        # Check Operative System

        st_temp = os.name

        if st_temp != 'nt':
            print "Only Windows Users are affected.."
            sys.exit(0)

        # Check if Knight is running

        process_list = os.popen('TASKLIST').read()

        if 'Knight.exe' in process_list:
            print 'Computer infected. Attempting to remove..'
        else:
            print 'Clean!'
            sys.exit(0)

        # Kill the process

        try:
            os.system('TSKILL Knight /a')
            os.system('TASKKILL /F /IM Knight.exe')
        except Exception, e:
            print 'Error while killing process. %s' %e

        # Delete the Registry Entry

        registry_keys = [r'HKLM\Software\Microsoft\Windows\CurrentVersion\Run',\
                        r'HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall\Disk Knight']

        delete_1 = 'REG DELETE %s /v "Disk Knight" /f' %registry_keys[0]
        delete_2 = 'REG DELETE %s /f' %registry_keys[1]

        os.system(delete_1)
        os.system(delete_2)

        # Deleting Files in Hard Drive
        origin_path = drive_letter+'\\'+'windows'
        for root, ls_dirs, ls_files in os.walk(original_path):
            for h in ls_files:
                if h == 'Knight.exe' or h == 'AutoRun.inf':
                    path = str(i)+'\\'+str(h)
                    set_att = 'attrib -s -h %s' %path
                    del_file = 'del /q /f %s' %path
                    os.system(set_att)
                    os.system(del_file)

    def check_pen(self, drive_letter):

        origin_path = drive_letter
        for root, ls_dirs, ls_files in os.walk(original_path):
            for h in ls_files:
                if h == 'Knight.exe' or h == 'AutoRun.inf':
                    print 'Pen Infected. Cleaning..'
                    path = str(i)+'\\'+str(h)
                    set_att = 'attrib -s -h %s' %path
                    del_file = 'del /q /f %s' %path
                    os.system(set_att)
                    os.system(del_file)

def is_drive(option):
    return not os.system(option) # 0 if no drive

############### MAIN #################

if len(sys.argv)<3 or sys.argv[1] not in ['pen', 'pc']:
    print Disk_Princess.__doc__
    sys.exit(0)

if is_drive(sys.argv[2]):
    Disk_Princess(sys.argv[1], sys.argv[2])
else:
    print 'Drive Letter not recognized. Please try again'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá, precisava de umas cenas que tens no código! Vai-me ser mais útil mais por causa do código do que pela utilidade do código em si. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pá, não podes. Está registado. Tens que me pagar patente :)

Rouba :) E olha, se quiseres pagar-me, faz-me um GUI para isto :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pá, não podes. Está registado. Tens que me pagar patente :)

Rouba :) E olha, se quiseres pagar-me, faz-me um GUI para isto :)

Dou $0.01 por isso.

Sai já uma GUI quentinha! (Deixa-me ir só tomar um duche e já t'a faço)

(Devo ser o único a postar higiene num fórum de programação :) )

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é por nada, mas isto dá erro.

Traceback (most recent call last):

  File "C:\script.py", line 100, in <module>

    print Disk_Princess.__doc__

NameError: name 'Disk_Princess' is not defined

Já tive a pensar e não sei porque é que dá este erro. A classe está lá... Ainda pensei que fosse por não estar lá nenhuma __doc__, mas o erro refere-se ao 'Disk_Princess'... :hmm:

Outra cena, meti um "print process_list" e não printa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ui :)

class Disk_Drincess:

Se calhar começa por aqui :)

Eu não testei este código em windows. Só agora é que estou numa máquina com isso, portanto, vou testar agora.

EDIT: Já encontrei umas quantas gralhas... letras trocadas, espaços a mais, etc. Já posto a correcção

EDIT2: Primeiro script já está a trabalhar. Pelo menos nesta máquina não detectou nada e correu todas as classes, funções, etc. Pena não ter o vírus aqui à mão :)

EDIT3: O __doc__ não funcionava porque pu-lo fora do sítio. Estava na __init__ e devia estar, obviamente, debaixo da própria classe. Enfim, é o desconto por nunca ter programado com classes antes..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se calhar começa por aqui :)

Epá, juro que olhei e vi um 'P'...

EDIT: Já encontrei umas quantas gralhas... letras trocadas, espaços a mais, etc. Já posto a correcção

Ya, na escolha sem ser por flags, a escolha ficava junta das opções e cenas assim...

EDIT2: Primeiro script já está a trabalhar. Pelo menos nesta máquina não detectou nada e correu todas as classes, funções, etc. Pena não ter o vírus aqui à mão :)

Podes simular... compilas aí um ficheiro C com esse nome (o prog só tem um printf("TESTE\n"); e um getchar(); ) e vês se funca...

EDIT3: O __doc__ não funcionava porque pu-lo fora do sítio. Estava na __init__ e devia estar, obviamente, debaixo da própria classe. Enfim, é o desconto por nunca ter programado com classes antes..

Pois, isso já eu tinha notado... a cena do "Disk_Drincess" é que me estava a lixar... :wallbash:

Outra cena, o "os.popen('TASKLIST').read()" retorna uma empty string... (Pus um print process_list e retornou None, fui ao IDLE e deu empty string)

EDIT: Parece que isto do tasklist só não funciona no meu PC. Será por tar a usar Home?!? Acho que não... :hmm: )

EDIT2: Parece que para o tasklist funcionar nos Win XP Home têm de fazer o download de um tasklist.exe

EDIT3: Que se pode sacar aqui.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já estão ambos os scripts a funcionar. E o meu process_list funciona.

Btw, eu já simulei isto com um ficheiro nas localizações devidas e ele apagou. O meu ultimo teste é mesmo o do registo e do kill ao processo :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma sugestão: torna isso cross-platform (a parte da pen) usando / em vez do \ como dir separator (o Windows suporta ambos).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora