Если вы начали читать данную статью, то наверное вы знаете что из себя представляет вирус Win32.Jakky. Если кто не знает, то я расскажу вам про него. Однако стоит предупредить, что я не являюсь крутым вирусологом (да и вирусологом вообще), так что всяких там забулдыжных терминов не будет (или будет, но очень мало и не в тему ;-) )…
БАБКА! КУРА, МЛЕКО, ЯЙКО! Так когда то говорили фашисты нашим бабусям, когда приходили в деревни за провизией. Забирали всё. Так вот примерно так же ведёт себя и Jakky. Запускаешь ты заражённый этой ересью файлик, Jakky копирует себя из программы в директорию временных файлов под именем svchost.exe и запускается. Ну а дальше, пытается заразить собой побольше файлов, пока никто не прохавал, что она делает свои грязные дела. Например у меня она писалась в директорию D:\Temp\svchost.exe. Файлы заражает она быстро. Это и понятно, ведь этим делом занимается не один поток. Если понаблюдать за ней из утилиты Руссиновича, ProcessExplorer, то нам хорошо видно, как она лихорадочно перебирает папки.
Итак, с этим вроде бы понятно. Предлагаю вам остановить выполнение потоков, чтобы зараза не распространилась ещё больше. Правая кнопка мыши на процессе -> Suspend. Эпидемию приостановили, теперь углубимся в изучение кишков Jakky.
КАК РАЗПОЗНАТЬ JAKKY Первое время, я даже и не знал, что у меня на машине орудует этот зверь. Узнал я об этом совершенно случайно, когда откомпилированная программа на ассемблере вдруг очень сильно прибавила в весе, аж на целых 93 килобайта с тем учётом, что нормальный, не заражённый файл весил всего 2.5 килобайта. Ясный Гольдбах - в системе вирус… Я открыл заражённый файл в Hackers View и какие то нотки неуверенности закрались в железное сердце…
Врёшь! Я то помню, что у меня в проге было всего 4 секции, а ты мне пишешь 6… А точка входа у меня приходилась на секцию .text, то есть на 1000 (401000) а не на 5000 (405000)… Что, кто то пихнул ещё пару секций и установил точку входа на предпоследнюю? Хмм… проверим… Тыкаем F6 и видим, что наша догадка верна… Заражённый файл имеет две откровенно левый секции. Вот они: NLDR , NEXE
Пятая и шестая секции точно ошиблись адресом, да ещё и NLDR секция точку входа захапала на себя, уу фашистка! А для чего тогда секция NEXE? Подождите немного, и вы это узнаете! Дизасмим секцию, чтобы посмотреть как вообще там дело происходит... Попутно делаем предположение о том, что в этой секции и есть код распаковки самого вируса во временную директорию, его запуска и передачи управления на OEP, то есть на секцию .text…
Так и есть, при трассировке в Olly чётко видно, что код, который содержится в секции NLDR выполняет следующие действия: • Получает дескриптор библиотеки kernel32.dll • Из неё получает адрес функции GetProcAddress (перебирая при этом все, которые идут до неё, что принципе понятно… ) • Получает указатель на секцию NEXE (вон оно чё, Михалыч!!!) • Получает адрес GetTempPathA • Получает адрес CreateFileA • Получает адрес WriteFile (О-о! Начинает проясняться ещё больше) • Таким же Петцольдом получает адрес CloseHandle • Получает WinExec (ну было бы странно, если бы подобная функция тут не фигурировала, да? ) • Вызывает GetTempPath, получая путь к нашей временной директории • Собирает по кусочкам имя будущего файла: svchost.exe и сохраняет его в памяти • Пытается создать файл svchost.exe во временной папке, вызвав CreateFile. Если файл по какой то неведомой причине создать не удаётся, отдаёт управление на секцию .text. (интересно, почему автор вируса не сделал данную проверку выше по коду, чтобы если что, сразу прыгать на выход, а так это потеря времени имхо? Я бы например так и сделал) • Записывает в файл данные, из секции NEXE (вот оказывается для чего эта секция! В ней просто исполняемый код! Но мы то с самого начала догадались об этом, потому, что размер svchost.exe в байтах, как раз таки равен длине секции NEXE) • Закрывает открытый хендл файла • Запускает новоиспечённый файл на выполнение
Значит так. Чтобы нам “вылечить” файл, нужно: • Изменить точку входа на адрес начала секции кода .text. • Удалить 2 последние секции (NEXE & NLDR), предварительно запомнив их суммарную длину (у меня 17400h) • Пересчитать SizeOfImage ( у меня 5000h) Формула подсчёта SizeOfImage = (VirtualSize последней секции + VirtualOffset последней секции). Результат округлить до значения SectionAlignment. • Обрезать файл с конца, ровно на суммарную длину секций
Для простоты, выполним данный алгоритм вручную, если прокатит (а прокатить просто обязано), то можно будет задуматься о программировании утилитки, которая почистит все наши файлы (некая антивирусная программа… С символическим именем Fuckky ) Если смотреть по скринам хиева, которые я приводил, видно, что OEP просто обязан быть 1000. То есть OEP = RVA(.text). Действуем по этой формуле. Сохранили файл. Теперь отрежем лишнее сальцо в лице двух вируснявых секций. В хиеве, наводим на секцию и тыкаем своими тыкалами на F8. Удаляем таким образом обе секции. После этого опять переходим в режим редактирования заголовка, находим там поле SizeOfImage и жмакаем F3. Хиев всё сам подсчитает и выставит новое значение. Осталось одно – сократить файл до первозданного размера. Для этого, как вы уже догадались, мы будем использовать всё тот же Хиев ( имхо, самый крутой и удобный хексер ин зе ворлд ). Вычисляем, с какого места нам нужно отрезать кусок. Для этого делаем: Ctrl+End, тем самым окажемся в самом конце файла. Запоминаем адрес на котором стоим, открываем калькулятор и делаем следующее вычисление: Адрес с которого отрезать = (Адрес последнего байта – Суммарная длина двух последних секций) + 1. У меня получилось так: A00 = (17DFF – 17400)+1. Теперь жмём F5 (Goto) и вводим А00. Далее клацаем F3 (Edit), и затем F10 (Truncate). Соглашаемся с окошком и всё. Проверяем работоспособность нового файла, и если он запускается, то всё сделано верно. Если пишет, что файл не является приложением Win32, то скорее всего отхренячили лишний байтик, придётся дописать его вручную (обычно это просто нуль-байт).