blabla@elite - ASM - Programmation
Marsh Posté le 17-12-2005 à 15:06:09
je continurai bien le topic mais vu la tournure que ca prend
Marsh Posté le 17-12-2005 à 15:49:14
bah non, continue
je me charge de faire le ménage
edit: menage done
Marsh Posté le 17-12-2005 à 23:03:36
salut .
continu plutot 2 fois qu'une , c'est tres interressant , dumoins a mon avis pour le debutant que je suis ...
Marsh Posté le 17-12-2005 à 23:47:34
oui mais bon c long a faire comme tuto
jai deja la solution finale mais tout expliquer
reste encore une bonne moitié la
Marsh Posté le 18-12-2005 à 14:16:02
ca m'interesse bien aussi ^^
Marsh Posté le 18-12-2005 à 15:36:40
Pour la curiosité.
Parceque faire un programme en hexa, on est plus au moyen-age, hein
Marsh Posté le 18-12-2005 à 15:50:17
oui ta raison
d'ailleurs au depart cetait plus un troll lance contre le topic de chrisbk qu'un topic vraiment serieux (je crois que tout le monde avait compris)
bon la jen ai un peu plein le c** et de tout facon personne ne suit (a part les troll qu'on a effacé) donc je laisse tomber
je donne qd mm la solution car cela fonctionne bel et bien
|
Marsh Posté le 18-12-2005 à 15:58:48
je ne vois pas pkoi tu dois t'enflammer ainsi contre mon topique
Marsh Posté le 18-12-2005 à 16:33:37
Na mais la curiosité, ca veut dire les explications
Le code hexa d'un truc qui faire un messageBox en 156 octets, j'en ai rien à faire, mais un peu de description de l'entete, etc, etc,... ca peut etre interessant...
Marsh Posté le 27-06-2007 à 18:18:37
hello alors moi je suis entrain de me casser la tete sur les headers alors red faction si tu vx bien me filer un coup de... main!
alors pour commencer voici mon entete:
00 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00
10 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00
20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
30 00 00 00 00 00 00 00 00 00 00 00 00 b0 00 00 00
40 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68
50 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f
60 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20
70 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00
80 bd 0f cb da f9 6e a5 89 f9 6e a5 89 f9 6e a5 89
90 77 71 b6 89 fd 6e a5 89 05 4e b7 89 f8 6e a5 89
a0 52 69 63 68 f9 6e a5 89 00 00 00 00 00 00 00 00
b0 50 45 00 00 4c 01 02 00 5f 6b 60 46 00 00 00 00
c0 00 00 00 00 e0 00 0f 01 0b 01 05 0c 6c 00 00 00
d0 04 00 00 00 00 00 00 00 00 02 00 00 f8 01 00 00
Donc mon PE Header de $00 à $7F
en $3C l'adresse le e_lfanew contient l'adresse de l’en-tête PE à proprement parler.
Apres en $ob je retrouve bien la signature PE
ensuite le champ qui indique le type de machine qui a servit à compiler
mais ce qui me pose problème et que je n'arrive pas identifier c'est de l'adresse $80 à $af
alors une idée?
Marsh Posté le 28-06-2007 à 15:58:48
'MZ'+0x0 = début IMAGE_DOS_HEADER
donc :
* 'MZ'+ 0x00 = e_magic (IMAGE_DOS_SIGNATURE (0x5a4d)
* 'MZ'+ 0x02 = e_cblp (Bytes on last page of file)
* 'MZ'+ 0x04 = e_cp (Pages in file)
* 'MZ'+ 0x06 = e_crlc (Relocations)
* 'MZ'+ 0x08 = e_cparhdr (Size of header in paragraphs)
* 'MZ'+ 0x0a = e_minalloc (Minimum extra paragraphs needed)
* 'MZ'+ 0x0c = e_maxalloc (Maximum extra paragraphs needed)
* 'MZ'+ 0x0e = e_ss (Initial (relative) SS value)
* 'MZ'+ 0x10 = e_sp (Initial SP value)
* 'MZ'+ 0x12 = e_csum (Checksum)
* 'MZ'+ 0x14 = e_ip (Initial (relative) CS value)
* 'MZ'+ 0x16 = e_cs (Initial (relative) CS value)
* 'MZ'+ 0x18 = e_lfarlc (File address of relocation table)
* 'MZ'+ 0x1a = e_ovno (Overlay number)
* 'MZ'+ 0x1c = e_res[4] (4 words réservés)
* 'MZ'+ 0x24 = e_oemid (OEM identifier)
* 'MZ'+ 0x26 = e_oeminfo (OEM information)
* 'MZ'+ 0x28 = e_res2[10] ( 10 words réservés)
* 'MZ'+ 0x3c = e_lfanew (offset 'PE', 0x4550)
'PE'+4 = début IMAGE_FILE_HEADER
donc :
* 'PE'+0x04 = Machine
* 'PE'+0x06 = NumberOfSections
* 'PE'+0x08 = TimeDateStamp
* 'PE'+0x0c = PointerToSymbolTable
* 'PE'+0x10 = NumberOfSymbols
* 'PE'+0x14 = SizeOfOptionalHeader
* 'PE'+0x16 = Characteristics
Il me manque des petits!!!!
Marsh Posté le 28-06-2007 à 22:19:31
Salut.
En général, ce sont des infos ajoutées par le linker, mais je ne sais plus quoi exactement.
Dans tous les cas, tu as le pointeur vers le PE header dans e_lfanew donc tout ce qui est entre les 2 n'est pas défini par le format PE. C'est à dire qu'on peut mettre ce qu'on veut.
Marsh Posté le 08-12-2005 à 11:36:11
Bonjour
(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
Ceci est un magnifique
trolltopic 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é
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