Bonjour
Ceci est un magnifique troll topic qui nous permettra a nous, les vrai-hommes qui ecrivons nos applis en bytecode directement, sans api et sans la moindre dll (cad uniquement par appel au noyau a coup de INT 2E) d'echanger librement vos joies, peines et tentatives de suicide rencontrées lors de cet exercice
(Surtout le dernier point en fait)
Toi aussi tu comptes les opcodes x86 avant d'aller dormir, ou calcule directement le total de tes courses en hexa ?? alors viens ce topic est fait pour toi!!!!
Je propose donc dans un premier temps un recensement du nombre de W@r|OrdZ present dans ce forum, paske si je suis tout seul ca sera pas la peine d'aller plus loin
-------------------------------------
Edit:
bon pour commencer je vais faire un petit tuto sur les bases de la programmation en hexa pour ceux qui ni connaissent rien car ca sent un peu le noob ici
Evidement nous n'utiliserons pas de compilo, car l'|iTe n'a pa besoin de ca, d'ailleurs ca simplifie beaucoup de choses, rien a installer rien a configurer, pas de librairie qui manque, plus de warnings...
Tout ce dont vous aurais besoin c'est un editeur hexa, voir le bon vieux debug sous dos pour les plus courageux (ou pauvres, au choix) d'entre vous...
De toute facon le programme final ne fera pas trés grand, 160 bytes tout au plus
Tutorial 1 - Ma premiere MessageBox en hexa...
Structure d'un Exe Win32 PE
-MZ Header
-MZ Stub
-PE Header
-Image optional header
-Section Table
-Sections (.data .text .src,... )
Comme vous le savez tous, tout Exe Win32 commence par le bon vieux header Dos MZ, principalement pour des raisons de compatibilité (ce qui permet a Dos d'afficher le message "This program cannot be run in DOS mode" et de ne pas planter betement). Ce dernier est contenu dans MZ Stub
Ensuite, vient le header PE qui lui est specifique a windows. Il contient qq d'infos techniques (machine utilisée,checksum) mais decrit surtout comment est organisé le reste de l'exe.
Le reste sera detaillé plus tard
---------------
Une fois dans l'editeur, vous pouvez deja remplir un bloc de 0x40 bytes avec des zeros car le header ms dos fait cette taille et nous n'allons pas remplir tout les champs.......
Ensuite pour le premier byte
4D5A <= le fameux MZ
bon apres on pourrait s'amuser a remplir tout le reste, mais dans le cas dune appli Win32, NT s'en fou et va directement en 0x3C pour connaitre ou se trouve le PE Header.
on peut donc aller en 0x3C ecrire 0400 0000 pour indiquer que le header PE se trouve a cet endroit la.
Enfait le PE Header sera linterieur du MZ Header puisque ce dernier est ignoré et on gagne donc pas mal de place
Ensuite,
2E2E <= c juste pour combler et avoir adresse alignée sur 4
50450000 //le fameux Header PE
4C01 // informations sur la machine (386 ici)
0100 // nombre de sections
Normalement ca devrait ressembler a ca :
4D5A 2E2E 5045 0000 4C01 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0400 0000 |
Evidement si on lance l'exe, windows nous dit quil est invalide mais il manque encore qq trucs, mais ca c pour la suite ...
Partie II
bon c'est bien tout ca mais il faut quand meme que notre exe fasse quelque chose
dans l'exemple ici on va se contenter d'afficher une simple message box
pour cela on utilise l'api MessageBoxA
Les 3 prochains champs etant timestamp (32bit),pointeur vers symbol table(32 bit) et number of symbols(32bit aussi) on peut ecraser allegrement
(je precise tout de meme que l'exe final fonctionnera tout ceci netant pas du bluff)
en hexa ca donne M4D e65 s73 s73 a61 g67 e65 B42 o6F x78 A41
ne pas oublier de rajouter un byte nul pour terminer la chaine
apres viens sizeof optionalheader, que l'on met a 4000 (jexpliquerai apres)
ensuite, le champ charateristics sur 16 bit, dont chaque bit constitue un flag
ici on va mettre 0F01 (0000 1111 0000 0001)
ce qui correspond a :
-Relocation info stripped from file
-File is executable
-Line numbers stripped from file
-Local symbols stripped from file
-32 bit word machine
voila c fini pour le pe header....
viens apres image optional header dont le header commence tjs par 0B01
4D5A 2E2E 5045 0000 4C01 0100 4D65 7373 6167 6542 6F78 4100 4000 0F01 0B01 0000
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0400 0000 |
c tout pour cette fois ci
Message édité par red faction le 17-12-2005 à 18:27:31