Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Пример взлома: SourceFormatX

Ara (ara@clteam.net)

Спецвыпуск: Хакер, номер #057, стр. 057-052-3


Как вариант, можно пропатчить OllyDbg.exe. Просто изменить ему класс окна и заголовок.

Едем дальше. Теперь наш отладчик для исследуемой программы не виден - можно запустить ее и проверить. Увидим уже знакомое сообщение о вирусе и модификации. Сначала я просто попытался обойти вывод сообщения. Поставил bp MessageBoxA и посмотрел чуть выше.

kan1:005723A5 call sub_40929C

kan1:005723AA test eax, eax

kan1:005723AC jmp short loc_572403 ; если 0, то переход

...

kan1:005723F7 push 0

kan1:005723F9 call MessageBoxA_0

Поменял переход и, сохранив изменения, запустил софтину. В итоге получил 50 открытых папок "Мои документы" и "убитую" ОС. По частой смене экрана я догадался, что происходит перезапуск explorer.exe (как-то я писал маленькую программку для удаления трояна со своего компьютера, там мне пришлось временно убивать explorer.exe – и было такое же мигание).

Раз уж происходит запуск, попробуем прерваться на выполнении API WinExec. Прописываем в командной строке bp WinExec и запускаем программу.

Мы остановимся в очень интересном месте:

kan1:00517A61 call SetFilePointer_0

kan1:00517A66 cmp eax, 11F9DFh

kan1:00517A6B jmp short loc_517A88

kan1:00517A6D ; -----------------------------------------------------

kan1:00517A6D call sub_555B58

kan1:00517A72 mov eax, [ebp-4]

kan1:00517A75 call sub_516710

kan1:00517A7A

kan1:00517A7A loc_517A7A: ; CODE XREF: kan1:00517A86

kan1:00517A7A push 3

kan1:00517A7C push offset dword_5194F8

kan1:00517A81 call WinExec

kan1:00517A86 jmp short loc_517A7A

kan1:00517A88 ; -----------------------------------------------------

kan1:00517A88

kan1:00517A88 loc_517A88: ; CODE XREF: kan1:00517A6B

kan1:00517A88 xor eax, eax

Это же бесконечный цикл! Нужно изменить условный переход по адресу 00517A6B на безусловный, чтобы никогда больше не попадать в это кошмарное место. Внимание! Перед циклом вызывается функция SetFilePointer, и результат ее работы сравнивается с неким числом. Даже без отладчика можно понять, что это не что иное, как проверка размера файла, то есть проверка на распакованность, которая делается следующим образом: вызывается функция SetFilePointer, устанавливающая указатель на конец файла. Возвращенный результат (текущая позиция указателя) как раз и будет размером файла, так как указатель находится в самом его конце. Полученное число сверяется с зашитым в программе. И если первое больше второго, то вызывается цикл. Будем исправлять такое безобразие. Сначала я вызвал из контекстного меню отладчика функцию Seargh for-All intermodular calls и поставил прерывания на все API WinExec (всего 27 вызовов). Это было сделано для удобства их поиска в коде, прерываться на них мы больше не будем. Теперь, тыкая в букву "В" на панели инструментов OllyDbg, можно посмотреть все установленные бряки. Кликая на каждый из них по очереди, поменяем все находящиеся выше условные переходы на безусловные. Кроме первого (там вызывается блокнот, возможно, это нужный вызов).

Назад на стр. 057-052-2  Содержание  Вперед на стр. 057-052-4