Софт-баннеры — это программы, показывающие рекламу и за это начисляющие
«поинты», которые потом можно перевести в реальные деньги или
отоварить в онлайн-магазине. Примером может
послужить Spedia и Cashfiesta, при желании можно найти кучу других.
Естественно, находятся желающие получать поинты не за просмотр рекламы, а действительно на халяву, и
придумываются различные способы обмана софт-баннеров. Об этих способах и защите о них и
поговорим.

Самая первая мысль, приходящая в голову желающему обмануть баннер — просто
уйти, оставив компьютер включенным: нехай он себе крутит рекламу, денюжки бегут, а я пока
посплю. Естественно, что рекламодателю ни к чему платить за показ рекламы, если ее никто не будет
смотреть, и поэтому посредник (создатель софт-баннеров) вынужден принимать меры защиты. В той же
Cashfiesta проверяется, чтобы курсор мыши двигался по экрану, доказывая, что пользователь
жив и работает. Если признаков жизни от пользователя нет, то поинты перестают начисляться.
Народные умельцы недолго мучились с этой проблемой: создается программа,
которая имитирует работу пользователя, двигая и щелкая мышкой в нужных местах. В качестве примера
возьмем ту же
«бармен для
Cashfieta
" или TheCash.

Есть и более простое и эффективное решение: модификация или эмуляция
софт-баннера. Мы создаем собственную программу (или дорабатываем напильником существующую), так,
чтобы она выполняла те же функции, что и оригинальная, за исключением собственно показа
рекламы. Например, для той же CashFiesta (текущей версии) достаточно пропатчить память
процесса. И в win98, и в win2k код находится по одному и тому же адресу, что позволяет
предположить, что место под него выделяется VirtualAlloc-ом с фиксированным адресом, хотя я и
не проверял. Вот что нужно править:

20004b16 75 65 -> 90 90

Раньше здесь была инструкция jnz, обходящая блок кода, работающий только при
активном баннере. Очевидно, в исходниках было нечто вроде:

if(banner_active())
if(timercnt++==0x78){
addpoints();
refreshwindow();
timercnt=0;
}

После исправления на 90 90 (nop nop) кусок кода работает даже в том случае,
если баннер не активен. Теперь можно не заботиться о том, чтобы удовлетворять потребность
баннера в человеческом внимании — поинты все равно будут капать. Кстати, сравнение
timercnt и 0x78, влияющее на скорость набегания поинтов, находится по адресу 20004b59, только
лично я бы не стал его править — при слишком быстром набегании сервер прямо говорит «ты
гонишь, не могут поинты так быстро капать!». При свернутом в линеечку баннере поинты также
капают.

Казалось бы, хорошей защиты от подобных надувательств нет, хотя… В
софт-баннерах вся система начисления поинтов и проверки на обман почему-то сосредоточена в клиентской
части, единственное, что делает серверная — проверяет, чтобы
не воможно было начислить нереальную сумму очков. А могло
быть хуже…

Страшная сказка о server-side защите.

Клиент (софт-баннер) не считает очки сам. Он только посылает на сервер
информацию о передвижении мышки и получает от сервера ответы — количество очков на данный момент. Теперь
задача серверного ПО — обеспечить защиту от эмуляции баннера и эмуляции присутствия человека за
компьютером. Понятно, что хорошую эмуляцию нельзя отличить от реальности. Но кто сможет
сделать хорошую эмуляцию, когда критерии «хорошести» неизвестны, т.к. проверка на эмуляцию
осуществляется серверной частью, к которой нет доступа?
Профессиональный математик + программист с килобаксовой
зарплатой, возможно, сможет, но стоит ли свеч такая игра? А от рядового
программиста, позавчера увидевшего Delphi/MSVC и полезшего писать «бармена»,
проверка на эмуляцию наверняка спасет.

Все «бармены» построены по примерно такому принципу: в случайные интервалы
времени мыша совершает путешествие в случайные области экрана. Это выглядит так: берется случайная
точка, и курсор начинает перемещаться к ней. Составим статистику нахождуния мыши в каждой
конкретной точке экрана. Так как точка, к которой будет двигаться мыша, выбирается как значение функции,
дающей случайную величину с равномерным распределением, вероятность нахождения мыши в каждой
точке экрана минимум — симметрична относительно осей X, Y и центра экрана, а максимум — при
достаточно редком передвижении мыши — равномерно распределена по всему экрану. Это если за
машиной «сидит» эмулятор человека.

А если за машиной сидит настоящий человек, распределение будет какое угодно, но
не близкое к такому «правильному». У меня, например, мыша с вероятностью 90% находится в правой
половине экрана, и с вероятностью 80% — прижата к краю. В случае эмулятора все должно было бы
быть наоборот: вероятность нахождения мыши слева и справа — 50/50, и
вероятность нахождения близко к границе экрана — меньше, чем вероятность нахождения у центра. Представьте,
что человек, написавший «бармена», просто получит через пару дней письмо без объяснений: «ваш экаунт
закрыт за попытку мошеничества». Сможет ли он понять, что проблема — в неестественном
распределении вероятностей? 

Другой случай — человек написал эмулятор софт-банера, которая совершенно
законно передает серверу информацию о реальных передвижениях мыши, но не показывает рекламные баннеры.
Баннеры неприятны именно тем, что занимают часть экрана, если же их не показывать, на экране
останется свободное место, в котором опять же неестественно часто будет появляться мыша (ну а что
мыша делает над
баннером?).

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

Хотя… Если этим заниматься централизованно…

Оставить мнение

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …