Как стать автором
Обновить

Комментарии 75

Если целью было просто получить скидку — думаю значительно меньше нервов и времени было бы потрачено декомпиляцией флэшки и последующим эмулированием запросов к серверу (если там таковое вообще было, конечно). В целом, занятная статья.
Пожалуй, ещё можно просниффать обращения игры к /game/medigame.php, понять, зачем нужен secret key 719W96lllf7926r791a59W6W5W2d691ed3rfl063 и как он связан с md5. А статья да, годная. Прочитал с удовольствием.
А вы оперативно скачали, декомпилировали и расковыряли исходник флэша! Признаюсь, меня эти over6000 строк привели в уныние.
Это Вы еще, наверное, не пробовали из байткода флэшки алгоритм разбирать :)
не так все страшно)

сalculate_md5 = function (src) { return(binl2hex(core_md5(str2binl(src), src.length * 8))); };

secretkey = «719W96lllf7926r791a59W6W5W2d691ed3rfl063»;
signature = calculate_md5((String(secretkey) + String(fs)) + String(level_data));

Вот про декомпиляцию я, признаюсь, не подумал. Сперва я решил, что игруля как-то сервером связана, и хотел совсем красиво пройти. Например, эмулировать плавные движения мышью, а не просто переводить курсор в нужную точку. Впрочем, я вообще не уверен, что декомпилировал бы быстрее, т.к. флеш даже не писал никогда, а вот мышкотрепателями занимался одно время.
Учитывая, что достаточно распечатать купон, можно вообще обойтись Artmoney. В данном случае работает умножение на 8.
Делов на пару минут
imageСодержимое
А-а-а-а! Как я мог не подумать про ArtMoney! Компьютерная болезнь, не иначе… Напишу апдейт к статье.
Неспортивное поведение)
Кстати, а что будет, если указать 205000 очков?
Если
глянуть в код
holder_mc.onEnterFrame = function ()
{
    this._parent.bonus = this._parent.bonus + 25;
    this._parent.total_score = _root.total_score = _global.scores = _global.scores + 25;
    this._parent.total_score = _root.total_score;
    trace(this._parent.discount);
    if (_root.total_score < 17000) 
    {
        trace(this._parent.discount);
        this._parent.restart_2._visible = true;
        this._parent.replay._visible = true;
        this._parent.replay._visible = true;
        this._parent.replay.total_score = _root.total_score = _global.scores = _global.scores + remainder;
    }
    if (_root.total_score >= 17000 && _root.total_score < 20000) 
    {
        trace(this._parent.discount);
        this._parent.discount = "17%";
    }
    if (_root.total_score >= 20000 && _root.total_score < 25000) 
    {
        trace(this._parent.discount);
        this._parent.discount = "20%";
    }
    if (_root.total_score >= 25000 && _root.total_score < 205000) 
    {
        trace(this._parent.discount);
        this._parent.discount = "25%";
    }
    if (this._parent.bonus > _root.bonus) 
    {
        _global.printed = true;
        remainder = _root.bonus - this._parent.bonus;
        this._parent.total_score = _root.total_score = _global.scores = _global.scores + remainder;
        restart.enabled = true;
        this._parent.bonus = _root.bonus;
        delete this.onEnterFrame;
    }
}
, то видно вилку по очкам…
Получишь небольшую награду за читерство =)
15% скидка
image
И только дизайнер скажет, что можно было бы на самом купоне заменить цифры на «25%» :)
Тоже прочел с удовольствием. Главное, чтоб теперь представители клиники эту статью не увидели. А то уберут игру с сайта, чую:)
Ну, думаю из представителей клиники только IT-шники хабр читают. Соответственно, в худшем для потенциальных клиентов случае может возникнуть соревнование интеллектов — например, программеры сделают шлемы разноцветными. Вообще, думаю, летающие астероиды там сделаны неспроста — поначалу у меня вообще был соблазн просто сравнивать две картинки и стрелять по различиям.
Думаю, 25% для них — это далеко не предел запаса по наценке. Так что им останется только радоваться такой крутой партизанской рекламе.
Ага, ниже в каментах уже огласили цены на операцию в Воронеже — разница в два раза…
Узнал свои отклики перфекционизма) В данной ситуации и правда лучше всего было сделать работающий код, выполняющий задачу. И да, спасибо за инфо о OpenCV!
Сейчас уже поздно, но с утра подтянутся настоящие программисты™ и четвертуют автора за неоптимальный код.
Четвертовать хочется только за GetPixel. Просто потому что со времён Visual Basic 5 мне на форумах, в чатиках и прочих местах приходится с незавидной регулярностью приходится вещать про возможность загнать изображение в байтмассив, с которым можно работать на порядки быстрее. Это как make install, только хуже.
Автор ваще отморозок. Это что у нас, проклятые девяностые что ли? Какая венгерская нотация в C# в 1 веке?
Ну вы и грубиян. И что плохого в венгерской нотации?
Йоу пацан, не парься. Венгерская нотация, в натуре, гнилая тема. Вот тут реально чотко задвинули пацаны, что это дермо мамонта полное фуфло:

«Heresies are, if we know what our variables are, we’ll know their type. If we don’t know what a variable is for, knowing its type won’t help much.»

Если тебе нужен этот отстой, у тебя реально методы длинные, как бабушкин парик, что ты не можешь позырить на тип. Или лабаешь на старперском нотепаде вместо реальной айдии, где можно простым наведением курсора прорюхать тему.
Комментарий как говном на заборе написан. А ведь вы чуть ли не в два раза старше меня. Ну да ладно. К сути вопроса. Остался при своем мнении. Зачем я буду двигать мышкой туда-сюда, чтобы посмотреть на тип, если я могу прочитав название сразу все понять. Даже если метод в 10 строчек, то он может быть частью класса в 100 строчек. И чтобы понять тип свойства вы каждый раз предлагаете мне скроллить вверх и смотреть? По поводу IDE — да, решение. Но попробуйте почитать код на гитхабе не выгружая все в свою любимую IDE.
Про венгерскую нотацию ожидал больше всего комментов: ) Да, привык, отказываться не хочу. Разве что буду делать что-то, где CodeStyle придётся соблюдать какой-то другой.
Тру программер с Химмаша )
Признаться, господа, меня позабавила ваша фраппированность моей маленькой языковой причудой. Достопочтенный Казмирук, который ранее обратил наше внимание на разницу в возрасте (сколь ни наивно было бы предполагать, что о возрасте можно судить по цифре в le profil), указал, как мне кажется, на корень нашего недопонимания.

Для нас, людей почтенного возраста, этот argot юных вахлаков представляется далеким и ненастоящим, как картинка на стене. Для вас, же, так сказать la nouvelle génération вероятно, подобная речь вызывает яркие воспоминания связанные с настоящим чувственным опытом.

Представьте себе, господа, как мы смотрим под тапёра на веселые ужимки пиратов из новейших произведений синематографа. А теперь вообразите какие чувства бы испытал житель прибрежного поселенья семнадцатого века не раз испытывавший на себе их, хе-хе-хе, проделки." — с этими словами он встал из за стола, промокнул салфеточкой свою бугристую плешь, но будто вспомнив что-то остановился

«А признаться, весьма пикантно было, в сегодняшней утренней корреспонденции целых пять писем со словами „отхабрен“ и „захабрен“, пикантно» — оглядев всех еще раз своими маслянистыми глазками от откланялся и вышел.

PS. А что такое «Химмаш»?
Самый известный гоп-район за уралом (Толи в Екатеринбурге, толи в Челябинске). Синоним «Бутово» для Москвы, пожалуй.
На самом деле ничего плохого в ней нет. Дело привычки каждого программиста.

Но соглашение об именовании .net не рекомендует использовать ее.
Как это нет? Программисты пишут код не только для себя, но и для других программистов. А если у программиста привычка писать КэмэлКейсом_со_СнейКейсом_ивоттакими_длиннымипеременными? Привычки бывают плохими и не надо их оправдывать.
И если требуется венгерская нотация, то действительно что-то с этим кодом не так, так как она повышает читаемость только спагеттти кода.
Ну вот лично я не вижу трудностей прочитать лишнюю букву перед именем, я такой код пойму и скорее всего смогу продолжить писать код в таком стиле.

А вот именовать переменные без соглашения, как попало, это плохо, это надо искоренять.
Это да: ) Когда нужна скорость, приходится с помощью LockBits получать массив значений argb и уже по нему линейно пробегаться. Про это недавно даже пост целый был, вроде. Но тут я как раз из принципа так делать не стал, со словами «и так работает». Просто забыл упомянуть об этом аспекте.
Спасибо за статью! Ради интереса без напряга прошел игру — после трёх раундов сообщение: «Вы набрали    очков, этого количества не хватает...»; как видите, вместо очков пропуск. Интересно, в автора или других так само?
Способ, представленный в статье, очень интересный, однако я бы прежде всего копал в направлении создания запросов на сервер с «выиграшными» данными.
За статью спасибо — очень интересный подход к решению задачи,… хотя создаётся стойкое ощущение, что вся статья — реклама клиники.
Но очень креативная и захватывающая реклама, побольше бы такой! :)

А теперь по существу:
1. Геймер из меня никакой, но с первого раза получил 21063 очка, дающие 20% скидки. Этого уже достаточно, не обязательно гнаться за оставшимися 5%
2. По итогам игра выдаёт только картинку, которую нужно распечатать и всё! Что мешает вооружиться фотошопом и «напечатать» заветные циферки?
3. Как многие уже писали выше — если что-то и делать, то разбирать обмен с сервером, возможно — декомпилировать flash'ку и модицифировать часть, отвечающую за финальный подсчёт баллов. Если задача «получить скидку», то это будет самым простым вариантом.

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

p.s. Ну и цены — от 80 килорублей за два глаза! Иногда задумывался о коррекции,… но ну нафиг, с моим -0.75 проще и дальше использовать при необходимости очки.
Подозрений в рекламе ожидал. Наверное да, идея хорошая — «победи наших программистов — напиши бота!». Хотя, судя по контингенту, который я в ходе трёх посещений наблюдал в приёмной — мало кто из них смог бы хотя бы нарисовать купон в ФШ :) Так что эта идея скорее подошла бы компьютерному магазину (в котором среди покупателей процент гиков всё-таки чуть-чуть побольше).

Насчёт декомпиляции написал выше — с флешем вообще не работал. Так что есть основания полагать, что декомпиляция заняла бы больше времени.

После написания второго камента про то, что выиграть легко я не удержался и попробовал пройти вручную… Невероятно, но я тоже набрал двадцатник. Вот честно, не пойму, почему у меня не получалось это сделать две недели назад. Тут вы правы, оставшиеся 5% мало что решают.

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

Мда, видно, внутреннего программиста в себе подавить не так просто. Остаётся только прорекламировать ещё и замечательную книжку цитатой

А что касается мистера Френкеля, который затеял всю эту деятельность, то он начал страдать от компьютерной болезни — о ней сегодня знает каждый, кто работал с компьютерами. Это очень серьезная болезнь, и работать при ней невозможно. Беда с компьютерами состоит в том, что ты с ними играешь. Они так прекрасны, столько возможностей — если четное число, делаешь это, если нечетное, делаешь то, и очень скоро на одной-единственной машине можно делать все более и более изощренные вещи, если только ты достаточно умен.


Хотя, судя по контингенту, который я в ходе трёх посещений наблюдал в приёмной — мало кто из них смог бы хотя бы нарисовать купон в ФШ :)

Ну не скажите.
В приёмной вы видели людей, привлечённых по одним каналам (реклама на телевидение, баннеры на улицах,..). А тут — статья для IT'шников, которая позволит привлечь другую группу людей, которой рекламой по телевизору не заинтересуешь. И среди IT'шников процент «целевой аудитории» (очкариков) достаточно высок. Так что получается отдельный поток клиентов.

После написания второго камента про то, что выиграть легко я не удержался и попробовал пройти вручную… Невероятно, но я тоже набрал двадцатник. Вот честно, не пойму, почему у меня не получалось это сделать две недели назад. Тут вы правы, оставшиеся 5% мало что решают.

Может всё проще — было слишком много жалоб на сложность и игру немного упростили? :)

Мда, видно, внутреннего программиста в себе подавить не так просто. Остаётся только прорекламировать ещё и замечательную книжку цитатой

Как в анекдоте.
«Автомобиль позволяет решить массу проблем — можно и на сервис быстро сгонять, новую резину купить, заехать за запчастями, заправиться… в общем, тех проблем, которых до покупки авто у вас просто и не было :)» ©
Вот только одного не пойму — сложная 4х часовая нейрохирургическая операция на позвоночнике (+7 дней стационара) в хорошей частной клинике практически в центре Москвы стоит ~250 т.р. (и это считается дорого!), а получасовая операция на глазах — почти 100 т.р. (взято с сайта вашей клиники). Странное соотношение.

Правда я бы вам посоветовал ещё раз посмотреть в сторону клиник в Москве — быстрый поиск в Яндексе подсказывает, что вполне можно уложиться в 40-50 т.р. на оба глаза. Это действительно так или я упустил нечто очень важное (к примеру, конкретные технологии)?
Про цены разговор будет оффтопом, наверное… Специально ушёл от темы качества и деталей операции в посте. Клиника не моя — выбирал по правилу левой руки. В Мск цены действительно чуть ниже питерских, но ехать смысла нет, тем более что на след. день и через неделю нужно идти на постоперационное обследование. А тут цены средние по Питеру, если верить моему гуглу. Видимо, всё завязано на стоимость эксплуатации оборудования. Технологии действительно разные. Есть Lasik, который старее, дешевле и хуже, а есть Z-Lasik, который новее, дороже и лучше. В чём там техническая разница, из объяснений офтальмолога я не понял.
Разница только в том, что меньше светобоязнь и быстрее восстановление в первую неделю после операции, насколько я понял из описания.
На sprosi.d3.ru пару дней назад отвечали на вопросы на эту тему. У самого со зрением проблем нет, но прочитал от корки до корки
В Воронеже у себя 5 лет назад делал за ~30т.р. за оба глаза. Сейчас посмотрел цены в этой клинике — стало даже дешевле. Видимо своего хирурга заимели (раньше раз в месяц приезжал хирург из Москвы).
Как самочуствие? Много говорят что в течении нескольких лет после операции коррекции, зрение падает и потом уже не восстановишь.
Не проверял зрение уже давно. К врачу сходить как раз-таки нужно, думаю, 5 лет — достаточный срок, что бы делать какие-либо выводы, тем более, что операцию я делал в 17 (а в этом возрасте не рекомендуется, чем старше, тем лучше, до определённого предела). Так что я попадаю в эту группу риска (если она действительно существует). После посещения врача могу статью запилить, тема то для нас актуальна.

Вывески на улице все могу прочитать, а раньше с -4 по улице ходил как с Adblock.

Левый глаз видит чуть чётче. Целюсь из оружия я им, и он вроде как ведущий, так что это нормально.

В целом просто замечательно — я вижу каждый кирпичик на соседнем доме, каждый листочек на дереве, я узнаю знакомых за сотню метров. И я всё детство не видел звёзд (только самые яркие). А теперь я вижу те, которые некоторые знакомые не видят.

С хирургом во время операции я беседовал и спрашивал у него про повторную операцию. Убеждал меня, что повторная не понадобится, но возможна. После Lasik на роговице остаются рубцы, которые и меняют форму роговицы. Но эти рубцы абсолютно прозрачные. Поэтому повторная операция делается без проблем.

хочется надеяться что это не грамотная реклама)) слишком красиво написано )
Действительно, у вас Lasik ровно в два раза дешевле. Можно развивать медицинский туризм в Воронеж. Думаю, жильё на пару дней там недорого можно снять. Хотя ещё через неделю и через месяц придётся ехать на постобследование. Так что идея скорее больше теоретическая, экономии много не выйдет — как раз на то, чтобы компенсировать неудобства и потраченное время. Спасибо за информацию! Похоже, моё изначальное предположение о том, что цена операции складывается в основном из стоимости оборудования, неверно.
Всегда удивлял подход к выбору врачей/стоматологов по принципу цены. Это ж здоровье, нельзя на нем экономить. Лучше искать врача хорошего, ну и хорошо, если цена окажется подъемной.
Лично я вообще крайне скептически отношусь к такого рода операциям в РФ.
Так а по-другому никак… Если начать искать клинику, то найдешь клинику «Гиппократ» с хирургом Ивановым и клинику «Асклепий» с хирургом Петровым. И как их сравнивать? Отзывы на клиники и врачей погуглил — плюс-минус одно и то же. Личные рекомендации тоже не панацея — то, что тёте повезло с операцией, не факт, что повезёт мне. В общем, остаются формальные критерии — цена, географическое расположение, время существования клиники, известность.
Надеюсь вы сделали операцию по коррекции зрения до того, как разместили эту статью :)
А так, спасибо, прочитал с удовольствием)
Да, друзья отговаривали публиковать статью до операции: ) В любом случае я хотел сперва проверить, действует ли скидка, чтобы не вводить никого в заблуждение.
Понравилась Ваша статья, пока читал, даже поймал себя на мысли, что тороплюсь: будто чем быстрее прочитаю, тем быстрее главный герой получит свою скидку на операцию. )

После запуска бота мышку невозможно вывести за пределы игрового поля — она будет вечно прыгать по указанным точкам, даже при запуске диспетчера задач. Признаюсь, что я из этой ситуации вышел с помощью перезагрузки…

Теперь, чтобы остановить бота нужно просто нажать Win+D.


Люблю для этой цели использовать Num Lock. Проверить, горит ли он, можно одной строчкой.
NumLock это просто, как и всё гениальное — возьму на вооружение! Только я, пожалуй, буду использовать самую бесполезную клавишу — ScrollLock.
Статья интересная, занимался реализацией подобного с распознаванием образов, т.к. было много хитростей. Интересно было бы увидеть подобную статью на opencv — интересна сама реализация. Сейчас по просьбе реализовал того же бота с распознаванием только под Ubuntu на Bash с использованием xte. Если кому интересно могу написать статью.
19500 со второго раза с не очень удобной мышкой… выгоды никакой нет ради 5% тратить два вечера, ну если не считать фан конечно.
Надеюсь, после этого поста к вам не пришли люди в черном плаще с лазером и не «вылечили», как тех кротов в игре =))
Не подскажете, а что это за язык и как вы находили координаты?
Судя по коду использовался c# а координаты четко привязывались к точкам на экране выяснив позицию. В идеале на самом деле можно отталкиваться от статичного элемента в флешевой игре, и тут можно не думать о размерах экрана, главное чтобы флешка была видна полностью.
просто я видел боты написанные на pilot и autoit, вот и возник вопрос
Хех, попробовал сыграть и с первого раза набрал 24016 очков, думаю ещё пару игр и вполне реально дойти до планки 25 000, т.к. довольно много промахивался и не успевал. Сразу скажу, я не «задрот», в игры последний раз играл лет 6 назад, когда студентом был)

А статья интересная, прочитал с удовольствием, спасибо!
Яб поленился все это писать и набросал бы на AutoHotKey'е (простой скриптовый язык, направленный на эмуляцию действий пользователя)

Весь скрипт бы выглядел так

F12::
Loop.
{
MouseClick,Left, 100, 100;
MouseClick,Left, 100, 150;
MouseClick,Left, 100, 200;

Sleep, 50
}

Т.е. банально бы кликал по всем возможным местам появления кротов.
Я же сперва так и начал делать, не получилось. Кроты могут появлятся почти в любом месте экрана, а «прокликивать» весь экран не получится по времени, т.к. кроты вылезают меньше чем на секунду. Плюс всё портит глюк с кротами из кратеров, на которых если кликнуть слишком быстро, то они застревают просто.
Так вы коррекцию сделали? Если да, то расскажите ощущения :)
Сделал, ощущения приятные — всё видно хорошо, но надо было подождать пару дней, пока зрение не стабилизировалось. Все бутылки с раствором для линз отправились в помойку, а вот ощущение «фантомных линз» осталось — с утра просыпаюсь с ощущением, будто спал в линзах, надеюсь, со временем пройдёт.
Класс. А то на эти линзы уже потратил как на 2 операции.
А если например играть через какую-ть виртуалку и замедлить скорость?
Ещё одна превосходная идея, спасибо!
Раньше для этого входил в «Right Click => Settings». На старых версиях флеша все игры начинали от этого тормозить =)
Сыграв несколько раз, я всё же набрал требуемые 17000 очков
Сунул сертификат в шоп и поправил 17000 на 25000, 17% на 25% Нет?
Да, всё так. Про это уже писали выше. И я тоже об этом думал в самом начале. Но дело в том, что пока вы не увидите как выглядит сертификат на 25% вы не сможете его нарисовать. Вполне вероятна ситуация, когда в разных сертификатах используются разные цвета фона, например, или появляются дополнительные элементы оформления. В данном случае этого не было, но мне не хотелось проверять это в день операции.
Вполне вероятна ситуация, когда в разных сертификатах используются разные цвета фона, например, или появляются дополнительные элементы оформления.


Интересный способ защиты, кстати. Но проверка на сервере всё равно лучше, наверное.
М-Видео устраивал как-то раз акцию с флеш игрой и очень кошерными призами. Во первых они засветили все email игроков, создавая после каждой игры страницу с отдельным id, на котором был email и результат. Во вторых результат можно было подделать просто поправив POST запрос. Я, как честный человек сообщил о проблемах разработчику, email стали закрывать звёздочками, а POST запрос так и не починили. В итоге им пришлось делать лотерею среди победителей, а почти все призы унесла одна и та же девушка.
… девушка, которая в отличие от разработчика знала что такое метод POST :) Да, при наличии хоть сколько-нибудь ценного приза все эти игры превратятся в кормушку для ботоводов, где реальным игрокам делать нечего впринципе.
Может это была девушка разработчика? Подозрительный, кстати тип, поведал о нижнем пороге по отсечению жуликов, который физически нереально набить вручную. В качестве призов были айфоны, айпады, ноутбуки.
Меня однажды подсадили на игру на iPad. Игра по типу фарминга, где вся суть в сотне нажатий. Решил написать бота, взломал iPad, начал изучать запросы к серваку. А потом подумал: «А что если найти баг в игре, который позволит мне сказочно обогатится?». И такой баг нашел. Баг оказался логическим.
В игре было две валюты: орешки и монеты. Орешки давались за реальные деньги, но на старте давали парочку. На орешки можно было купить предметы, которые не продавались за монеты, а также орешки можно было выменять на монеты. Что я делал? Я копил монеты, и покупал на них дорогущий домик, который продавался также при наличии орешков и кучи монет. Купленный домик я тут же продавал на местном рынке. Конечно, монет я получал чуть меньше стоимости домика. Но баг был в том, что орешки не исчезали, а наоборот их становилось чуть больше. Далее я чуть-чуть подкапливал деньги, снова покупал домик, и опять продавал. Где-то за два дня я достиг последнего уровня игры, построил на карте огромный дворец и свалил из игры написав флажками на поле для гольфа слово Bye-Bye.
Потом вернулся в игру спустя полгода. Баг с орешками разработчики пофиксили и подняли предельный уровень с 25 до 100.
Такими темпами в онлайн-играх споро придётся вводить капчу, чтобы ударить моба.
Мы с братом так в кофейном аппарате в детстве баг нашли: повышение количества сахара было бесплатным, а уменьшение убирало один сантим от цены… Так мы упивались бесплатным кофе с молоком, пока аппарат не увезли…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации