Софт-баннеры - это программы, показывающие рекламу и за это начисляющие
"поинты", которые потом можно перевести в реальные деньги или
отоварить в онлайн-магазине. Примером может
послужить 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, и
вероятность нахождения близко к границе экрана - меньше, чем вероятность нахождения у центра. Представьте,
что человек, написавший "бармена", просто получит через пару дней письмо без объяснений: "ваш экаунт
закрыт за попытку мошеничества". Сможет ли он понять, что проблема - в неестественном
распределении вероятностей?
Другой случай - человек написал эмулятор софт-банера, которая совершенно
законно передает серверу информацию о реальных передвижениях мыши, но не показывает рекламные баннеры.
Баннеры неприятны именно тем, что занимают часть экрана, если же их не показывать, на экране
останется свободное место, в котором опять же неестественно часто будет появляться мыша (ну а что
мыша делает над
баннером?).
Конечно, описанная защита - страшная сказка, реально я не получил письма
"экаунт закрыт" несмотря на такую откровенную наглость, как вмешательство в код баннера, увеличение
скорости начисления поинтов и отсутствие активности по загрузке баннеров. Возможно, нынешние
вложения в защиту софт-баннеров считаются (и справедливо) достаточными, т.к. зарубежные
специалисты, способные хотя бы написать "бармена", ценятся уже на два порядка выше, чем могут принести
мошенничества.
Хотя... Если этим заниматься централизованно...