Assombrissement/Obfuscation de code. Comment ? Quels Outils ? - Divers - Programmation
Marsh Posté le 02-08-2005 à 16:59:11
coder en brainfuck
Marsh Posté le 02-08-2005 à 17:03:30
Citation : voir même libre |
mdr
le but est d'assombrir le code et tu connais exactement l'algorithme qui l'a transformé ...
Marsh Posté le 02-08-2005 à 17:04:13
en plus c'est pas vraiment l'esprit "libre" de vouloir cacher son code ...
Marsh Posté le 02-08-2005 à 17:05:45
Taz a écrit : tiens c'est bien comme traduction assombrissement ! |
Je crois savoir d'où ca vient...
http://fr.wikipedia.org/wiki/Code_ [...] 3%A9trable
Marsh Posté le 02-08-2005 à 17:27:54
Cette année en cours j ai codé un projet java qui consiste a obfusquer des programmes java justement.
Si c est un domaine qui t interesse je t invite a te renseigner sur la lib ASM http://asm.objectweb.org/ .
C est une lib tres complete developpée par un frenchie.
Pour info creer un obfuscator n'est pas trivial (surtout quand je vois le temps passé sur ce projet et ce qu il arrive a faire au final )
Marsh Posté le 02-08-2005 à 19:01:41
mcjoedassin a écrit :
|
t'as tout compris toi
et le fait que l'algo d'assombrissement soit libre n'en fait pas un mauvais assombrisseur. J'ai pas envie de te sortir tout un baratin sur les ambiguïté de la décompilation mais bon bref c'est vrai. Même en reversant le dit algo (en admettant que tu y arrives) t'iras pas loin: soit tu inverses mon appli à la main en inversant l'algo et tu mets 10 ans, soit tu automatises et tu es baisé parcequ'il va apparaitre des ambiguité qu'un process automatique peut pas éviter avec son cerveau de mouche.
les critiques à deux balles et les "lol" moisis des gens qui prennent pas la peine de vraiment lire les messages
Marsh Posté le 02-08-2005 à 19:05:48
shurik'n a écrit : Cette année en cours j ai codé un projet java qui consiste a obfusquer des programmes java justement. |
Je regarde
Merci.
Marsh Posté le 02-08-2005 à 19:06:13
shurik'n a écrit : Cette année en cours j ai codé un projet java qui consiste a obfusquer des programmes java justement. |
Tu connaitrais pas des assombrisseurs C ?
Marsh Posté le 02-08-2005 à 19:14:55
connais-tu les protections vbox ? une protection utilisée [EDIT: naguère] par de nombreux programmes pour limiter l'utilisation dans le temps, accessoirement compression du code et protection anti-débogage ...
il est apparu des "anti-vbox", des logiciels permettant d'enlever automatiquement ce genre de protection. Il est évident que connaitre l'algorithme qui a assombri le code est un avantage pour reconstituer le code au départ ...
je n'ai pas envie de troller longtemps sur le sujet mais ... l'utilisation d'un débugger permet d'outrepasser ce genre de protection ...
désolé si je t'ai contrarié avec mon "mdr", et si c'est le cas je m'en excuse, mais j'éspère que tu comprends bien pourquoi l'idéologie du libre va à l'encontre de ce que tu veux faire...
Marsh Posté le 02-08-2005 à 19:33:11
mcjoedassin a écrit : |
rofl mdr lol
allez hop, fortune
Marsh Posté le 02-08-2005 à 19:47:03
WhatDe a écrit : Je crois savoir d'où ca vient... |
en même temps, fait une recherche "assombrissement code" dans google et tu veras que c'est pas exclusif wikitruc comme mot.
Marsh Posté le 02-08-2005 à 19:47:06
mcjoedassin a écrit : en plus c'est pas vraiment l'esprit "libre" de vouloir cacher son code ... |
moi l'esprit pour l'instant c'est plutôt de pas avoir à payer de licence et de pas pirater
Marsh Posté le 02-08-2005 à 19:48:53
mcjoedassin a écrit : connais-tu les protections vbox ? une protection utilisée [EDIT: naguère] par de nombreux programmes pour limiter l'utilisation dans le temps, accessoirement compression du code et protection anti-débogage ... |
ouaip ma réaction était un poil démesurée, mais bon.
Marsh Posté le 02-08-2005 à 21:07:05
Jubijub> non, le principe n'est pas le même, disons que c'est plutôt comme crypter un programme avec une clef privée et donner la clef publique avec ... le programme que tu donnes doit être capable de se "reformer" en mémoire... je veux dire un code assombri doit être capable de se désassombrir de lui-même, c'est pour ça qu'un débugger contre ce genre de protection
daneel17fr> pas envie de me prendre la tête !
Marsh Posté le 02-08-2005 à 21:13:57
bon allez, encore un dernier petit post et je m'arretes là promis ...
le seul moyen véritable est de passer par une entité extérieure c'est-à-dire via un serveur distant ou par exemple un mécanisme "en hard" sur une clef usb par exemple ... si tu codes tout dans le logiciel, y a pas moyen...
Marsh Posté le 02-08-2005 à 22:04:33
Jubijub a écrit : heu, je vous donne l'algo de MD5, je vous donne un hash, c pas pour autant que vous me retrouverez le truc de base hein ...(bon ok ca sert à rien pour assombrir du code mais le principe est le même) |
Euh non, il n'y a strictement aucun lien entre MD5 et du cryptage, MD5 c'est du hashing t'es pas censé pouvoir retrouver le truc de base
Par contre RSA (ou un autre système de crypto) là oui
mcjoedassin a écrit : Jubijub> non, le principe n'est pas le même, disons que c'est plutôt comme crypter un programme avec une clef privée et donner la clef publique avec ... le programme que tu donnes doit être capable de se "reformer" en mémoire... je veux dire un code assombri doit être capable de se désassombrir de lui-même, c'est pour ça qu'un débugger contre ce genre de protection |
Le code doit être informatiquement fonctionnel, ça ne veut absolument pas dire qu'il sera humainement compréhensible ou utilisable
Exemples simples:
1- Hello World en brainfuck
>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-] |
Il n'y a pas grand chose, et ça prend pourtant un moment à décoder
2- Réimplémentation de (a<b?a:b) en C (ah ben oui)
int mymax (int(*a)(int(*)(int(*)()),int(*)(int(*)(int**))), int(*b)(int(*) |
qui s'appelle ainsi:
mymax((int(*)(int(*)(int(*)()),int(*)(int(*)(int**))))3,(int(*)(int(*)(int(*) |
(remplace mymax(3,52)).
Le nom de fonction est ici explicite mais n'a bien sûr pas à l'être.
3- Implémentation de Quicksort...
a. En C
#include "stdio.h" |
b. En Java
import java.lang.*; |
c. En Python
import sys |
4- Il n'y a même pas spécialement besoin de le vouloir, exemple avec une routine de string matching prenant en compte * (n caractères indéfinis) et ? (un unique caractère indéfini) tout en étant case insensitive
#include "stdio.h" |
5- On peut aussi calculer PI en C#
#region Using directives |
Plus généralement, tu peux aller voir du côté de l'International Obfuscated C Code Contest pour voir des codes parfaitement lisibles par les machines (et fonctionnels) tout en restant garantis imbitables humainement parlant, certains allant jusqu'à finement utiliser les espaces vides pour créer des formes troublant encore plus le lecteur, comme Arachnid de l'IOCCC 17:
#include <ncurses.h>/*****************************************************/ |
Marsh Posté le 03-08-2005 à 09:10:16
là on atteint des gens très atteint...
et oui merci je sais que ca n'a rien à voir le MD5 et l'obfuscation (c meme pour ca que je l'ai écrit dans mon post que ca n'avait rien à voir)...
je réagissais par rapport aux posts qui disaient que connaitre le code d'un algo qui transforme qqc permet forcément, si on a le résultat, de trouver le message de départ...c pas vrai, c pour ca que j'ai cité le MD5...ct un peu off topic si vous préférez
Marsh Posté le 03-08-2005 à 09:18:26
pour assombrir ton code...eteins la lumiere quand tu programme
Marsh Posté le 03-08-2005 à 10:14:13
betsamee> je crois qu'ici on cherche plutôt à mettre du code du genre
jmp ici
.byte 0xE0
ici:
suite du code
un désassembleur va prendre les instructions une par une et donc croire que le 0xE0 est le premier octet d'une instruction. Du coup les premieres instructions de "suite du code" ne seront pas correctement désassemblées. On peut même mettre du code qui va s'imbriquer par exemple
push 0x10740000
jmp -1
va réaliser un saut en arrière dans le code du push qui va être interprété comme un saut en avant ... en bidouillant un peu bien sûr, l'exemple ici ne marche pas !
Jubijub> ct un peu off topic si vous préférez
J'étais de toute façon complètement hors topic depuis le début - désolé. Je propose de sortir complètement de la surface de ce forum pour que vous puissiez reprendre le thread normalement
Enfin, j'ai dit pas mal de conneries ici, veuillez m'en excuser. Alors pour dire quelquechose d'intéressant :
daneel17fr> pourquoi ne fais tu pas avec une passphrase comme déja évoqué dans le thread précédent ?
Marsh Posté le 03-08-2005 à 18:21:47
Alors plusieurs chose.
Pour répondre à un post plus haut de je-sais-plus-qui, si je dispose d'un serveur tiers fiable, je vais pas m'emmerder à chiffrer mon code pour cacher une clé qui sert pour s'authentifier. Je vais directement utiliser un des 10000 protocoles d'authentification qui existent et qui utilisent un serveur tiers sûr.
Ensuite la passphrase: dans l'absolu, oui. Mais là non. Tout simplement parceque l'authentification doit pouvoir se faire automatiquement plusieurs fois par minute tout ça tout ça. Le user voudra pas se taper le pass à chaque fois Ou alors c'est automatique, ce qui signifie que le programme doit le mettre tout seul, donc qu'il le connait, donc il faut assombrir le code pour qu'un bonhomme puisse pas le retrouver
Enfin, j'ai cru voir que certaines methodes avancées d'assombrissement rendaient non seulmeent le code illisible à l'oeil, mais en plus créaient des ambiguïté qui foutaient la merde lors d'une décompilation automatique (donc sans "bon sens" pour trancher).
A noter que je suis toujours un poil emmerdé par ce problème. Ma dernière reflexion donne : je disperse ma clé ds le code + je disperse dans le code des trucs à la con qui n'ont rien à voir (pour éviter la collusion). Je mets un algo (pas trop gros) capable de retrouver la clé dans le code. Et cet algo (celui là seulement) je lui applique des methodes d'assombrissement de bourrin (que je ne connais pas encore ).
Pour finir, même si ce système n'est pas super secure, l'important c'est qu'il le soit un peu un certain temps. Dans la vraie vie, la sécurité parfaite c'est pas vraiment indispensable, et c'est souvent coûteux. Je vous rappelle que mon code sera fermé et que donc il répondra aux canons de la crypto universitaire.
Pour finir (2ème fois), je pense que des méthodes comme ça existent, puisque sinon comment font Steam, Windows Update et consorts ? Win doit bien cacher des clés qqpart nan ?
Marsh Posté le 03-08-2005 à 18:34:43
tu peux aussi faire ca :
tu caches le MD5 du password...
chaque fois qu'il y a besoin, tu envois ce hash avec le login au serveur, qui compare le hash envoyé au hash qu'il stocke...Et hop
et g replacé mon MD5
avantage : rien ne transite en clair, rien n'est stocké en clair...
inconvénient : chaque fois que t'a besoin de l'auth, faut discuter avec le serveur...
Marsh Posté le 03-08-2005 à 18:47:57
si vous voulez voir du code imbitable, je vous file les sources de mon plugin
Marsh Posté le 03-08-2005 à 18:50:32
Non c'est bon on va éviter, j'ai déjà assez mal aux yeux avec l'autre engin de chantier incapable d'écrire deux mots de suite correctement orthographiés
Marsh Posté le 03-08-2005 à 19:10:01
ReplyMarsh Posté le 03-08-2005 à 22:30:21
Jubijub a écrit : tu peux aussi faire ca : |
dans ce cas, pourquoi je stockerai pas direct la clé que je veux cacher ? Si je sais faire ce que tu dis j'ai plus de problème.
Marsh Posté le 02-08-2005 à 16:55:26
pour ceux qui savent pas (comme moi y a 2 jours) : les techniques d'Assombrissement/Obfuscation (Français, Anglais) consistent à rendre un code illisibles de manière à éviter le reverse engineering/ingénierie amont. Si c'est bien fait, cela devrait même empecher un code "décompilé" de se recompiler correctement, en créant des ambiguïtés.
Voilà.
Maintenant ma question : connaissez-vous des outils ou méthodes efficaces, gratuits, voir même libre ( ) pour assombrir un code C. Pour du Java ? Du C++ ?
Merci pour vos aides les gens
Message édité par daneel17fr le 02-08-2005 à 16:55:47