Пример взлома: 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, можно посмотреть все установленные бряки. Кликая на каждый из них по очереди, поменяем все находящиеся выше условные переходы на безусловные. Кроме первого (там вызывается блокнот, возможно, это нужный вызов). |