begin process at 2012 02 12 10:37:58
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Sécurité & Cryptage

 > ANALYSE DE FORMAT D'ENTETE PE

ANALYSE DE FORMAT D'ENTETE PE


 Information sur la source

Note :
Aucune note
Catégorie :Sécurité & Cryptage Niveau :Débutant Date de création :20/08/2004 Date de mise à jour :23/08/2004 17:15:23 Vu :7 491

Auteur : syncppfrance

Ecrire un message privé
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

bonjour,
il se trouve qu'en ce moment, je cherche à écrire un format de protection logiciel, et j'ai donc commencé à écrire de quoi analyser toutes informations intéressantes pour rajouter une section (à la maniere des virus, des crackeurs, ...) afin de creer mon propre crypteur/compresseur de format PE. lolllll ca va le souffle??

voici un screenshot textuel

magic entete: 0x5a4d
pe header: 0xc8
nombre de section trouvee: 3
taille du code: 16384
taille des donnees initialisees: 16384
taille des donnees non initialisees: 0
adresse du point d'entree dans le fichier: 0x1010 memoire: 0x401010
image base (position en memoire): 0x400000
alignement de 4096 octets pour les sections
alignement de 4096 octets pour le fichier
taille du fichier en memoire: 36864
debut 1ere section ds le fichier: 0x1000
------------Directory------------------
nom : IMAGE_DIRECTORY_ENTRY_IMPORT (1)
adresse virtuelle: 0x5434   taille: 40 (0x28)
nom: IMAGE_DIRECTORY_ENTRY_IAT (12)
adresse virtuelle: 0x5000   taille: 156 (0x9c)
-------------------------------------------
nom de la section: .text
adresse en memoire: 0x1000 reel: 0x401000
taille dans le fichier: 16384
adresse dans le fichier: 0x1000
section contenant des constantes
section en lecture possible
section en ecriture possible
----------------------------------------- --
nom de la section: .rdata
adresse en memoire: 0x5000 reel: 0x405000
taille dans le fichier: 4096
adresse dans le fichier: 0x5000
section contenant des constantes
section en lecture possible
----------------------------------------- --
nom de la section: .data
adresse en memoire: 0x6000 reel: 0x406000
taille dans le fichier: 12288
adresse dans le fichier: 0x6000
section contenant des constantes
section en lecture possible
section en ecriture possible

Source

  • #include <windows.h>
  • #include <winnt.h>
  • #include <fstream.h>
  • char directorylabel[16][255] = {"IMAGE_DIRECTORY_ENTRY_EXPORT (0)",
  • "IMAGE_DIRECTORY_ENTRY_IMPORT (1)",
  • "IMAGE_DIRECTORY_ENTRY_RESOURCE (2)",
  • "IMAGE_DIRECTORY_ENTRY_EXCEPTION (3)",
  • "IMAGE_DIRECTORY_ENTRY_SECURITY (4)",
  • "IMAGE_DIRECTORY_ENTRY_BASERELOC (5)",
  • "IMAGE_DIRECTORY_ENTRY_DEBUG (6)",
  • "IMAGE_DIRECTORY_ENTRY_COPYRIGHT (7)",
  • "IMAGE_DIRECTORY_ENTRY_GLOBALPTR (8)",
  • "IMAGE_DIRECTORY_ENTRY_TLS (9)",
  • "IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG (10)",
  • "IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (11)",
  • "IMAGE_DIRECTORY_ENTRY_IAT (12)",
  • "IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT (13)", "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR (14)",
  • "??????? (15)"
  • };
  • int main(int argc, char* argv[])
  • {
  • ifstream f3;
  • IMAGE_DOS_HEADER ff;
  • IMAGE_NT_HEADERS pe;
  • IMAGE_SECTION_HEADER *section;
  • f3.open("essai.exe",ios::binary | ios::nocreate ,filebuf::sh_read); // j'ai mis sh_read parceque j'essai de lire mon propre exe, mais ca marche pas, on m'a dit sur les news qu'il fallait qu'il soit ouvert en read shared, si quelqu'un peut me depanner!!!!
  • if (!f3.is_open()) return 0; //si erreur
  • f3.read((char *)&ff,sizeof(IMAGE_DOS_HEADER));
  • if (ff.e_magic != IMAGE_DOS_SIGNATURE ) { // MZ
  • cout << "ce nest pas un format executable MZ" <<endl;
  • f3.close();
  • return 0;
  • }
  • cout << "magic entete: 0x" << hex << ff.e_magic << endl;
  • cout << "pe header: 0x" << hex << ff.e_lfanew << endl;
  • f3.seekg(ff.e_lfanew); // on se positionne sur le format PE
  • f3.read((char *)&pe,sizeof(IMAGE_NT_HEADERS));
  • if (pe.Signature != IMAGE_NT_SIGNATURE ) { // PE
  • cout << "ce nest pas un format PE" <<endl;
  • f3.close();
  • return 0;
  • }
  • cout << "nombre de section trouvee: " << dec << pe.FileHeader.NumberOfSections <<endl;
  • cout << "taille du code: " << dec << pe.OptionalHeader.SizeOfCode <<endl;
  • cout << "taille des donnees initialisees: " << dec << pe.OptionalHeader.SizeOfInitializedData <<endl;
  • cout << "taille des donnees non initialisees: " << dec << pe.OptionalHeader.SizeOfUninitializedData <<endl;
  • cout << "adresse du point d'entree dans le fichier: 0x" << hex << pe.OptionalHeader.AddressOfEntryPoint << " memoire: 0x" << hex << pe.OptionalHeader.AddressOfEntryPoint + pe.OptionalHeader.ImageBase << endl;
  • cout << "image base (position en memoire): 0x" << hex << pe.OptionalHeader.ImageBase <<endl;
  • cout << "alignement de "<< dec << pe.OptionalHeader.SectionAlignment << " octets pour les sections" << endl;
  • cout << "alignement de "<< dec << pe.OptionalHeader.FileAlignment << " octets pour le fichier" << endl;
  • cout << "taille du fichier en memoire: "<< dec << pe.OptionalHeader.SizeOfImage << endl;
  • cout << "position de la 1ere section ds le fichier: 0x " << hex << pe.OptionalHeader.SizeOfHeaders << endl;
  • cout << "------------Directory------------------" << endl;
  • for (int d=0;d<IMAGE_NUMBEROF_DIRECTORY_ENTRIES;d++)
  • {
  • if (pe.OptionalHeader.DataDirectory[d].VirtualAddress != 0 || pe.OptionalHeader.DataDirectory[d].Size != 0)
  • {
  • cout << "nom: " << (char*)&directorylabel[d][0] << endl;
  • cout << "adresse virtuelle: 0x" << hex << pe.OptionalHeader.DataDirectory[d].VirtualAddress << " taille: " << dec << pe.OptionalHeader.DataDirectory[d].Size << " (0x" << hex << pe.OptionalHeader.DataDirectory[d].Size << ")" << endl;
  • }
  • }
  • section = new IMAGE_SECTION_HEADER[pe.FileHeader.NumberOfSections]; // allocation des entetes de section
  • for (int s=0;s<pe.FileHeader.NumberOfSections;s++)
  • {
  • char nom[9]="";
  • f3.read((char *)&section[s],sizeof(IMAGE_SECTION_HEADER));
  • strncpy(nom,(char *)section[s].Name,8);
  • cout << "-------------------------------------------" << endl;
  • cout << "nom de la section: " << nom << endl;
  • cout << "adresse physique: 0x" <<hex << section[s].Misc.PhysicalAddress << endl;
  • cout << "taille virtuelle: " << dec << section[s].Misc.VirtualSize << " (0x" << hex << section[s].Misc.VirtualSize << ")" << endl;
  • cout << "adresse en memoire: 0x" << hex << section[s].VirtualAddress << " reel: 0x" << hex << pe.OptionalHeader.ImageBase + section[s].VirtualAddress << endl;
  • cout << "taille dans le fichier: " << dec << section[s].SizeOfRawData << endl;
  • cout << "adresse dans le fichier: 0x" << hex << section[s].PointerToRawData << endl;
  • if (section[s].Characteristics & IMAGE_SCN_CNT_CODE)
  • cout << "section contenant du code" << endl;
  • if (section[s].Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA)
  • cout << "section contenant des constantes" << endl;
  • if (section[s].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
  • cout << "section contenant des donnees non initialisees (remplis pr 0)" << endl;
  • if (section[s].Characteristics & IMAGE_SCN_MEM_SHARED)
  • cout << "section paratgee en memoire" << endl;
  • if (section[s].Characteristics & IMAGE_SCN_MEM_EXECUTE)
  • cout << "section executable" << endl;
  • if (section[s].Characteristics & IMAGE_SCN_MEM_READ)
  • cout << "section en lecture possible" << endl;
  • if (section[s].Characteristics & IMAGE_SCN_MEM_WRITE)
  • cout << "section en ecriture possible" << endl;
  • }
  • delete [] section;
  • f3.close();
  • return 0;
  • }
#include <windows.h>
#include <winnt.h>
#include <fstream.h>

char directorylabel[16][255] = {"IMAGE_DIRECTORY_ENTRY_EXPORT (0)",
			"IMAGE_DIRECTORY_ENTRY_IMPORT (1)",
	"IMAGE_DIRECTORY_ENTRY_RESOURCE (2)",
                "IMAGE_DIRECTORY_ENTRY_EXCEPTION (3)",
	"IMAGE_DIRECTORY_ENTRY_SECURITY (4)",
	"IMAGE_DIRECTORY_ENTRY_BASERELOC (5)",
	"IMAGE_DIRECTORY_ENTRY_DEBUG (6)",
	"IMAGE_DIRECTORY_ENTRY_COPYRIGHT (7)",
	"IMAGE_DIRECTORY_ENTRY_GLOBALPTR (8)",
	"IMAGE_DIRECTORY_ENTRY_TLS (9)",
	"IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG (10)",
	"IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (11)",
	"IMAGE_DIRECTORY_ENTRY_IAT (12)",
	"IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT (13)",						"IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR (14)",
	"??????? (15)"
	};

int main(int argc, char* argv[])
{
ifstream f3;
IMAGE_DOS_HEADER ff;
IMAGE_NT_HEADERS pe;
IMAGE_SECTION_HEADER *section;

f3.open("essai.exe",ios::binary | ios::nocreate ,filebuf::sh_read); // j'ai mis sh_read parceque j'essai de lire mon propre exe, mais ca marche pas, on m'a dit sur les news qu'il fallait qu'il soit ouvert en read shared, si quelqu'un peut me depanner!!!!

if (!f3.is_open()) return 0; //si erreur

f3.read((char *)&ff,sizeof(IMAGE_DOS_HEADER));

if (ff.e_magic != IMAGE_DOS_SIGNATURE ) { // MZ
	cout << "ce nest pas un format executable MZ" <<endl;
	f3.close();
	return 0;
}

cout << "magic entete: 0x" << hex << ff.e_magic << endl;
cout << "pe header: 0x" << hex << ff.e_lfanew << endl;

f3.seekg(ff.e_lfanew); // on se positionne sur le format PE

f3.read((char *)&pe,sizeof(IMAGE_NT_HEADERS));

if (pe.Signature != IMAGE_NT_SIGNATURE ) { // PE
	cout << "ce nest pas un format PE" <<endl;
	f3.close();
	return 0;
}

cout << "nombre de section trouvee: " << dec << pe.FileHeader.NumberOfSections <<endl;
cout << "taille du code: " << dec << pe.OptionalHeader.SizeOfCode <<endl;
cout << "taille des donnees initialisees: " << dec << pe.OptionalHeader.SizeOfInitializedData <<endl;
cout << "taille des donnees non initialisees: " << dec << pe.OptionalHeader.SizeOfUninitializedData <<endl;
cout << "adresse du point d'entree dans le fichier: 0x" << hex << pe.OptionalHeader.AddressOfEntryPoint << " memoire: 0x" << hex << pe.OptionalHeader.AddressOfEntryPoint + pe.OptionalHeader.ImageBase << endl;
cout << "image base (position en memoire): 0x" << hex << pe.OptionalHeader.ImageBase <<endl;
cout << "alignement de "<< dec << pe.OptionalHeader.SectionAlignment << " octets pour les sections" << endl;
cout << "alignement de "<< dec << pe.OptionalHeader.FileAlignment << " octets pour le fichier" << endl;
cout << "taille du fichier en memoire: "<< dec << pe.OptionalHeader.SizeOfImage <<  endl;
cout << "position de la 1ere section ds le fichier: 0x " << hex << pe.OptionalHeader.SizeOfHeaders << endl;

cout << "------------Directory------------------" << endl;
for (int d=0;d<IMAGE_NUMBEROF_DIRECTORY_ENTRIES;d++)
{
	if (pe.OptionalHeader.DataDirectory[d].VirtualAddress != 0 || pe.OptionalHeader.DataDirectory[d].Size != 0)
	{
		cout << "nom: " << (char*)&directorylabel[d][0] << endl;
		cout << "adresse virtuelle: 0x" << hex << pe.OptionalHeader.DataDirectory[d].VirtualAddress << "   taille: " << dec << pe.OptionalHeader.DataDirectory[d].Size << " (0x" << hex << pe.OptionalHeader.DataDirectory[d].Size << ")" << endl;
	}
}


section = new IMAGE_SECTION_HEADER[pe.FileHeader.NumberOfSections]; // allocation des entetes de section

for (int s=0;s<pe.FileHeader.NumberOfSections;s++)
{
	char nom[9]="";
	f3.read((char *)&section[s],sizeof(IMAGE_SECTION_HEADER));
	strncpy(nom,(char *)section[s].Name,8);
	
	cout << "-------------------------------------------" << endl;
	
	cout << "nom de la section: " << nom << endl;
	cout << "adresse physique: 0x" <<hex << section[s].Misc.PhysicalAddress << endl;
	cout << "taille virtuelle: " << dec << section[s].Misc.VirtualSize << " (0x" << hex << section[s].Misc.VirtualSize << ")" << endl;
	cout << "adresse en memoire: 0x" << hex << section[s].VirtualAddress << " reel: 0x" << hex << pe.OptionalHeader.ImageBase + section[s].VirtualAddress << endl;
	cout << "taille dans le fichier: " << dec << section[s].SizeOfRawData << endl;
	cout << "adresse dans le fichier: 0x" << hex << section[s].PointerToRawData << endl;
	if (section[s].Characteristics & IMAGE_SCN_CNT_CODE)
		cout << "section contenant du code" << endl;
	if (section[s].Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA)
		cout << "section contenant des constantes" << endl;
	if (section[s].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
		cout << "section contenant des donnees non initialisees (remplis pr 0)" << endl;
	if (section[s].Characteristics & IMAGE_SCN_MEM_SHARED)
		cout << "section paratgee en memoire" << endl;
	if (section[s].Characteristics & IMAGE_SCN_MEM_EXECUTE)
		cout << "section executable" << endl;
	if (section[s].Characteristics & IMAGE_SCN_MEM_READ)
		cout << "section en lecture possible" << endl;
	if (section[s].Characteristics & IMAGE_SCN_MEM_WRITE)
		cout << "section en ecriture possible" << endl;
}

delete [] section;
f3.close();
return 0;
}


 Conclusion

peut etre a suivre!!!


 Historique

20 août 2004 20:48:59 :
une erreur de nettoyage par rapport au code d'origine sur mon disque
20 août 2004 21:38:40 :
je veins de cooriger un oublie de "dec <<" pour remettre en decimal
20 août 2004 21:39:54 :
oublie de "dec <<" c corrigé
20 août 2004 21:44:38 :
modification du screenshot textuel par rapport au bug precedent
21 août 2004 08:24:47 :
bug ios::binary || ios::nocreate ----> ios::binary | ios::nocreate
21 août 2004 09:09:15 :
rajout d'une information
21 août 2004 13:50:02 :
rajout de l'affichage des directorys
21 août 2004 13:51:21 :
mise a jour du screenshot
23 août 2004 17:15:23 :
rajouts d'informations

 Sources du même auteur

Source avec Zip INTERPRETEUR DE SCRIPT (1ERE ÉTAPE): L'EVALUATION D'EXPRESSI...
Source avec Zip CREER UN FAKE CODE ASSEMBLEUR (V2)
CREER UN FAKE CODE ASSEMBLEUR

 Sources de la même categorie

PROJET DE CRYPTOGRAPHIE: RSA À JEU REDUIT D'INSTRUCTION par samatarahmed
Source avec Zip Source avec une capture CRYPTOSYSTÈME ELGAMAL LIBRAIRIE GMP par louelh95
Source avec Zip Source .NET (Dotnet) NOUVEL ALGORITHME D'ENCRYPTION-DÉSENCRYPTION DYNAMIQUE (INFA... par vletktol
Source avec Zip A2DCRYPT - CRYPTAGE 2048 BITS par darkor
Source avec Zip Source avec une capture CRYPTEUR-DÉCRYPTEUR-IP par antho974

Commentaires et avis

Commentaire de coucou747 le 23/08/2004 12:20:21 administrateur CS

ça crypte avec quel algorythme ? (dsl, je n'ai pas trop de temps pour analyser cette source...)

Commentaire de syncppfrance le 23/08/2004 13:04:00

ca crypte rien. cette source permet juste d'afficher les information d'entete du format PE. peut etre un jour je posterai un exemple de fichier proteger, une sorte de crack me, avec les protections que jaurais faite.

Commentaire de coucou747 le 23/08/2004 13:05:32 administrateur CS

ok dsl pour ce comment inutile

Commentaire de hakim0 le 13/08/2007 21:08:50

bonne source facile pour comprendre le PE file format pour plus
d'info sur le pe file format visite le lien http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/pefile.html
une ide:
tu va compresser tous les sessione est tu va rajouter une seul section text code de ton propre code de decompressage, mais je ne trouve pas une raison pour faire ca...
bonne pr et Merci.

Commentaire de mayadoz le 14/01/2009 22:23:24

slt
a ce que vous pouvez me donner ce meme programme mais en java puisq c vraiment magnifique
est c vraiment j'ai besoin d'il
merci d'avence

Commentaire de mayadoz le 14/01/2009 22:55:32

slt
a ce que vous pouvez me donner ce meme programme en java svp
puisq c vraiment magnifique
                                                               merci d'avence

Commentaire de Salim32 le 10/11/2009 23:41:58

f3.open("C:\\Credit.exe", ios::binary, ios_base::_Openprot);

voila la solution au probleme de filebuf::sh_read
à remplacer par  ios_base::_Openprot
dans mon cas le fichier est Credit.exe

cela marche sous vs2008 pro ! et j'espère que ca vous aide.

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,462 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales