Programmation

Dynastie 0.2

Monday, 28 April 2014
|
Écrit par
Grégory Soutadé

Logo Dynastie

Voilà un peu plus d'un an que la première version de Dynastie est sortie (et plus d'un an et demi qu'elle est fonctionnelle). La version 0.2 a été crée dans la foulée suite aux remarques (notamment de Denis Bernard), mais elle manquait de substance (juste bon à faire une 0.1.1). Il n'y a pas eu de révolution depuis, mais une suite d'améliorations :

  • Le support de la syntaxe Markdown
  • Les templates "base" supportent l'inclusion de multiples blocs
  • Simplification de l'installation
  • Les marqueurs "dyn:post _ url" et "dyn:post _ full_url" dans la directive "replace", ainsi que "#comment _ number" dans les commentaires
  • Générateurs "Tous les articles" et "Les joies du code" (à partir de la sortie d'un script perl).
  • La recherche d'un article dans l'interface d'administration
  • Quelques bugs corrigés (trim des commentaires, double quotes dans les tag metas, retours à la ligne dans les commentaires).

Contrairement à ma première idée, Markdown fait son entrée dans la place (avec quelques extensions persos). En effet, je me suis rendu compte que la syntaxe épurée était suffisante pour 90% des articles qui n'ont pas besoin de mise en page "complexe". Néanmoins, on y perd au passage le support de la coloration syntaxique.

L'ensemble des fonctionnalités supportées est relativement stable, donc, à priori, peu d'évolutions sont à prévoir dans le futur.

binstats : Basic statistics on binary code

Monday, 21 April 2014
|
Écrit par
Grégory Soutadé

As you may know, my work consists in developing software for embedded devices. We usually says that an embedded device is a peace of hardware with low resources (memory, CPU, flash...) taking in example phones. Nowaday, smartphones have only core software that is really embedded, the rest is sometimes more powerful than the computer I wrote this post. But, don't care, I don't work in telephony. Here (at Neotion), we do really embedded software, with chipsets clocked from 100Mhz to 200Mhz, with available RAM from 1MB to 32MB, and flash up to 8MB.

After years of developments, we can have one or more software that became too big to fit in its allocated flash partition. So, to find the guilty functions, I wrote a simple PERL script (~130 lines) that will count number of instructions for each function from objdump's output (with -ld switch) and displays statistics per function and per file (it doesn't focus on .data or .bss section). To correctly use the script, you have to compile your program with -ggdb option (to have line numbers and file paths), but you can also set optimisations (-OX).

Example with main.c

#include <stdio.h> int function1(int a, int b) { return a*b+4; } int function2(int a, int b, char* c) { printf("Result %d*%d+4 = %s\n", a, b, c); return 0; } int main(int argc, char** argv) { char buf[32]; sprintf(buf, "%d", function1(5, 4)); function2(5, 4, buf); }
> gcc main.c -ggdb -o test > objdump -ld test > test.txt > ./binstats.pl --in test.txt Total instructions 63 63 (100.00%) /home/soutade/main.c 38 main 16 function2 9 function1

There are also options to filter small files, small functions and paths that helps to focus on big ones. Have fun !

gPass v0.4

Monday, 14 April 2014
|
Écrit par
Grégory Soutadé

Logo gPass

L'intégration dans la liste des addons officiels de Firefox a été longue et difficile, et après deux versions (depuis la 0.2), gPass a enfin été accepté ! Le tag vient un peu tard puisque cela fait presque un mois qu'il n'y a plus de restrictions sur le site de Mozilla, mais il y a eu quelques petites améliorations concernant le client web. Désormais tout semble stable.

Cette intégration donne une bonne visibilité à l'addon avec une trentaine d'utilisateurs quotidiens (je ne suis pas inclus dans ces statistiques). Si cela peut paraître dérisoire, il n'en reste pas moins mon projet le plus largement déployé ! Bien sûr, c'est un peu frustrant de ne pas savoir où sont les serveurs hôtes et leurs nombres, mais c'est le but ! Ma grande satisfaction est que gPass est utilisé "partout" dans le monde.

À priori il n'y aura pas d'évolutions hors demandes particulières (pas de retours pour le moment) ou compatibilité avec Firefox, car le projet est "fini", c'est à dire qu'il fait ce qu'on lui demande (et il le fait plutôt bien).

Silent Night

Tuesday, 18 February 2014
|
Écrit par
Grégory Soutadé

Logo Silent Night

Voilà ma première application Android : Silent Night*. Enfin presque... En réalité, je n'ai fais que reprendre une application déjà existante pour l'améliorer. Et c'est toute la force du logiciel libre : pouvoir analyser, adapter, corriger et améliorer l'existant pour nos propres besoins. Le cas de Silent Night est typique : l'application n'est plus compatible avec la dernière version d'Android, l'auteur n'a pas envie de s'y replonger. Pourtant, c'est une application simple, efficace et qui ne demande pas de lire vos SMS... Ni une, ni deux, je dégaine eclipse et met à jour l'application.

Même sans sortie officielle, je m'étais déjà penché sur le SDK d'Android. Personnellement, je trouve que c'est du bon gros bricolage. J'avoue n'avoir lu les tutoriaux que rapidement, mais j'ai quand même l'habitude de réaliser des applications pour PC. Les concepts pour mobile sont peut être différents, néanmoins, je trouve que l'API est une horreur à prendre en main (même si la documentation est très jolie). Rien ne semble clair (Intent, Fragment, Services...), surtout quand on rajoute la lourdeur des constructeurs à la Java. Pire encore : les applications sont incompatibles d'une version sur l'autre ! Le tout saupoudré d'un eclipse bien lourd (avec des bibliothèques qui ne sont compilées qu'en 32 bits !).

En 9 ans, Google n'a pas su redresser la barre pour proposer quelque chose de propre. Comme Microsoft avec Windows, le produit est trop répandu sur le marché pour changer radicalement. Même si le système en lui même est "beau", stable et performant (à grand coup d'optimisations), créer une application est un vrai calvaire (pour un débutant du moins). De plus, malgré qu'il soit open source, c'est un système assez fermé où l'utilisateur est régulièrement piégé entre le tout Google et le racket d'informations de la part des applications (lire vos SMS et accéder à Facebook est absolument indispensable pour une application qui allume le flash de l'appareil photo !). À ce propos, je ne peux que conseiller d'installer f-droid qui ne contient que des applications open source (comme Silent Night). Elles ne sont pas forcément de meilleure qualité, mais au moins on évite d'alimenter un carnet d'informations personnelles qui sera revendu plus tard par l'éditeur.

Mais que fait la concurrence ?

Propriétaires

  • iOS : tout le monde connait. C'est du Apple, fermé au possible.
  • WindowsPhone : peu utilisé, mais l'interface semble particulièrement bien adapté (et n'est pas une simple copie du premier).
  • OS 10.2 de BlackBerry : il faut un BlackBerry.

Libres

  • Firefox OS : comme ChromeOS, il est basé autour d'un navigateur. L'idée est intéressante, mais limité aux téléphones bas de gamme (pour le moment?). Faire des applications en HTML5/JavaScript, ce n'est pas trop mon truc.
  • Sailfish OS : Peut être le meilleur futur concurrent d'Android. Enfin un SDK en Qt ! Mais pour le moment, rien ne pointe à l'horizon.
  • Ubuntu Touch : Grosse déception pour ce dernier. Les performances et la qualité générale sont décevantes (test de novembre). Il y a eu beaucoup de promesses et pas grand chose au final...

En attendant, il y a Android... Jusqu'à ce, qu'un jour, peut être, Samsung décide de migrer l'ensemble de ses appareils vers un autre système... Le seul avantage, est que la réalisation d'applications sur mobile donne à manger à plein de développeurs.

*Silent Night permet de couper le son et/ou de passer en mode avion pendant une période donnée (configurable). C'est le mode avion qui était cassé sur les versions récentes d'Android. Pour l'activer, il faudra quand même avoir un téléphone rooté (merci Google).

Lua post dissector for Wireshark

Wednesday, 27 November 2013
|
Écrit par
Grégory Soutadé

Logo Wireshark

Wireshark (previously Ethereal) is the best open source protocol dissector/analyzer. You can analyze an incredible amount of protocols, not only Internet ones, but every stream based protocols. Moreover you can add your own filters/dissectors written either in C or in Lua. Nevertheless, the documentation on the net concerning Lua dissectors is light and sparse. It's been hard for me to make something that works even if it's, at the end, not really complicated. I'll try to explain the basis of Lua dissectors.

1) Installation

You need to have a wireshark that supports Lua support (wireshark -v). After that, create or edit ~/.wireshark/init.lua. To load a new plugin, just type

dofile("mydissector.lua")

Create the new file ~/.wireshark/mydissector.lua

2) Post Dissector

There are three types of dissectors :

  • Dissector : you add your own protocol
  • Chained dissector : you add new fields to an existing protocol
  • Post dissector : you interact after all packets has been parsed

An example for each of one can be found here. I'll describe a post dissector, but other types of dissectors has pretty the same format.

Tip 1
If you want to display someting on the console, just do

print(something)


Tip 2
If the base array is not defined, add this to ~/.wireshark/init.lua

-- Display Bases base = { ["NONE"] = 0, ["DEC"] = 1, ["HEX"] = 2, ["OCT"] = 3, ["DEC_HEX"] = 4, ["HEX_DEC"] = 5, }

First, you need to define your protocol : Proto(<internal name>, <displayed name>)

p_dummyproto = Proto("dummyproto","DummyProto")


Then, define your fields : ProtoField.TYPE(<internal name>, <displayed name>, [base], [values], [mask])
TYPE are defined here

-- Simple field without value local f_X = ProtoField.uint16("dummyproto.f_X","Field X") -- Simple field displayed in hex format local f_Y = ProtoField.uint8("dummyproto.f_Y","Field Y", base.HEX) -- Field with precomputed values and bitfield local VALS_ZZ = {[0] = "Single", [1] = "Dual"} local f_Z = ProtoField.uint8("dummyproto.f_Z","Field Z", base.HEX, VALS_ZZ, 0x3)

Third step is to register each field

p_dummyproto.fields = {f_X, f_Y, f_Z}


After that, the big part : protocol dissection. Fields are organized as a tree. You have to parse each byte (or range of bytes) in the given buffer and append your fields. Be careful : objects returned by :add function has userdata type and cannot be directly manipulated.

function p_dummyproto.dissector(buffer,pinfo,tree) -- Access to another field local f_udp_port = Field.new("udp.port") -- If it exists and has the right value if f_udp_port and tostring(f_udp_port) == tostring(5555) then -- Add our protocol dissection with data in buffer[17, 17+14] local subtree = tree:add(p_dummyproto, buffer(17,14)) -- Add a subtree to our root for the first two bytes local t = subtree:add(f_X, buffer(17, 2)) -- Add a sub subtree local t2 = t:add(f_Y, buffer(17, 1)) -- Parse sub data parse_data(t, buffer, 18) end end function parse_data(tree, buffer, start) -- Wireshark integrate bitop from luajit http://bitop.luajit.org/ field_1 = buffer(start, 1):uint() field_1 = bit.band(field_1, 0x3) -- You can also append free text information to current field if field_1 < 16 then tree:append_text(" field information") end end

Finally register your post dissector

register_postdissector(p_dummyproto)


A complete example can be found here. It's a full reimplementation of ARP protocol dissector in Lua.