mercredi 9 décembre 2009

Windows Prefetch

Je mentionne rapidement que j'ai mis en ligne un outil perl pour faire la décomposition analytique des fichiers Prefetch [1][2]. Mon travail dérive de deux sources : Y. Khatri et H. Carvey.

Le code est accessible via mon dépôt.

vendredi 27 novembre 2009

Québec : Plan de lutte à l'évasion fiscale

Le Québec est devenu, avec les années, l'une des références mondiale par ses travaux sur les camoufleurs de ventes, aussi connus sous le nom "zapper", et ses efforts pour lutter contre l'évasion fiscale :

[...] the Canadian province of Quebec may be the world leader in prosecuting zapper cases. Since 1997, zappers have figured in more than 230 investigations, according to the tax collecting body Revenu Québec[...] - nytimes.

Le 9 novembre 2009, lors de la rencontre annuelle des restaurateurs du Québec, Revenu Québec (RQ) à fait une présentation de son plan de luttre contre l'évasion fiscale dans le milieu de la restauration. À elle seul, la province de Québec perd plus de 400 millions de dollard chaque année dans le milieu de la restauration et ce, uniquement avec les infractions aux lois québécoises.

Le gourvenement du Québec travail depuis plus de dix ans sur la problématique des camoufleurs de ventes (zappeur). Le Module d'enregistrement des ventes (MEV) est le produit de ces années de travail. La mission était simple mais colossale : démontrer qu'il y avait bien une problématique de zappeur au Québec et surtout, de démontrer son ampleur.

Trop de gens croient que le MEV n'est qu'une solution technologique et que, par le fait même, elle sera nul doute contourné. Le MEV n'est qu'une des 4 facettes d'une solution beaucoup plus complète.

Facette 1 - Modification de la Loi
Un des problèmes rencontré par RQ est que personne n'est tenu de présenter une facture à un client. Il est donc difficile de balancer les livres comtables avec les ventes réelles ou d'effectuer quelconques travaux de vérification. Bien sûr, la Loi oblige une tenu de livres adéquoite mais les pénalités sont moindres et ne dissuadent en rien les fradeurs. Quand on pense que plus de la moitier des restaurateurs délinquant cachent en moyenne 1/3 de leur ventes, une amande de 2000$ pour mauvaise tenu de livres semble ridicule.

La solution, modifier la Loi pour :
- obliger la présentation d'une facture au client (à compter de septembre 2010);
- obliger de produire la facture à partir d'un MEV (à compter de novembre 2011);
- obligation de fournir les sommaires périodiques des ventes de tous les MEV utilisés dans un établissement;
- augmenter les peines pour la mauvaise tenu de livres, l'omission de présenter une facture, la présentation d'une facture non produite par un MEV, etc.

Facette 2 - Module d'enregistrement des ventes (MEV)
Qu'est-ce qu'un MEV?
Réponse courte : voyons le comme la boîte noir d'un restaurant.
Réponse longue :
C'est un micro-ordinateur qui, une fois branché à une caisse électronique ou à un système de points de vente, reçoit les données relatives aux différentes transactions (additions, reçus de caisse, notes de crédit, etc.) et enregistre dans une mémoire sécurisée des informations relatives à celles-ci, comme les ventes et les taxes. Une fois l'enregistrement complété, le MEV produit une signature numérique et transmet à l'imprimante les informations nécessaires pour l'impression d'une facture, y compris la signature numérique (différente d'un module à l'autre). Il peut conserver les données enregistrées pour une période d'environ 7 ans et permet au restaurateur, ainsi qu'au personnel de RQ, de consulter les données enregistrées.

Le MEV à un second avantage : il permet d'uniformiser le contenu des registres. La quantité de systèmes de point de ventes (SPV) et de caisses enregistreuses (CE) est tout simplement haurisante. Non seulement il existe plus d'une centaine de SPV et de CE, mais le format dans lequel est contenu les informations des registres diffère souvant d'une version à l'autre.

Facette 3 - Inspections
Probablement l'une des facettes les plus importantes de la solution mis en place par RQ. L'inspection à été essentielle aux travaux effectués dans la recherche sur les zappeurs depuis les dix dernières années et son rôle ne cesse de croître avec l'arrivé du MEV. Le gourvenement augmentera ses effectifs d'inspecteurs et, par le fait même, le nombre de restaurants vérifiés par année.

Facette 4 - Compagne d'information et de sensibilisation
Si chaque client d'un restaurant exige une facture, s'assure qu'elle est bien conforme et, idéalement, paie avec une carte de crédit; l'évasion fiscale dans la restaration ne fera que diminuer. C'est pourquoi le Gouvernement du Québec lancera une campagne d'information et de sensibilisation, afin que tous les contribuables, actuels et futures, pourront être en mesure que "détecter" une fraude.


Il faut donc voir la solution mise en place par le gouvernement dans son ensemble et non pas de façon sectaire. L'évasion fiscale est un problème majeur et est un facteur déterminant dans l'environnement de surimpôsition que l'on vit présentement au Québec. Les taxes, ainsi que les revenus, non déclarés privent le gouvernement de plusieurs centaines de millions de dollard chaque année, réduisant ainsi les investissements dans les services publics et le paiement de la dette; crées de la concurrence déloyale et l'iniquité fiscale; favorisent l'augmentation du travail au noir et l'économie souterraine. Naturellement, celà entraine une augmentation des taux d'impôsitions et relance le cercle vicieux de la sous-déclaration.

Richard Thompson Ainsworth
M. Ainsworth est un professeur de droit spécialisé dans les impôts à l'Université de Boston. Il a récement organisé une conférence invitant plusieurs organisations à travers le monde à présenter leurs approches pour lutter contre l'évasion fiscale et Revenu Québec était présent comme conférencier. M. Ainsworth a aussi écrit plusieurs articles intéressants concernant les camoufleurs de ventes, dont certains parle du Gouvernement du Québec et de ses travaux sur les zappeurs. En voici quelques uns :
Tax Fraud in the Sales Tax: Zappers -- What are They? How Can Puerto Rico Block Them?
Quebec's Module D'Enregistrement Des Ventes (MEV): Fighting the Zapper, Phantomware and Tax Fraud with Technology
Electronic Tax Fraud -- Are There "Sales Zappers" in Japan
Zappers & Phantom-Ware at the FTA: Are They Listening Now?

mercredi 25 novembre 2009

Invite de commandes

Dans mon "post" intitulé "Oneline" du mois, j'utilisais les commandes find et perl afin de remplacer massivement un "pattern" sans avoir à le faire fichiers par fichiers. Mais, comme vous avez surement deviné, c'était sous linux. Alors, comment faire sous Windows.

Je n'avais jamais eu à faire du remplacement massif d'envergure sous Windows (ni sous linux d'ailleur) alors je me contentais de Notepad++. Il est quand même capable de prendre une cinquantaine de fichiers et plus. Mais aujourd'hui, j'ai eu à travailler sur plus de 11 000 fichiers et j'ai eu trop peur d'essayer de les charger tous en même dans np++. J'ai donc ressorti ma bible de MS-DOS 6.0 et j'en ai profité pour mettre en signet la page MSDOS de ComputerHope.com.

Voici donc ma très humble "oneliner" pour remplacement massif sous Windows :

FOR /F "usebackq" %i IN (`DIR . /B/A-D`) DO perl -i.orig -pe "s/\x22//g" %i

Remarquez que j'ai mis en rouge les "double-quotes". Vous ne pouvez pas mettre des "single-quotes" comme sous linux; ça ne fonctionnera point. Il semblerais que sous Windows, Perl ne peu faire du "inplace edit" ou du moins, la version que j'ai d'installé. C'est pourquoi je dois spécifier une extension à l'option -i.

J'en profite au passage pour souligner, à mes très chers amateurs de "oneliner", les deux sites suivants :  
Command Line Kung Fu - j'adore la petite compétition entre les windowsien et les linuxien de ce blog
Command Line Fu - dépôt massif de ligne de commandes

dimanche 8 novembre 2009

"Oneliner" du mois

Voici les "onliner" que j'ai utilisé à profusion ce mois-ci:

find . -type f -print0 | xargs -0 grep -n 'RarePatternGoesHere'

find . -type f -name "*.ext" | xargs -0 perl -i -pe 's/oldpattern/newpattern/'

vendredi 29 mai 2009

Partitions TrueCrypt

J'ai eu récemment à travailler sur un cas où le propriétaire d'un ordinateur portable avait crypté la partition système et une seconde partition de travail avec TrueCrypt.

Pour un raison encore obscure à mes yeux, le "bootloader" TrueCrypt était corrompu. Le propriétaire n'arrivait plus à récupérer ses fichiers. Il a tenté de restaurer le "bootloader" avec le CD de recouvrement de TrueCrypt. L'opération semblait avoir bien réussie mais les partitions avaient disparu.

J'ai donc fait une image du poste et après quelques recherches sur Wikipédia, ainsi que plusieurs essais et erreurs avec mon nouvel éditeur Hexadécimal préféré (HDD Hex Editor Neo), j'ai finalement réussie à recréer la table de partitions. J'ai ouvert l'images avec FTK Imager, extrait les deux partitions et je l'ai est ouvert avec TrueCrypt sur mon poste en tant que fichiers cryptés. Il ne restait plus qu'à copier les fichiers qu'il voulait conserver et de reconfigurer son ordinateur portable.

mercredi 15 avril 2009

disktype et afflib

J'ai découvert disktype, par Christoph Pfisterer, il y a quelques mois en dérivant sur le web à la recherche d'outils relié à l'informatique légale sous linux. J'étais à la recherche d'information sur libewf et je suis tombé sur une ­ "patch", créer par David Loveall, permetant d'utilise des images EWF avec disktype. J'ai donc voulu ajouter le support pour afflib à disktype.

Voici donc ma contribution:

---
+++ aff.c 2009-01-07 12:59:06.000000000 -0400
@@ -0,0 +1,128 @@
+/*
+ * aff.c
+ * Layered data source for AFF images via afflib.
+ * For use with disktype, Copyright (c) 2003 Christoph Pfisterer
+ *
+ * Copyright (c) 2008 Jean-Francois Gingras
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "global.h"
+
+#ifdef USE_AFFLIB
+#include // necessaire pour uint64_t
+#include
+
+/*
+ * types
+ */
+
+typedef struct aff_source {
+ SOURCE c;
+ AFFILE *a;
+} AFF_SOURCE;
+
+/*
+ * helper functions
+ */
+
+static SOURCE *init_aff_source(char * const filename);
+static int read_block_aff(SOURCE *s, u8 pos, void *buf);
+static void close_aff(SOURCE *s);
+
+/*
+ * aff analyzer
+ */
+
+void analyze_aff(char * const filename)
+{
+ SOURCE *s;
+
+ print_line(0, "--- %s", filename);
+
+ /* create and analyze wrapped source */
+ s = init_aff_source(filename);
+ analyze_source(s, 1);
+ close_source(s);
+}
+
+/*
+ * initialize the aff source
+ */
+
+static SOURCE *init_aff_source(char * const filename)
+{
+ AFF_SOURCE *src;
+
+ src = (AFF_SOURCE *)malloc(sizeof(AFF_SOURCE));
+ if (src == NULL)
+ bailout("Out of memory");
+ memset(src, 0, sizeof(AFF_SOURCE));
+
+ src->a = af_open(filename, O_RDONLY, 0);
+ if (src->a == NULL)
+ bailout("Can't open AFF file");
+
+ src->c.size_known = 1;
+
+ if( ( src->c.size = af_get_imagesize( src->a ) ) == 0 )
+ bailout("Unable to get media size of AFF file");
+ if( af_get_seg( src->a, AF_SECTORSIZE, ( unsigned long * ) &( src->c.blocksize ), 0, 0 ) != 0 )
+ bailout("Unable to get sector size of AFF file");
+
+ src->c.read_block = read_block_aff;
+ src->c.close = close_aff;
+
+ return (SOURCE *)src;
+}
+
+/*
+ * raw read
+ */
+
+static int read_block_aff(SOURCE *s, u8 pos, void *buf)
+{
+ AFF_SOURCE *as = (AFF_SOURCE *)s;
+
+ if( af_seek( as->a, pos, SEEK_SET ) != -1 )
+ {
+ if( af_read( as->a, buf, as->c.blocksize ) != -1 ) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+/*
+ * cleanup
+ */
+
+static void close_aff(SOURCE *s)
+{
+ AFF_SOURCE *as = (AFF_SOURCE *)s;
+
+ af_close(as->a);
+}
+
+#endif
+/* EOF */
--- main.c 2003-05-24 13:35:44.000000000 -0400
+++ main.c 2009-04-15 21:58:28.000000000 -0400
@@ -24,22 +24,31 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

#include "global.h"

+#ifdef USE_AFFLIB
+#include
+#include // af_identify_file_type()
+#endif
+
#ifdef USE_MACOS_TYPE
#include
#endif

/*
* local functions
*/

static void analyze_file(const char *filename);
static void print_kind(int filekind, u8 size, int size_known);
+
+#ifdef USE_AFFLIB
+void analyze_aff(char * const filename);
+#endif

#ifdef USE_MACOS_TYPE
static void show_macos_type(const char *filename);
#endif

/*
@@ -56,13 +65,23 @@
return 1;
}

/* loop over filenames */
print_line(0, "");
for (i = 1; i < argc; i++) {
- analyze_file(argv[i]);
+#ifdef USE_AFFLIB
+ if( af_identify_file_type( argv[i], 0 ) == 1 ) {
+ print_line(0, "AFF image");
+ analyze_aff( argv[i] );
+ }
+ else {
+#endif
+ analyze_file(argv[i]);
+#ifdef USE_AFFLIB
+ }
+#endif
print_line(0, "");
}

return 0;
}

--- Makefile 2006-01-12 13:55:16.000000000 -0400
+++ Makefile 2009-04-15 21:57:26.000000000 -0400
@@ -6,13 +6,13 @@
CC = gcc

OBJS = main.o lib.o \
buffer.o file.o cdaccess.o cdimage.o vpc.o compressed.o \
detect.o apple.o amiga.o atari.o dos.o cdrom.o \
linux.o unix.o beos.o archives.o \
- udf.o blank.o cloop.o
+ udf.o blank.o cloop.o aff.o

TARGET = disktype

CPPFLAGS = -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
CFLAGS = -Wall
LDFLAGS =
@@ -40,12 +40,19 @@
CC += -noixemul
CFLAGS += -m68020-60 -msmall-code
LDFLAGS += -m68020-60
endif
endif

+ifneq ($(AFFLIB),)
+ CPPFLAGS += -DUSE_AFFLIB
+ CFLAGS += -I/usr/local/include/afflib
+ LDFLAGS += -L/usr/local/lib
+ LIBS += -lafflib
+endif
+
# real making

all: $(TARGET)

$(TARGET): $(OBJS)
$(CC) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS)
--- Seedfile 2006-01-12 13:55:16.000000000 -0400
+++ Seedfile 2009-04-15 21:58:38.000000000 -0400
@@ -4,12 +4,12 @@

binary disktype {
source main.c lib.c
buffer.c file.c cdaccess.c cdimage.c vpc.c compressed.c
detect.c apple.c amiga.c atari.c dos.c cdrom.c
linux.c unix.c beos.c archives.c
- udf.c blank.c cloop.c;
+ udf.c blank.c cloop.c aff.c;

cflags "-D_LARGEFILE_SOURCE" "-D_FILE_OFFSET_BITS=64";
}

manpage disktype.1;

mardi 14 avril 2009

Introduction

Je pense que le titre du blogue en dit suffisamment. Quoi que, je n'ai pas su avant 1 an et demi que "computer forensic" se traduisait en "informatique légale"...

Je sais qu'il existe beaucoup de blogue sur le domaine, vous n'avez qu'à regarder la liste de ceux que je suis. Je ne connais aucun blogue francophone qui traite activement du sujet alors je me lance. Oh!, si vous connaissez des blogues francophone, donnez moi le ou les liens dans un commentaire.

Sur ce...