PROJET AUTOBLOG


sebsauvage.net

Site original : sebsauvage.net

⇐ retour index

Bouts de code

Thursday 2 February 2012 à 09:30

Deux petites news concernant quelques bricolages que j'ai fait:

Je vous avais déjà parlé des hashs visuels dont je fournis une version opensource en php: Vizhash_GD (et qu'un internaute a même transposé en Java). J'ai fait une petite mise en application pratique: J'ai modifié le plugin Discussion de DokuWiki pour afficher le Vizhash des adresses IP des internautes qui postent des messages. L'intérêt ?

La mise en application est très simple: Cela s'est résumé, grosso-modo, à ajouter 3 lignes à DokuWiki:

$head .= '< div style="position:relative; float:left; width:16px; height:16px;">';
$head .= '< img src="http://sebsauvage.net/rhaa/../vizhash_gd.php?width=16&height=16&t='.urlencode(sha1('jesuisunsalt'.$comment['user']['id'])).'" width="16" height="16">';
$head .= '< /div>';

Facile, non ? C'est tellement simple que ça ne vaut pas le coup de s'en passer. Vous pouvez voir le résultat, par exemple, dans la discussion sur Shaarli.


Shaarli, tiens justement, dont je viens de sortir une nouvelle version (0.0.37 beta) avec quelques nouveautés:

Lors de la sortie de la version 0.0.32, j'avais décidé d'utiliser un système de templates (RainTPL) pour faciliter la customisation de Shaarli par les internautes. Et bien je suis content de voir que certain se sont bien amusés. Quelques exemples: share.aldarone.fr, lamecarlate.net/links, marienfressinaud.fr/shaarli, sensini42.free.fr/shaarli ou porneia.free.fr/pub/links.


Bottom line: Programmer c'est fun (Si si, je vous assure).

Retour sur Flattr

Tuesday 31 January 2012 à 10:50

Comme promis, et par soucis de transparence, je vous fais un retour sur la mise en place de Flattr sur mon site. Flattr est un système de micro-donation fondé par Peter Sunde. Si le nom ne vous dit rien, c'est aussi lui qui a fondé The Pirate Bay.

Pour la petite histoire, il y avait pendant un temps un petit encart de publicité sur mon site utilisant Google AdSense. Cela me rapportait une centaine d'euros par mois (pas mal !). Et puis du jour au lendemain, Google m'a jeté (d'ailleurs je ne suis pas le seul). En soit ce n'est pas grave: Je ne gagne pas ma vie avec mon site.

Suite à cela, vous avez été nombreux à me demander de mette un bouton Flattr sur mon site. J'ai au début mis un bouton général pour le site, et j'ai ensuite (comme vous me l'avez suggéré) mis un bouton individuel par article (à parti du mois de septembre 2011).

Voici mes revenus Flattr, mois par mois:

MoisSomme
Juillet 20116,62€
Août 201140,86€
Septembre 201127,12€
Octobre 201122,99€
Novembre 201159,64€
Décembre 201111,42€
Janvier 201215,57€

Soit un total de 184,22€. Je n'ai pas retiré cette somme (il faut un compte MoneyBookers ou PayPal, et je me refuse à cautionner ce dernier en m'y inscrivant). Et puis j'ai l'intention de donner à d'autres sites que j'apprécie.

Merci de vos flattrages, et merci de votre confiance.


PS: Inutile de m'envoyer l'article de rom1v. Non, Flattr ne prélève pas 10% à chaque donation, mais seulement lorsque la somme est retirée de Flattr. Ah flûte, il me semblait avoir lu ça, mais les termes de services continuent d'afficher ce prélèvement de 10%.

Une nouvelle astuce des logiciels malveillants pour éviter la détection

Monday 30 January 2012 à 15:43

Je vous ai déjà parlé de malwares très évolués comme Conficker ou TDL4. Le problème majeur de ces logiciels malveillants est que - avant infection - leur signature peut être détectée par les antivirus. Comment implanter le code malveillant en contournant la détection ?

Souvenez-vous des armes démontables dans les vieux films d'espionnage: Chaque pièce prise séparément paraît anodine, sans danger, et n'attire pas l'attention. Mais combinées elles forment une arme. Et bien une nouvelle tendance tout à fait analogique s'amorce chez les auteurs de chevaux de Troie, comme constaté de manière indépendante chez Microsoft et F-Secure.


Dans la plupart des scénarios d'infection, un petit bout de programme (appelé le "downloader") est en charge de télécharger et exécuter le code malveillant lui-même (le cheval de Troie). Les antivirus détectent et interceptent alors soit le téléchargement, soit le lancement du code malveillant. Game over.

Mais Microsoft a découvert un nouveau type de downloader: Ce dernier télécharge une page HTML faisant la publicité d'un restaurant asiatique. Le downloader lui-même n'étant pas malveillant, les antivirus ne le bloquent pas. Quand à la page HTML, elle paraît tout à fait anodine.

Sauf que le downloader combine les octets de la page HTML avec son propre code machine (dans son propre processus), ce qui le transforme en code malveillant. Bingo ! L'antivirus n'a intercepté ni le téléchargement (puisque qu'anodin pour lui), ni le lancement du code malveillant (puisque le downloader n'a pas lancé de nouveau processus: il continue son exécution avec le code modifié).

Brillant.


De la même manière, F-Secure est tombé sur un malware sur Android utilisant une technique similaire: En principe, quand vous avez un exécutable Android, vous avez accès à son contenu: C'est du code machine Dalvik (une machine virtuelle similaire à celle de Java). Il est donc possible d'examiner le code machine pour y détecter du code malveillant. C'est d'ailleurs ce que font certains antivirus pour Android: Ils analysent le code pour trouver, par exemple, des instructions envoyant des SMS payant.

Un auteur de logiciel malveillant a trouvé une astuce: Son programme récupère quelques octets présents dans l'entête du fichier PNG utilisé pour l'icône de l'application et les combine avec son propre code. Le résultat est un code machine qui envoie des SMS. Gagné ! Les antivirus n'ont rien vu.


On croirait un mauvais remake d'un film de Batman: Différents fichiers binaires inoffensifs, sur internet, peuvent devenir dangereux quand ils sont combinés. Et les antivirus sont bien en mal de détecter et bloquer cela: Pour des questions de performances, ils n'examinent pas toutes les opérations mémoire effectuées par les applications. Ils ne font que du cas par cas: Bloquer les noms de domaines identifiées comme distribuant des fichier malveillants. J'attends le moment où ces bouts de code recombinants seront distribué par Amazon S3, Pastbin.com ou le cache de Google: on va rigoler quand il faudra les bloquer.

Imaginez maintenant qu'un auteur décide de créer un code qui devient malveillant une fois combiné avec des logiciels "sains" comme Flash, Firefox ou WindowsMediaPlayer. C'est facile: Une simple opération binaire XOR le permet. Ou même utiliser ces exécutables sains et très répandus comme clés de déchiffrement du malware. Bon courage pour les détecter.

L'avenir est brillant pour les auteurs de codes malveillants, et les éditeurs de logiciels sont trop content de nous fourguer leur "AppStore" comme solution miracle. Pfeu.

Ce que Google sait de vous

Monday 30 January 2012 à 14:44

Je rebondis sur un article de Korben: Depuis que Google a unifié sont identification (autrement dit: Vous trace partout), ils ont même eu le culot de déterminer automatiquement votre âge, votre sexe et vos centres d'intérêts.


Je suis allé voir aussi: Google me dit ne rien savoir de moi   \o/

Merci à Ghostery et AdBlockPlus ? Sûrement, puisque grâce à eux Google ne peut plus suivre mes déplacements sur les sites web. Merci aussi à DuckDuckGo que j'utilise à 95% (Google n'est donc plus au courant de la plupart de mes recherches). Arg... il reste mon mail chez eux que je n'ai toujours pas migré. Pas bien.

En tous cas, on est fixé: Google a abandonné son slogan "Don't be evil", et pour une seule raison: Ses profits.

Si vous avez un compte Google, pensez à désactiver l'option d'affichage des annonces en fonction de vos centres d'intérêt: https://www.google.com/settings/ads/onweb/, et installez Ghostery et AdBlockPlus.

1,7 est différent de 1,7 ?

Friday 27 January 2012 à 13:25

Je reprend ici un petit article technique que j'avais écrit en anglais pour ma page de snippets Python.

Il sert juste à illustrer le fait que certaines notions en informatique ne sont pas du tout intuitives, et qu'il est utile d'apprendre tout cela. Le domaine du développement logiciel est plein de petits chausses-trappes de ce genre, et voir des développeurs se prendre les pieds dans le tapis me fait sourire (pas méchamment, je vous l'assure).


Je vais ici parler d'opérations élémentaires: Additionner et comparer des nombres. Élémentaires, mais pas évidentes pour autant. Cela a l'air très simple, mais rien qu'à ce niveau, il y a de quoi rendre perplexe le développeur débutant. J'ai choisi ici d'illustrer avec des exemples en langage Python, mais ce problème se reproduit dans la plupart les langages.


Commençons par créer deux variables (en Python):

a = 1.7
b = 0.9 + 0.8

En principe, a et b contiennent la même valeur, on est bien d'accord ? Affichons cela pour vérifier:

print a
print b
Ce qui affiche:
1.7
1.7

Bien. Maintenant comparons a et b:

if a == b:
    print "a et b sont égaux."
else:
    print "a et b sont différents !"

En principe, il doit afficher "a et b sont égaux", n'est-ce pas ? Faux !

a et b sont différents !

Comment est-ce possible ? Comment 1,7 peut-il être différent de 1,7 ?


Il y a deux choses qui sont à l'origine de cette incompréhension et qu'il fondamentale de connaître:

A l'instant même où vous faites a=1.7, la variable a ne contient pas 1,7, mais une approximation binaire de la valeur décimale 1,7, c'est à dire quelque chose du genre: 1.10110011001100110011001100110011... (Avec les bits précédents, il s'agit de la valeur 1.699999999953434)

En binaire, on peut facilement stocker les fractions dont le diviseur est une puissance de deux. Quelques exemples:
Mais dans tous les autres cas, l'ordinateur est bien en mal de stocker la valeur. Vous pouvez tester en ligne avec ce petit convertisseur. L'ordinateur fait donc deux approximations:

De la même manière, quand vous affichez une date:

print datetime.datetime.now()
2012-01-27 21:25:20.904000

Il faut bien garder à l'esprit que "2012-01-27 21:25:20.904000" n'est pas la date: C'est une représentation textuelle d'une donnée codée en binaire dans la mémoire de l'ordinateur. Ce que vous voyez à l'écran n'est pas forcément exactement ce qu'il y a dans la mémoire de l'ordinateur.

Bien sûr, il existe des bibliothèques mathématiques et des codages binaires qui permettent de stocker correctement des nombres décimaux, mais cela fait du travail en plus pour le processeur.

Alors comment comparer nos variables a et b précédentes sans recourir à ces codages spéciaux ? Soit en considérant que les valeurs sont égales si elles sont très proches:

if abs(a-b) < 0.00001:
    print "a et b sont égaux."
else:
    print "a et b sont différents !"

ou même en les convertissant en chaînes de caractères:

if str(a) == str(b):
    print "a et b sont égaux."
else:
    print "a et b sont différents !"


Et oui, l'ordinateur a ses limites, et même quand on développe dans un langage "haut niveau", il est bon de les connaître. ;-)


EDIT: Quelques précisions (signalées par Benjamin et Kévin):

EDIT: Jean-Francois me fait remarquer que je me suis un peu raté sur l'IEEE-754: C'est également un standard à virgule flottante, donc soumis aux mêmes problèmes d'imprécision. La différence est que l'IEEE-754 définit clairement des règles (comme les méthodes d'arrondi à respecter), ce qui permet d'avoir un standard stable et d'avoir les mêmes comportements partout. Pour éviter ces problèmes d'imprécision, il faut recourir à d'autres encodages de nombres, généralement sous forme de bibliothèque (comme GMP ou CLN).