Издевательство над окнами nezumi Спецвыпуск: Хакер, номер #058, стр. 058-024-3 .text:77E1554D cmp eax, 113h ; WM_TIMER .text:77E15551 jnz loc_77E15692 .text:77E15557 mov ecx, eax Все, что нужно сделать, - дождаться выполнения команды cmp eax,113h и передать управление по адресу 77E15557h. Теперь сообщение WM_TIMER будет доставляться независимо от территориальной принадлежности атакуемого окна. А трассировать свою собственную проекцию USER32.DLL нам никто не запрещает. Во всяком случае пока... Разумеется, от эмуляции клавиатурного ввода антивирус может защититься: например, перед каждым изменением конфигурации задавать случайный вопрос из серии "Сколько будет дважды два?". Человек легко ответит, а вирус - едва ли. Простой парольной защиты здесь явно недостаточно, поскольку перехват пароля не является большой проблемой. Но вот от WM_TIMER на прикладном уровне никакой защиты нет! И не будет до тех пор, пока Microsoft не выпустит очередную заплатку, на этот раз действительно исправляющую дыру, а не делающую морду тапком. Фрагмент автоматического регистратора, демонстрирующий технику эмуляции ввода // КОНФИГУРАЦИЯ #define MAX_STR 100 #define NAMEWIN "имя_приложения" // ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ (просто, хотя и безвкусно) HWND regnum = 0; HWND me_hwnd = 0; HWND hackreg = 0; HWND username = 0; HWND input_but = 0; // ПЕРЕЧИСЛЕНИЕ ОКОН ВЕРХНЕГО УРОВНЯ // =========================================================================== // ищем окно с заголовком NAMEWIN и заносим его хэндл в гл. переменную me_hwnd BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lParam) { char buf[MAX_STR]; // читаем заголовок GetWindowText(hwnd, buf, MAX_STR - 1); // это NAMEWIN? if (strstr(buf, NAMEWIN) == buf) { me_hwnd = hwnd; // получаем его hwnd и прекращаем просмотр окон return 0; } return 1; // просмотр окон продолжается } // ПЕРЕЧИСЛЕНИЕ ДОЧЕРНИХ ОКОН crackme // =========================================================================== // получаем хэндлы всех интересующих нас окон // (порядок окон определяем либо экспериментально BOOL CALLBACK EnumChildWindowsProc(HWND hwnd,LPARAM lParam) { static N = 0; switch(++N) { case 3: // окно с именем пользователя username = hwnd; break; case 4: // text со строкой "reg. num." hackreg = hwnd; break; case 5: // окно для ввода регистрационного номера regnum = hwnd; break; case 6: // кнопка ввода input_but = hwnd; return 0; } return 1; } int main(int argc, char* argv[]) { // перечисляем окна верхнего уровня в поиске нашего EnumWindows(&EnumWindowsProc, 0); if (me_hwnd == 0) { printf("-ERR: %s not running!\x7\n", NAMEWIN); |