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

Некролог на Web-Money Keeper

Крис Касперски

Хакер, номер #094, стр. 094-062-6


Первая же перекрестная ссылка ведет нас к следующему коду, который нам сейчас и предстоит дешифровать:

Фрагмент Keeper'а, вызывающий функцию DeviceIoControl

.text:100B76C3 push 0 ; lpOverlapped

.text:100B76C5 lea edx, [ebp+BytesReturned]

.text:100B76CB push edx ; lpBytesReturned

.text:100B76CC push 18h ; nOutBufferSize

.text:100B76CE lea eax, [ebp+OutBuffer]

.text:100B76D4 push eax ; lpOutBuffer

.text:100B76D5 push 0 ; nInBufferSize

.text:100B76D7 push 0 ; lpInBuffer

.text:100B76D9 push 74080h ; dwIoControlCode

.text:100B76DE mov ecx, [ebp+hObject]

.text:100B76E4 push ecx ; hDevice

.text:100B76E5 call ds:DeviceIoControl

Прокрутив дизассемблерный листинг вверх, мы узнаем, что в переменной [ebp + hObject] находится дескриптор, возвращенный функцией CreateFileA(), которой скормили строку «\\.\PhysicalDrive%d». Очень интересно! Значит, перед нами код, напрямую взаимодействующий с жестким диском. Но как именно он с ним взаимодействует? Ответ скрыт в IOCTL-коде, равном 74080h. Все, что нам нужно, — перевести его в удобочитаемую константу, а для этого необходимо знать, как формируются IOCTL-коды, или воспользоваться online-калькулятором, доступном на http://www.osronline.com/article.cfm?article=229.

Вводим IOCTL-код в окошко «VALUE» и получаем полную расшифровку: Device – DISK (0x7), Function – 0x20, Access – «FILE_READ_ACCESS», Method – «METHOD_BUFFERED». Ага, значит, чтение. Ну хорошо хоть не запись! Однако запись еще впереди! Например:

Еще один фрагмент Keeper'а, вызывающий функцию DeviceIoControl

.text:100B7F63 push 0 ; lpOverlapped

.text:100B7F65 mov ecx, [ebp+lpBytesReturned]

.text:100B7F68 push ecx ; lpBytesReturned

.text:100B7F69 push 210h ; nOutBufferSize

.text:100B7F6E mov edx, [ebp+lpOutBuffer]

.text:100B7F71 push edx ; lpOutBuffer

.text:100B7F72 push 20h ; nInBufferSize

.text:100B7F74 mov eax, [ebp+lpInBuffer]

.text:100B7F77 push eax ; lpInBuffer

.text:100B7F78 push 7C088h ; dwIoControlCode

.text:100B7F7D mov ecx, [ebp+hDevice]

.text:100B7F80 push ecx ; hDevice

.text:100B7F81 call ds:DeviceIoControl

Калькулятор говорит, что IOCTL-код 7C088h обеспечивает как запись, так и чтение данных с диска на секторном уровне в обход файловой системы и всех установленных ею ограничений. Возможно, что Keeper создает на жестком диске какой-то «тайник» или своеобразную метку, помогающую «людям в погонах» отождествить его. Или это просто Keeper так привязывается к оборудованию, чтобы его было нельзя запустить с чужого компьютера (скорее всего, так оно и есть, ведь WM Keeper не загрузит ключи на другом железе. — Прим. ред.)? Кто знает, полное исследование требует большой концентрации сил, ресурсов и времени, но вряд ли конечный результат стоит того, поскольку и без того ясно, что за зверь этот Keeper (а еще невинным муравьем прикидывается!).

Заключение

Мы выяснили, что Keeper Classic не только собирает (и отсылает) приватную информацию, но и отличается крайне агрессивным поведением. Скрываясь под аляповатым интерфейсом прикладной программы, он пробивает тоннель к самому центру операционной системы и делает это настолько некорректно, что у ряда легальных пользователей появляются серьезные проблемы.

Назад на стр. 094-062-5  Содержание  Вперед на стр. 094-062-7