Обзор эксплойтов Крис Касперски ака мыщъх Хакер, номер #091, стр. 091-060-8 Всего-то и нужно, что заменить 67B8CF15: JL loc_67B8CF1C (7Ch 05h) на JB loc_67B8CF1C (72h 05h). Если бы файл был неупакован, то это можно было бы сделать прямо в hiew'е, а так... нет. Конечно, распаковать opera.dll вполне возможно, тем более что ASPack – упаковщик вполне известный, но не всегда распаковка проходит успешно, и потом начинают вылезать баги в разных местах. Мы пойдем другим путем, прибегнув к on-line patch'у, то есть запустим opera.exe, дождемся распаковки opera.dll и исправим байты прямо в оперативной памяти! Аналогичный подход может быть применен и к другим программам, не только к Опере, поэтому ниже приводится исходный текст простейшего универсального on-line patсher'а. Листинг 9: исходный текст on-line patcher'a opera_loader.c #include <stdio.h> #include <windows.h> #define MAX_SIZE 16 // длина буфера для патча main(int argc, char **argv) { // объявляем переменные STARTUPINFO si; PROCESS_INFORMATION pi; DWORD N,FL; // имя исполняемого файла для запуска unsigned char name[]="opera.exe"; unsigned char buf[MAX_SIZE]; // указываем что и где мы будем патчить unsigned char jmp_from[] = "\x7Ch\x05h"; // old unsigned char jmp_to[] = "\x72\x90"; // new void* jmp_off = (void*)0x67B8CF1C;// address printf("loading & patching...\n"); // инициализация всех структур данных si.cb = sizeof(si); memset(&si,0,sizeof(si)); memset(buf,0,MAX_SIZE); // запускаем оперу на выполнение, для простоты не передавая // ей аргументы командой строки CreateProcess(0, name, 0, 0, 0, NORMAL_PRIORITY_CLASS, 0, 0, &si, &pi); // ждем 1 сек, в течение которой opera.dll должна загрузиться и распаковаться // возможно, на медленных ЦП это значение придется увеличить Sleep(1000); // проверка версии оперы перед патчем ReadProcessMemory(pi.hProcess, jmp_off, buf, strlen(jmp_from), &N); if (N != strlen(jmp_from)){printf("-ERR:reading memory\x7\n"); return -1;} if (strcmp(jmp_from,buf)){printf("-ERR:incorrect version!\x7\n");return -1;} // падчим условный знаковый переход JL на беззнаковый JB WriteProcessMemory(pi.hProcess, jmp_off, jmp_to, strlen(jmp_to), &N); if (N != strlen(jmp_to)){printf("-ERR:writing memory\x7\n");return -1;} // говорим ОК и сваливаем printf("OK\nall ok \n"); } Естественно, теперь каждый раз придется запускать не opera.exe, а opera_loader.exe. Впрочем, чтобы не напрягаться, достаточно всего лишь сменить ярлыки и файловые ассоциации. Правда, в силу небольшой конструктивной недоработки on-line patcher'а он не передает Опере аргументы командой строки, поэтому если она установлена основным браузером по умолчанию, то htm-файлы открываться не будут! Используйте drag-n-drop или доработайте patcher «напильником» до законченной конструкции. Главное, что мы заткнули дыру своими собственными силами, и нам не понадобились никакие обновления. |