reverse engineering
На днях по аське от моего друга мне пришло сообщение следующего содержания:
[xxxxxxxx](23:10:07 7/09/2009)
Ссылка для скачивания файла Frogs.rar
http://file.qip.ru/file/100122839/beef55
[-- Файл отправлен через file.qip.ru. Подробнее на сайте: http://file.qip.ru --]
[xxxxxxxx] (23:10:07 7/09/2009)
:)
На что я сразу обратил внимание, так это на то, что первое и второе сообщения отправлены в одну и ту же секунду, что довольно непросто осуществить, вводя сообщения собственноручно, а не с помощью каких-нибудь дополнительных средств. Мои подозрения укрепил тот факт, что собеседник не ответил на последовавший от меня контрольный вопрос на постороннюю тему.
Дальше все стало ясно. Злоумышленник разослал ссылку некоторым айсикьюшным юзерам, те скачали предложенный файл и запустили его. Файл оказался вирусом. Он воровал аськи жертв, менял пароли на эти аськи, и рассылал такие же сообщения всему контакт-листу.
Мне стало интересно, можно ли определить, какой новый пароль приписывал вирус сворованной аське. Тогда можно было бы помочь другу вернуть его аккаунт.
Раздобыв архив с программой-вирусом, я во всеоружии принялся изучать творение безумного гения.
Заведя для этих целей новый UIN, я начал экспериментировать.
Программа оказалась флэш-игрушкой со встроенным зловредным кодом. Для начала я запустил самую могучую штуку, которая помогает реверсерам. Имя ей дизассемблер IDA Pro. Произведя поиск срок, содержащихся в экзешнике, и не найдя ничего подозрительного, похожего на пароль, я подумал, что наверняка программа работает с сокетами windows и посылает запросы на асечный сервер login.icq.com (иначе как же она спамит контакт-лист и вообще ворует вашу аську). В теле обнаружилось четыре вызова функции wsock32.send, которая посылает запросы.
Теперь, запустив подопытную в отладчике OllyDbg, я поставил точки останова на все вызовы функции send. В процессе отладки оказалось, что нужным вызовом является один из них, а именно:
00470666 E8 7957FFFF CALL <JMP.&wsock32.send>
При каждой остановке на этой строчке в стеке можно было наблюдать четыре параметра:
02C5FEF4 000002F8 Socket = 2F8
02C5FEF8 02C5FF1D Data = 02C5FF1D
02C5FEFC 0000000A DataSize = A (10.)
02C5FF00 00000000 Flags = 0
Существенными в данном случае являются второй и третий - адрес в памяти, откуда начинается содержимое запроса, посылаемого на сервер, и размер этого запроса в байтах. Потребовалась посылка пяти сообщений для того, чтобы вирус залогинился в аське. Насколько я мог судить по поведению программы, она ищет пароль для асечного аккаунта напрямую в памяти, а не в каких-то файлах. (пароль для аськи я не сохранял). Дальше я позволял вирусу слать по одному запросу и после каждого пробовал заходить в аську под старым паролем. Таким образом я пытался отловить сообщение, которое содержит в себе информацию о смене пароля. После 10 сообщений мне это надоело и я решил автоматизировать процесс. Воспользовавшись очень полезным плагином OllyScript для OllyDbg, я написал скрипт, который ставил брэйкпоинт на вызов wsock32.send, пускал программу в режиме свободного выполнения и при остановке смотрел параметры, которые передаются в функцию send, считывал нужный кусок памяти с телом запроса и сохранял в файле.
Выяснилось, что после 33-го запроса уже невозможно зайти в аську под старым паролем. Методом пристального вглядывания в содержимое сохраненных файлов я обнаружил, что 27-е сообщение несет в себе информацию о смене пароля на новый и сам пароль в не зашифрованном виде (!). А 28-е - это отправка информации о сворованной аське на другой UIN (очевидно, человека, который написал этот вирус). Попробовал зайти в аську с этим паролем - он подошел. Теперь оставалось выяснить, генерируется ли этот пароль по UIN'у, или же он постоянный. Оказалось, что все немного хуже. При повторном запуске программы, вирус сгенерировал пароль, отличный от того, что был в первый раз...
Алгоритм, который генерирует новый пароль, я не осилил. Код, который реализует этот алгоритм, я бы назвал "зубодробительной жопой". Возможно, как-нибудь в другой раз, когда будет побольше времени, я возьмусь за него повторно, и что-нибудь у меня получится... Единственное, что могу сообщить (возможно это поможет брутфорсерам :)), пароль представляет собой восьмизначное число, т.е. содержит только цифры, что значительно уменьшает количество вариантов для перебора.
Подводя итог, могу сказать, что пострадавшим от вируса рекомендуется воспользоваться функцией восстановления пароля. Выслать на почту, ответить на секретный вопрос и т.п., что там предоставляет для этого icq.com . Ничего более стоящего на ум не приходит.
P.S.
<--! Мною было обнаружено, что при повторном запуске этой флэш-игры вирусный код бездействует и не хочет воровать аську! Пришлось воспользоваться утилитой RegMon, которая мне помогла отловить запись в реестре, которую создает программа при первом запуске и наличие которой проверяет при каждом последующем запуске: если запись не существует, то вирус активируется, иначе - нет. Путь к записи следующий: HKEY_LOCAL_MACHINE\SOFTWARE\started !-->
tired
thoughtful