Bonjour,
Je cherches de l'aide pour manipuler des sections de fichiers PE ( ex de code C/C++, documentation ou autre ).
Mon but est de pouvoir inserer des données dans une section et pouvoir les recupérer après.
Merci de votre aide.
Bonjour,
Je cherches de l'aide pour manipuler des sections de fichiers PE ( ex de code C/C++, documentation ou autre ).
Mon but est de pouvoir inserer des données dans une section et pouvoir les recupérer après.
Merci de votre aide.
Quelle genre de donnée ? Quelle section ?
Pourquoi ne pas passer par les ressources ?
Je voudrais mettre un fichier compréssé dans une section data d'un .o, puis le lié à au programme de décompression.
Ainsi je pourrais mette mon fichier compressé dans un fichier excutable qui se chargera de décompressé les données. L'idée me semble bonne et la structure du format PE me parait rendre cela possible. Le hic c'est que j'y connais rien et que je ne sais pas comment fait pour mettre mon archive dans une section data d'un .o et comment repérer cette section dans le programmation de décompression pour pouvoir récupérer mon fichier compressé.
Bonjour,
Il y a quelque chose que je ne comprends pas dans la question. S'il s'agit d'un fichier ".o" c'est un fichier objet utilisé sous les différents unix et qui n'adhère pas à la certification PE (Portable Executable) mais ELF (Executable and Linking Format).Je voudrais mettre un fichier compréssé dans une section data d'un .o
Si tu travaille sous Windows, les différents binaires au formats PE sont notamment :.exe (Executable) ; .dll (Bibliothèque dynamique) ; .scr (Ecran de veille) ; .sys (driver NT) ; .vxd (driver windows 9x) ; .cpl (panneau de contrôle) , .ocx (active X) ; etc.
Si tu veux seulement mettre un fichier compressé et t'en servir à l'exécution, met le en ressources (il sera inséré dans la section .rsrc de l'exécutable) et extrait le à l'exécution via les APIs LoadResource() , FindResource(), etc. qui sont là pour ça.
En espérant que ça réponde un peu à ta question.
cela parait répondre à mon besoin.
Peux tu me détailler comment on ajoutes un fichier aux ressources d'un programme ( je suis assez mauvais en programmation windows ), et comment on le recupères de l'executable ?
Tout dépend de ton IDE, mais on peut faire sans IDE, bien que ça soit un peu plus lourd.
J'ai mis un exemple en pièce jointe (code source uniquement, pas de binaire).
Il faut un fichier .rc qui donne le nom de la ressource et son type.(Avec un IDE, comme Visual, on integre la ressource en quelques clics, c'est bcp plus pratique).
les types de ressources sont visibles ici :
http://windowssdk.msdn.microsoft.com.../ms648009.aspx
Quand rien ne correspond à une ressource précise, on utilise le type RT_RCDATA (format binaire) , dans l'exemple c'est ce que j'ai pris pour extraire un simple fichier texte à l'exécution.
Voilà à quoi ça ressemble (gestion d'erreur minimale...) :
Tu trouvera les explications sur les différentes API sur la MSDN, par exemple FindResource :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 int main(void) { // On recherche la ressource HRSRC hRsrc = FindResource(NULL, MAKEINTRESOURCE(IDR_RT_RCDATA1) , L"RT_RCDATA"); if (hRsrc == NULL) { cout << "Impossible de trouver la ressource demandee !" << endl; return 0; } //On obtient la taille de la ressource, nécessaire pour l'extraire. DWORD TailleRes = SizeofResource(NULL, hRsrc); //on charge la ressource. HGLOBAL hGlob = LoadResource(NULL, hRsrc); if (hGlob == NULL) { cout << "Impossible de charger la ressource !" << endl; return 0; } //on fixe la ressource pour avoir un pointeur. PVOID pRessource = LockResource(hGlob); //on créé un fichier où on écrira la ressource. HANDLE hFile = CreateFile (L"FichierExtrait.txt", GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { cout << "Impossible de creer le fichier !" << endl; return 0; } //on écrit la ressource dans le fichier. DWORD NOBW = 0; BOOL bRet = WriteFile(hFile, pRessource, TailleRes, &NOBW, NULL); if (bRet == FALSE) { cout << "Imposible d'écrire le fichier !" << endl; return 0; } //fermeture du handle du fichier. CloseHandle (hFile); cout << "La ressource a ete extraite et ecrite avec succes !" << endl; return 0; }
http://windowssdk.msdn.microsoft.com.../ms648042.aspx
Voilà, si tu a des questions n'hésites pas
Fait une petite recherche sur le forum aussi, et regarde voir sur codeproject, il y a des projets pour créer des exe auto extractibles. De mémoire, une technique très simple consiste à rajouter ses données directement à la fin du binaire...
Regarde voir aussi UPX.
merci bcp pour tous ces renseignements.
Un rayon de soleil dans la brume de ma programmation windows ^^
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager