{"id":126,"date":"2010-08-17T23:50:22","date_gmt":"2010-08-17T21:50:22","guid":{"rendered":"http:\/\/www.davel.fr\/techblog\/?p=126"},"modified":"2010-08-17T23:50:22","modified_gmt":"2010-08-17T21:50:22","slug":"pourquoi-est-ce-idiot-dorganiser-un-jeu-concours-a-lots-base-sur-le-score","status":"publish","type":"post","link":"https:\/\/www.davel.fr\/techblog\/2010\/08\/pourquoi-est-ce-idiot-dorganiser-un-jeu-concours-a-lots-base-sur-le-score\/","title":{"rendered":"Pourquoi est-ce idiot d&rsquo;organiser un jeu concours \u00e0 lots bas\u00e9 sur le score ?"},"content":{"rendered":"<p>Bin oui pourquoi ? Et puis pourquoi \"idiot\" apr\u00e8s tout c'est une bonne id\u00e9e : \u00e7a augmente le challenge entre les gens, entre amis, bref \u00e7a donne envie de jouer pour donner \u00e0 tout plein d'entreprises aux bonnes intentions ses coordonn\u00e9es, qui elles ont le droit \u00e0 un jeu o\u00f9 le score compte : celui qui aura la plus grosse base <abbr title=\"Customer Relationship Management\">CRM<\/abbr> gagne.<\/p>\n<p>Et apr\u00e8s tout on en a vu des jeux qui se basent sur le score ou le classement, et \u00e7a fonctionne tr\u00e8s bien, comme <a href=\"http:\/\/apps.facebook.com\/towerbloxx\/\" target=\"_blank\">Tower Bloxx<\/a> sur facebook, ou encore <a href=\"http:\/\/davel.labrute.fr\">La Brute[*]<\/a> des excellents et prolifiques <a href=\"http:\/\/www.motion-twin.com\/\">Motion Twin<\/a>.<\/p>\n<p>Peut-\u00eatre, vous r\u00e9torquerais-je vaillamment, mais remarquez qu'aucun des deux n'offre de lots pour app\u00e2ter plus de joueurs encore.<\/p>\n<p><strong>Alors pourquoi ?<\/strong><!--more--><\/p>\n<p>Mais parce que \u00e7a se pirate trop facilement ma bonne dame !!<\/p>\n<p>Vous allez me dire - si si, je vous ai vu pouffer - qu'on s'en fout parce que ce sont de grosses boites qui ont les moyens d'offrir des lots. Et c'est vrai, et en prime l'essentiel est que les gens s'inscrivent pas que ce soient les vrais gagnants qui gagnent.<br \/>\nMais tout de m\u00eame,\u00e7a la fout mal pour l'image d'une boite d'\u00eatre \u00e0 l'origine d'une injustice flagrante, contrairement \u00e0 l'image d'un gouvernement si j'en crois les sondages.<strong><em><br \/>\n<\/em><\/strong><\/p>\n<p><strong><em>Ah ah ah, moi je les ai eu, j'ai fait mon jeu en flash, comme \u00e7a y'a plein d'animations et puis c'est un fichier SWF qu'on peut pas lire et modifier avec notepad.<\/em><\/strong>[**]<\/p>\n<p>Bravo ! Bien jou\u00e9... vous avez r\u00e9ussi \u00e0 trouver un dev' Flash en cette p\u00e9riode de disette je vous f\u00e9licite. Mais concernant vos certitudes je me vois dans l'obigation d'y mettre un frein.<\/p>\n<p>Non, notepad n'aidera effectivement pas mais certains outils [<a href=\"http:\/\/www.sothink.com\/product\/flashdecompiler\/\" target=\"_blank\">1<\/a> - <a href=\"http:\/\/www.eltima.com\/products\/flashdecompiler\/\" target=\"_blank\">2<\/a>] vont permettre au p\u00e9kin moyen dot\u00e9 de deux sous de jugeote et trois de technique de lire votre SWF comme dans un livre ouvert. Un livre de d\u00e9veloppeur ActionScript mais un livre tout de m\u00eame.<\/p>\n<p>Il existe quand m\u00eame ce qu'on appelle des obfuscateurs de code qui permettent de foutre un bordel monstrueux dans le code source. C'est un ralentisseur efficace pour les intrus mais le code est encore valide et un peu de patience permet de le remettre en place. De plus, ce qu'un programme a pu faire, il est possible qu'un autre programme le d\u00e9fasse. Cela peut marcher un temps donc.<br \/>\nPour plus d'info sur le sujet voici <a href=\"http:\/\/cyberzoide.developpez.com\/securite\/obfuscation\/\">un article technique int\u00e9ressant<\/a> (mais pas sp\u00e9cialis\u00e9 ActionScript).<\/p>\n<p>Bon allez, je vous l'accorde, vous avez r\u00e9ussi \u00e0 produire un code difficile \u00e0 lire - peut-\u00eatre m\u00eame que votre dev AS ne l'a m\u00eame pas fait expr\u00e8s ^_^. Vous pensez \u00eatre sorti d'affaire ? Mais votre jeu il tourne sur l'ordinateur de votre client. Il utilise donc son processeur... sa RAM... et s'il voulait les modifier ?<\/p>\n<p><strong><em>Oh mais c'est des trucs compliqu\u00e9s tout \u00e7a et puis j'ai m\u00eame pas compris tous les termes. Ma cible n'a pas ce niveau et n'en pannera pas plus que moi de ce charabia.<\/em><\/strong><\/p>\n<p>C'est compliqu\u00e9 ? Oui, comme tout en informatique, mais il y a toujours des petites feignasses qui se cr\u00e9ent des outils pour automatiser les trucs chiants. Et \u00e0 la fin tout le monde peut les utiliser, c'est magique. La preuve <a href=\"http:\/\/www.metacafe.com\/watch\/1142167\/how_to_hack_any_flash_game\/\" target=\"_blank\">en vid\u00e9o et en langue anglaise<\/a> avec un outil au nom si \u00e9quivoque : <a href=\"http:\/\/www.cheatengine.org\/aboutce.php\" target=\"_blank\">Cheat Engine<\/a>.<\/p>\n<p>Oh allez, je vous l'accorde avec du temps et plusieurs techniques vous pouvez commencer \u00e0 rendre le code plus dur \u00e0 trafiquer, en copiant plusieurs version en m\u00e9moire avec des codages diff\u00e9rents, et des v\u00e9rifications.<br \/>\nex. je place \u00e0 dans plusieurs variables le score : l'une normale, pour \u00eatre lue rapidement, l'autre hash\u00e9e avec un <a href=\"http:\/\/fr.wikipedia.org\/wiki\/MD5\" target=\"_blank\">md5<\/a> et une troisi\u00e8me avec un <a href=\"http:\/\/fr.wikipedia.org\/wiki\/SHA1\" target=\"_blank\">sha1<\/a>, et m\u00e9langez le tout et vous v\u00e9rifiez de temps en temps. Vous obtenez, en utilisation conjointe avec un obfuscateur, un truc peut \u00eatre pas impossible \u00e0 pirater mais au moins assez chiant pour que ce soit r\u00e9dhibitoire.<\/p>\n<p>J'ai pr\u00e9cis\u00e9 un peu plus haut \"avec du temps\"... et oui mettre en place tout \u00e7a prend du temps et parfois l'achat d'autres logiciels. Votre projet, si c'est une op\u00e9ration \u00e9v\u00e8nementielle, peut prendre au moins 20% d'augmentation sur le d\u00e9veloppement du front et tout \u00e7a sans aucune garantie d'infaillibilit\u00e9.<\/p>\n<p><strong><em>Oui mais moi je m'en fiche parce que mes score sont r\u00e9cup\u00e9r\u00e9s et stock\u00e9s sur le serveur et que l\u00e0 y'a personne qui peut voir le code et la base. Ah ah T'es bien niqu\u00e9 l\u00e0 !<\/em><\/strong><\/p>\n<p>Puisque tu veux me filsdeputiser, je vais ramener mon pote <a href=\"http:\/\/www.charlesproxy.com\/\" target=\"_blank\">Charles<\/a>, qui est vachement fort parce que tout ce que mon ordinateur va envoyer sur ton serveur, bah il va tout me dire. TOUT ! L'extension <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/6647\/\" target=\"_blank\">HttpFox<\/a> sur Firefox fait de m\u00eame. Et j'ai m\u00eame appris, pour mes recherche sur cet article, qu'un autre extension, <a href=\"https:\/\/addons.mozilla.org\/fr\/firefox\/addon\/966\/\" target=\"_blank\">TamperData<\/a> de modifier ces informations en l\u00e9ger diff\u00e9r\u00e9 \u00e0 l'aise.<\/p>\n<p>Autant vous le dire, votre serveur on peut lui dire ce qu'on veut et il n'aura quasi aucun moyen de v\u00e9rifier quoi que ce soit. Je peux me faire passer pour qui je veux, faire passer les informations que je veux. La principale r\u00e8gle de s\u00e9curit\u00e9 que devrait suivre tout d\u00e9veloppeur serveur c'est de ne jamais croire sur parole ce qu'il re\u00e7oit de l'ext\u00e9rieur. (cf. <a href=\"http:\/\/www.saphirtech.com\/securite.html\" target=\"_blank\">cet excellent document sur la s\u00e9curit\u00e9<\/a> que j'oblige les stagiaires dev' \u00e0 lire avant de dev du PHP ave moi)<\/p>\n<p><strong><em>Ah, je sais ! On va crypter les donn\u00e9es en MD5 avec flash qu'on d\u00e9cryptera sur le serveur. (l'id\u00e9e est de <a href=\"twitter.com\/mathomate\" target=\"_blank\">@mathomate<\/a>, qui n'est pas dev' mais poss\u00e8de tout de m\u00eame un cerveau, sur un de nos projets commun, et la citation n'est pas ultra pr\u00e9cise :))<\/em><\/strong><\/p>\n<p>L\u00e0 il y a de l'id\u00e9e ! Bon par contre le MD5 ne se d\u00e9crypte pas.<br \/>\nIl existe de nombreuses fa\u00e7on pour d\u00e9couvrir ce qui se cache derri\u00e8re un code md5 mais il n'est pas fait pour \u00e7a, de m\u00eame que SHA1. Ces des m\u00e9thodes font ce qu'on appelle un hashage, qui sert \u00e0 calculer un v\u00e9rificateur. Par exemple, je stocke dans une base mon mot de passe en hash\u00e9 en MD5, et puis quand on m'envoie un mot de passe, je le code \u00e0 son tour en MD5 et je v\u00e9rifie la concordance. Cette op\u00e9ration n'est donc pas r\u00e9versible sinon il suffirait d'acc\u00e9der \u00e0 la base pour connaitre tous les mots de passe.[***]<\/p>\n<p>Mais gardons l'id\u00e9e avec le cryptage RSA. Pour r\u00e9sumer, sinon je vous invite \u00e0 aller voir <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Rivest_Shamir_Adleman\" target=\"_blank\">sa page Wikipedia<\/a>,\u00a0 il permet de coder une chaine de caract\u00e8res que seul le destinataire sera capable de d\u00e9coder. Pour cela le destinataire envoie des codes, des cl\u00e9s publiques, qui vont permettre \u00e0 l'\u00e9metteur de coder son contenu. Mais il garde de son cot\u00e9, et ne le pr\u00eate \u00e0 personne comme un sale gamin avec sa pelle toute neuve, une cl\u00e9 priv\u00e9 lui permettant le d\u00e9codage. Parfait ?<\/p>\n<p>Bah non justement, notre probl\u00e8me n'est pas l'\u00e9couteur - le serveur -\u00a0 mais l'\u00e9metteur - joueur ou pirate. Si la cl\u00e9 publique est envoy\u00e9e alors mon pote Charles va le savoir, et alors plus de soucis pour encoder les donn\u00e9es comme le serveur les attend avec impatience et lui envoyer.<\/p>\n<p>Seul inconv\u00e9nient pour le tricheur : encore faut-il savoir ce qu'il faut envoyer et sous quelle forme. Et l\u00e0 c'est le code inclut dans le SWF qui devrait donner la r\u00e9ponse.<\/p>\n<p><strong><em>Mais si on utilise toutes ces m\u00e9thodes \u00e0 la fois, \u00e7a va \u00eatre hyper chiant pour le pirate, juste pour gagner une machine \u00e0 caf\u00e9, j'veux dire c'est pas un peu disproportionn\u00e9 ?<\/em><\/strong><\/p>\n<p>Pour une machine \u00e0 caf\u00e9 oui, mais pour un voyage, une voiture[****], ou d'autres choses qu'on peut avoir en incentive. Et puis pour un no-life sp\u00e9cialis\u00e9 l\u00e0 dedans les outils automatis\u00e9s existent et acc\u00e9l\u00e8rent le processus.<\/p>\n<p>Toutefois Il est vrai que tous ces proc\u00e9d\u00e9s mis bout \u00e0 bout rendent le piratage assez fastidieux. <strong>Mais pas impossible !!<\/strong> C'est l\u00e0 o\u00f9 je voulais en venir !<\/p>\n<p>Et puis je le rappelle, pour des op\u00e9rations \u00e9v\u00e8nementielles dont le budget est souvent limit\u00e9 pour le dev' justement, en imputer autant sur la s\u00e9curit\u00e9 c'est en prendre au d\u00e9veloppement du jeu et donc risquer d'\u00eatre moins efficace sur sa ludicit\u00e9 et donc sur son cot\u00e9 viral. M\u00eame si l'incentive est l\u00e0, un mauvais jeu aura moins de succ\u00e8s qu'un bon.<\/p>\n<p><em><strong>Bon d'accord, je ne vais pas faire de jeu mais un blog avec des vid\u00e9os virales.<\/strong><\/em><\/p>\n<p>Mais non faut pas dramatiser comme \u00e7a. Et puis vous d\u00e9formez mes propos. Je n'ai aucunement dit qu'il ne fallait pas organiser de jeux \u00e0 lots...mais qu'il ne fallait pas baser la distribution des gains sur le score.<\/p>\n<p>Faites donc un bon tirage au sort des familles parmi tous les participants ! Un huissier c'est tout de suite beaucoup plus dur \u00e0 pirater.<\/p>\n<p>L'autre solution, \u00e9voqu\u00e9e plus haut, est celle de La Brute, o\u00f9 tout est bas\u00e9 sur le serveur. Les actions de l'utilisateur sont envoy\u00e9es au serveur et c'est lui qui calcule le r\u00e9sultat. C'est moins pratique voire improbable pour les jeux d'action, de vitesse ou de r\u00e9flexes mais cela permet un syst\u00e8me de scores plus sain.<\/p>\n<p>\u00c0 vous de voir maintenant mais vous serez pr\u00e9venu.<\/p>\n<p>[*] <em>Pour la petite histoire, je tenais farouchement contre vents et coups de tatannes mon classement de 500e, sur le nombre de joueurs total c'est pas mal, en allant jouer tous les jours lorsque qu'un jour un c\u00e9l\u00e8bre op\u00e9rateur de c\u00e2ble fran\u00e7ais d\u00e9cida de me priver de mon droit fondamental \u00e0 l'information pendant une semaine. J'ai abandonn\u00e9 le jeu apr\u00e8s \u00e7a.<\/em><\/p>\n<p>[**] <em>Je n'ai pas vraiment d'interlocuteur r\u00e9el, et mes autres personnalit\u00e9s sont bien plus malignes que \u00e7a, c'est pour le cot\u00e9 didactique que j'ai invent\u00e9 un dialogue voyons !<\/em><\/p>\n<p>[***] <em>La v\u00e9rit\u00e9, en plus d'\u00eatre ailleurs, est beaucoup plus subtile que \u00e7a, et ces codes restent piratable et de toute mani\u00e8re quelqu'un qui acc\u00e8derait \u00e0 la base serait maitre des donn\u00e9es qui s'y trouvent.<\/em><\/p>\n<p>[****]<em> J'ai pas eu de voiture \u00e0 faire gagner encore. ;)<\/em><\/p>\n<div id=\"_mcePaste\" style=\"position: absolute; left: -10000px; top: 759px; width: 1px; height: 1px; overflow: hidden;\">http:\/\/www.saphirtech.com\/securite.ht<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bin oui pourquoi ? Et puis pourquoi \u00ab\u00a0idiot\u00a0\u00bb apr\u00e8s tout c&rsquo;est une bonne id\u00e9e : \u00e7a augmente le challenge entre les gens, entre amis, bref \u00e7a donne envie de jouer pour donner \u00e0 tout plein d&rsquo;entreprises aux bonnes intentions ses coordonn\u00e9es, qui elles ont le droit \u00e0 un jeu o\u00f9 le score compte : celui [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[25,26,24,28,27,23],"class_list":["post-126","post","type-post","status-publish","format-standard","hentry","category-divers","tag-cryptage","tag-decompilateur","tag-jeu","tag-obfuscateurs","tag-swf","tag-triche"],"_links":{"self":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts\/126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/comments?post=126"}],"version-history":[{"count":6,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts\/126\/revisions"}],"predecessor-version":[{"id":132,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/posts\/126\/revisions\/132"}],"wp:attachment":[{"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/media?parent=126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/categories?post=126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.davel.fr\/techblog\/wp-json\/wp\/v2\/tags?post=126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}