Analyse de format d'entete pe

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 559 fois - Téléchargée 34 fois

Contenu du snippet

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 / Exemple :


#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!!!

A voir également

Ajouter un commentaire

Commentaires

Messages postés
8
Date d'inscription
mardi 21 décembre 2004
Statut
Membre
Dernière intervention
25 janvier 2008

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.
Messages postés
5
Date d'inscription
dimanche 21 décembre 2008
Statut
Membre
Dernière intervention
12 avril 2009

slt
a ce que vous pouvez me donner ce meme programme en java svp
puisq c vraiment magnifique
merci d'avence
Messages postés
5
Date d'inscription
dimanche 21 décembre 2008
Statut
Membre
Dernière intervention
12 avril 2009

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
Messages postés
123
Date d'inscription
mercredi 27 août 2003
Statut
Membre
Dernière intervention
12 août 2008
1
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.
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
36
ok dsl pour ce comment inutile
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.