Всем привет !
Не хочется заниматься копипастом, но автор вроде не против размещения его статей, если указать ссылку на борд, поэтому рекомендую перейти по ссылкам и при необходимости можете связаться с автором, вот сразу ссылки на раздел, от куда я взял эти статьи:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
В общем тема может и не новая, но понравилось как всё понятно изложено, в этой-же теме можно обсуждать и выкладывать другие методики чистки:
Добро пожаловать в пилотный выпуск серии EasyHack! Сегодня мы напишем простую утилиту для чистки pe32 от сигнатур антивируса.
Как было сказано в
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
, мы будем писать на Python.Почему Python?
- Кроссплатформенность – один и тот же код будет работать везде, исключая некоторые модули
- Поставка исходного кода – легко проверить наличие бекдоров и внести изменения в чужой код
- Лёгкость чтения кода – существует даже специальный термин
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
- Легкость написания – существуют готовые модули почти подо все задачи
- Большое сообщество – много документации, любой вопрос уже освещён в гугле
Полагаю, что со временем, в силу риска склейки, pe32-утилиты канут в небытие, уступив место python‘у.
Установка Python:
Я использую версию 2.7, скачать её можно
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
.
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
Отмечаем “Add python to %PATH%”
Чистка Exe
В качестве первой жертвы был выбран широко известный SignDetect, помогающий находить сигнатуры в коде.
Принцип его работы прост до безобразия:
- берется исполняемый файл
- внутри него выбирается смещение и его размер
- выбираем размер криптографического окна (о нём далее)
- производится замена всех вариантов “окон”
- весь массив полученных файлов сканируется локальным антивирусом
- в тех файлах, которые остались не тронуты – “окно” повредило сигнатуру (или формат pe32 )
- если она была на данных, которые безболезнено можно удалить – вам повезло
- если нет – чистка проводится в исходниках или хотпатчем (рассмотрим в след части)
Представим что у нас есть файл с такими данными:
Код:
00 00 00 00 00 00
Диапазон – от начала до конца файла
Замена – на FF
Все варианты замены будут выглядеть так:
Код:
FF FF 00 00 00 00
00 00 FF FF 00 00
00 00 00 00 FF FF
SignFinder
Я долго думал как подать код чтобы он был понятен, но не переписывая
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
по python. В итоге было решено дать код утилиты с обильными комментариями.
Код:
#coding=utf8
'''
SignFinder - Скрипт для чистки PE32 от сигнатур антивирусов
'''
__author__ = 'Auth0r'
__site__ = 'vxlab.info'
__twitter__ = 'https://twitter.com/vxlab_info/'
__version__ = '04.05.2016'
import os
import sys
#вывод текста ошибки и выход
def DieWithError(err):
sys.exit('[!] '+err)
def PrintLogo():
print '\n[------------------------]'
print ' SignFinder by ' + __site__
print ' Version on ' + __version__
print '[------------------------]\n'
#установим текущей папку в которой лежит файл path
def set_home(path):
home = os.path.realpath(os.path.dirname(path))
os.chdir(home)
def ReadFile(path):
#проверим cуществование файла
if os.path.isfile(path):
#открываем в режиме Read и Binary
f = open(path, 'rb')
#читаем файл целиком
data = f.read()
f.close()
return data
else:
DieWithError('file '+path+' not found!')
def SaveFile(path,data):
f = open(path, 'wb')
f.write(data)
f.close()
#создаём папку с именем файла, в которую будем складывать получившиеся семплы
def CreatePe32Folder(path):
#получим имя файла из пути
name = os.path.basename(path)
#получим имя без расширения
tmp = name.split('.')
name = tmp[0]
#выберем имя папки
dir_name = name+'_SignFinder'
#проверим существование
if not os.path.isdir(dir_name):
#создаём папку
os.mkdir(dir_name)
#возвращаем её имя
return dir_name
#замена байт
def ReplaceByte(data, offset, window_size, window_byte):
r = window_byte * window_size
new_data = data[:offset] + r + data[offset+window_size:]
return new_data
def CleanOneFile(dir_name, file_data, offset, window_size, window_byte, i, file_num_tmp):
#заменим "окна"
new_data = ReplaceByte(file_data, offset, window_size, window_byte)
#имя файла - смещение окна и его размер
file_name = '{}-{}'.format(offset,window_size)
#сформируем путь до файла
file_path = '{}\\{}.clean'.format(dir_name,file_name)
#запишем файл
SaveFile(file_path, new_data)
#подсчитаем процент выполнения
i_tmp = i + 1
percent = round(float(i_tmp)/file_num_tmp*100, 2)
#выведем лог
print "[-] Created {} in {} - {}%".format(i_tmp, file_num_tmp, percent)
#создаём все варианты файла с заменой "окна"
def CleanAllFile(dir_name, file_data, window_size, window_byte='\x00'):
#размер файла
filesize = len(file_data)
#расчитаем сколько будет файлов
file_num = filesize / window_size
file_num_tmp = file_num
#расчитаем размер последнего неполного "окна"
last_window_size = filesize % window_size
#учтем наличие остатка
if last_window_size > 0:
file_num_tmp = file_num + 1
#цикл создания
for i in range(file_num):
#вычислим позицию "окна"
offset = i * window_size
CleanOneFile(dir_name, file_data, offset, window_size, window_byte, i, file_num_tmp)
#последнее "окно" неполного размера
if last_window_size > 0:
offset = file_num * window_size
i = i + 1
CleanOneFile(dir_name, file_data, offset, last_window_size, window_byte, i, file_num_tmp)
def main():
#выведем инфо об утилите
PrintLogo()
#получим данные из командной строки
if len(sys.argv)==3:
file_path = sys.argv[1]
window_size = int(sys.argv[2])
#установим текущей папкой - место расположения файла
set_home(file_path)
#создаем папку для выходных семплов
dir_name = CreatePe32Folder(file_path)
#читаем оригинальный файл
file_data = ReadFile(file_path)
#создаем семплы
CleanAllFile(dir_name, file_data, window_size)
else:
print "USAGE: SF.py path_to_exe window_size"
print "EXAMPLE: SF.py C:\\test\\1.exe 4"
#вызов основной функции
main()
Для запуска, откройте командную строку CMD и введите:
Код:
python C:\SignFinder\sf.py C:\test\1.exe 1000
Код:
SF.py path_to_exe window_size
Код:
offset - windows size .clean
Источник:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
Вторую версию статьи размещу ниже !