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

Издевательство над окнами

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);

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