Accueil > > > PE ANALYSER
PE ANALYSER
Information sur la source
Description
Ce code montre comment récupérer des informations sur l'entete, les sections ainsi que l'import table q'un programme. J'ai essayé de faire une code clair en donnant les infos necessaires pour comprendre. Si vous avez une question n'hesitez pas :) Le code est disponnible aussi ici : http://lilxam.blogspot.com/2008/01/pe-analyser.htm l Have Fun ;) lilxam.
Source
- #include <windows.h>
- #include <iostream>
-
- int main()
- {
- printf("-------------------------------/ PE analyser \\-------------------------------\n\n");
-
- HANDLE hProgram = GetModuleHandle(NULL);
-
- if(hProgram != NULL)
- {
- /*
- typedef struct _IMAGE_DOS_HEADER // DOS .EXE header
- {
- 0h WORD e_magic; // Magic number
- 2h WORD e_cblp; // Bytes on last page of file
- 4h WORD e_cp; // Pages in file
- 6h WORD e_crlc; // Relocations
- 8h WORD e_cparhdr; // Size of header in paragraphs
- Ah WORD e_minalloc; // Minimum extra paragraphs needed
- Ch WORD e_maxalloc; // Maximum extra paragraphs needed
- Eh WORD e_ss; // Initial (relative) SS value
- 10h WORD e_sp; // Initial SP value
- 12h WORD e_csum; // Checksum
- 14h WORD e_ip; // Initial IP value
- 16h WORD e_cs; // Initial (relative) CS value
- 18h WORD e_lfarlc; // File address of relocation table
- 1Ah WORD e_ovno; // Overlay number
- 1Ch WORD e_res[4]; // Reserved words
- 24h WORD e_oemid; // OEM identifier (for e_oeminfo)
- 26h WORD e_oeminfo; // OEM information; e_oemid specific
- 28h WORD e_res2[10]; // Reserved words
- 3Ch LONG e_lfanew; // File address of new exe header
- }
- IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
- */
- PIMAGE_DOS_HEADER structPE = (PIMAGE_DOS_HEADER) hProgram;
- printf("\nMagic Number : %x", structPE->e_magic);
-
- if(structPE->e_magic == 0x5a4d) //0x5a4d -> MZ -> IMAGE_DOS_SIGNATURE
- {
-
- /*
- typedef struct _IMAGE_NT_HEADERS
- {
- 0h DWORD Signature;
- 4h IMAGE_FILE_HEADER FileHeader;
- 18h IMAGE_OPTIONAL_HEADER OptionalHeader;
- }
- IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
- */
- PIMAGE_NT_HEADERS HeaderPE = (PIMAGE_NT_HEADERS)(structPE->e_lfanew+ (DWORD)structPE);
- printf("\nHeader Signature : %x", HeaderPE->Signature);
-
- if(HeaderPE->Signature == 0x4550) // 0x00004550 -> PE00 -> IMAGE_NT_SIGNATURE
- {
-
- /*
- typedef struct _IMAGE_OPTIONAL_HEADER
- {
- 0h WORD Magic;
- 2h BYTE MajorLinkerVersion;
- 3h BYTE MinorLinkerVersion;
- 4h DWORD SizeOfCode;
- 8h DWORD SizeOfInitializedData;
- Ch DWORD SizeOfUninitializedData;
- 10h DWORD AddressOfEntryPoint;
- 14h DWORD BaseOfCode;
- 18h DWORD BaseOfData;
- 1Ch DWORD ImageBase;
- 20h DWORD SectionAlignment;
- 24h DWORD FileAlignment;
- 28h WORD MajorOperatingSystemVersion;
- 2Ah WORD MinorOperatingSystemVersion;
- 2Ch WORD MajorImageVersion;
- 2Eh WORD MinorImageVersion;
- 30h WORD MajorSubsystemVersion;
- 32h WORD MinorSubsystemVersion;
- 34h DWORD Win32VersionValue;
- 38h DWORD SizeOfImage;
- 3Ch DWORD SizeOfHeaders;
- 40h DWORD CheckSum;
- 44h WORD Subsystem;
- 46h WORD DllCharacteristics;
- 48h DWORD SizeOfStackReserve;
- 4Ch DWORD SizeOfStackCommit;
- 50h DWORD SizeOfHeapReserve;
- 54h DWORD SizeOfHeapCommit;
- 58h DWORD LoaderFlags;
- 5Ch DWORD NumberOfRvaAndSizes;
- 60h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
- }
- IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
- */
-
- PIMAGE_OPTIONAL_HEADER OptionalHeaderPE = &HeaderPE->OptionalHeader;
- printf("\nEntry Point : 0x%x", OptionalHeaderPE->AddressOfEntryPoint);
- printf("\nBase Of Code : 0x%x", OptionalHeaderPE->BaseOfCode);
- printf("\nBase Of Data : 0x%x", OptionalHeaderPE->BaseOfData);
- printf("\nImage Base : 0x%x", OptionalHeaderPE->ImageBase);
- printf("\nSize Of Code : 0x%x", OptionalHeaderPE->SizeOfCode);
- printf("\nSize Of Image : 0x%x", OptionalHeaderPE->SizeOfImage);
- printf("\nSize Of Header : 0x%x", OptionalHeaderPE->SizeOfHeaders);
-
- /*
- typedef struct _IMAGE_FILE_HEADER
- {
- 0h WORD Machine;
- 2h WORD NumberOfSections;
- 4h DWORD TimeDateStamp;
- 8h DWORD PointerToSymbolTable;
- Ch DWORD NumberOfSymbols;
- 10h WORD SizeOfOptionalHeader;
- 12h WORD Characteristics;
- }
- IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
- */
- PIMAGE_FILE_HEADER FileHeader = &HeaderPE->FileHeader;
- printf("\nNumber Of Sections : %d", FileHeader->NumberOfSections);
-
- /*
- typedef struct _IMAGE_SECTION_HEADER {
- BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
- union {
- DWORD PhysicalAddress;
- DWORD VirtualSize;
- } Misc;
- DWORD VirtualAddress;
- DWORD SizeOfRawData;
- DWORD PointerToRawData;
- DWORD PointerToRelocations;
- DWORD PointerToLinenumbers;
- WORD NumberOfRelocations;
- WORD NumberOfLinenumbers;
- DWORD Characteristics;
- } IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
- */
-
- PIMAGE_SECTION_HEADER Section;
- Section = (PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION(HeaderPE);
- for(int i = 0; i <= FileHeader->NumberOfSections-1; i++)
- {
- printf("\n\n----------| Section : [%s] |----------", Section[i].Name);
- printf("\n [+] Virtual Size : 0x%x", Section[i].Misc.VirtualSize);
- printf("\n [+] Virtual Address : 0x%x", Section[i].VirtualAddress);
- printf("\n [+] Size Of Raw Data : 0x%x", Section[i].SizeOfRawData);
- printf("\n [+] Ponter To Raw Data : 0x%x", Section[i].PointerToRawData);
- printf("\n [+] Pointer To Relocations : 0x%x", Section[i].PointerToRelocations);
- printf("\n [+] Pointer To Line Numbers : 0x%x", Section[i].PointerToLinenumbers);
- printf("\n [+] Characteristics : %x", Section[i].Characteristics);
- }
-
- /*
- typedef struct _IMAGE_IMPORT_DESCRIPTOR {
- _ANONYMOUS_UNION union {
- DWORD Characteristics;
- DWORD OriginalFirstThunk;
- } DUMMYUNIONNAME;
- DWORD TimeDateStamp;
- DWORD ForwarderChain;
- DWORD Name;
- DWORD FirstThunk;
- } IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
- */
- printf("\n\n\n--------------------| Import Table |--------------------");
- PIMAGE_IMPORT_DESCRIPTOR pIATDesc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)OptionalHeaderPE->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (DWORD)structPE);
-
- while(*(PDWORD)pIATDesc != 0)
- {
- printf("\n");
- /*
- typedef struct _IMAGE_THUNK_DATA32 {
- union {
- DWORD ForwarderString;
- DWORD Function;
- DWORD Ordinal;
- DWORD AddressOfData;
- } u1;
- } IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
- */
- PIMAGE_THUNK_DATA32 ThunkImg = (PIMAGE_THUNK_DATA32)((DWORD)pIATDesc->OriginalFirstThunk + (DWORD) structPE);
-
-
- while(*(PDWORD)ThunkImg != 0)
- {
- /*
- typedef struct _IMAGE_IMPORT_BY_NAME {
- WORD Hint;
- BYTE Name[1];
- } IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
- */
-
- PIMAGE_IMPORT_BY_NAME pFuncName = (PIMAGE_IMPORT_BY_NAME)(ThunkImg->u1.AddressOfData + (DWORD)structPE);
- printf("\n [+] Function : %s -> Address : 0x%x", pFuncName->Name, ThunkImg->u1.Function);
- ThunkImg++;
- }
- pIATDesc++;
- }
- }
- else
- printf("\n[!]Not a PE format");
- }
- else
- printf("\n[!]Not a DOS executable");
- }
- printf("\n\n");
- system("pause");
- return 0;
- }
-
#include <windows.h>
#include <iostream>
int main()
{
printf("-------------------------------/ PE analyser \\-------------------------------\n\n");
HANDLE hProgram = GetModuleHandle(NULL);
if(hProgram != NULL)
{
/*
typedef struct _IMAGE_DOS_HEADER // DOS .EXE header
{
0h WORD e_magic; // Magic number
2h WORD e_cblp; // Bytes on last page of file
4h WORD e_cp; // Pages in file
6h WORD e_crlc; // Relocations
8h WORD e_cparhdr; // Size of header in paragraphs
Ah WORD e_minalloc; // Minimum extra paragraphs needed
Ch WORD e_maxalloc; // Maximum extra paragraphs needed
Eh WORD e_ss; // Initial (relative) SS value
10h WORD e_sp; // Initial SP value
12h WORD e_csum; // Checksum
14h WORD e_ip; // Initial IP value
16h WORD e_cs; // Initial (relative) CS value
18h WORD e_lfarlc; // File address of relocation table
1Ah WORD e_ovno; // Overlay number
1Ch WORD e_res[4]; // Reserved words
24h WORD e_oemid; // OEM identifier (for e_oeminfo)
26h WORD e_oeminfo; // OEM information; e_oemid specific
28h WORD e_res2[10]; // Reserved words
3Ch LONG e_lfanew; // File address of new exe header
}
IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
*/
PIMAGE_DOS_HEADER structPE = (PIMAGE_DOS_HEADER) hProgram;
printf("\nMagic Number : %x", structPE->e_magic);
if(structPE->e_magic == 0x5a4d) //0x5a4d -> MZ -> IMAGE_DOS_SIGNATURE
{
/*
typedef struct _IMAGE_NT_HEADERS
{
0h DWORD Signature;
4h IMAGE_FILE_HEADER FileHeader;
18h IMAGE_OPTIONAL_HEADER OptionalHeader;
}
IMAGE_NT_HEADERS, *PIMAGE_NT_HEADERS;
*/
PIMAGE_NT_HEADERS HeaderPE = (PIMAGE_NT_HEADERS)(structPE->e_lfanew+ (DWORD)structPE);
printf("\nHeader Signature : %x", HeaderPE->Signature);
if(HeaderPE->Signature == 0x4550) // 0x00004550 -> PE00 -> IMAGE_NT_SIGNATURE
{
/*
typedef struct _IMAGE_OPTIONAL_HEADER
{
0h WORD Magic;
2h BYTE MajorLinkerVersion;
3h BYTE MinorLinkerVersion;
4h DWORD SizeOfCode;
8h DWORD SizeOfInitializedData;
Ch DWORD SizeOfUninitializedData;
10h DWORD AddressOfEntryPoint;
14h DWORD BaseOfCode;
18h DWORD BaseOfData;
1Ch DWORD ImageBase;
20h DWORD SectionAlignment;
24h DWORD FileAlignment;
28h WORD MajorOperatingSystemVersion;
2Ah WORD MinorOperatingSystemVersion;
2Ch WORD MajorImageVersion;
2Eh WORD MinorImageVersion;
30h WORD MajorSubsystemVersion;
32h WORD MinorSubsystemVersion;
34h DWORD Win32VersionValue;
38h DWORD SizeOfImage;
3Ch DWORD SizeOfHeaders;
40h DWORD CheckSum;
44h WORD Subsystem;
46h WORD DllCharacteristics;
48h DWORD SizeOfStackReserve;
4Ch DWORD SizeOfStackCommit;
50h DWORD SizeOfHeapReserve;
54h DWORD SizeOfHeapCommit;
58h DWORD LoaderFlags;
5Ch DWORD NumberOfRvaAndSizes;
60h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
}
IMAGE_OPTIONAL_HEADER, *PIMAGE_OPTIONAL_HEADER;
*/
PIMAGE_OPTIONAL_HEADER OptionalHeaderPE = &HeaderPE->OptionalHeader;
printf("\nEntry Point : 0x%x", OptionalHeaderPE->AddressOfEntryPoint);
printf("\nBase Of Code : 0x%x", OptionalHeaderPE->BaseOfCode);
printf("\nBase Of Data : 0x%x", OptionalHeaderPE->BaseOfData);
printf("\nImage Base : 0x%x", OptionalHeaderPE->ImageBase);
printf("\nSize Of Code : 0x%x", OptionalHeaderPE->SizeOfCode);
printf("\nSize Of Image : 0x%x", OptionalHeaderPE->SizeOfImage);
printf("\nSize Of Header : 0x%x", OptionalHeaderPE->SizeOfHeaders);
/*
typedef struct _IMAGE_FILE_HEADER
{
0h WORD Machine;
2h WORD NumberOfSections;
4h DWORD TimeDateStamp;
8h DWORD PointerToSymbolTable;
Ch DWORD NumberOfSymbols;
10h WORD SizeOfOptionalHeader;
12h WORD Characteristics;
}
IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
*/
PIMAGE_FILE_HEADER FileHeader = &HeaderPE->FileHeader;
printf("\nNumber Of Sections : %d", FileHeader->NumberOfSections);
/*
typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
*/
PIMAGE_SECTION_HEADER Section;
Section = (PIMAGE_SECTION_HEADER)IMAGE_FIRST_SECTION(HeaderPE);
for(int i = 0; i <= FileHeader->NumberOfSections-1; i++)
{
printf("\n\n----------| Section : [%s] |----------", Section[i].Name);
printf("\n [+] Virtual Size : 0x%x", Section[i].Misc.VirtualSize);
printf("\n [+] Virtual Address : 0x%x", Section[i].VirtualAddress);
printf("\n [+] Size Of Raw Data : 0x%x", Section[i].SizeOfRawData);
printf("\n [+] Ponter To Raw Data : 0x%x", Section[i].PointerToRawData);
printf("\n [+] Pointer To Relocations : 0x%x", Section[i].PointerToRelocations);
printf("\n [+] Pointer To Line Numbers : 0x%x", Section[i].PointerToLinenumbers);
printf("\n [+] Characteristics : %x", Section[i].Characteristics);
}
/*
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
_ANONYMOUS_UNION union {
DWORD Characteristics;
DWORD OriginalFirstThunk;
} DUMMYUNIONNAME;
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
*/
printf("\n\n\n--------------------| Import Table |--------------------");
PIMAGE_IMPORT_DESCRIPTOR pIATDesc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)OptionalHeaderPE->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (DWORD)structPE);
while(*(PDWORD)pIATDesc != 0)
{
printf("\n");
/*
typedef struct _IMAGE_THUNK_DATA32 {
union {
DWORD ForwarderString;
DWORD Function;
DWORD Ordinal;
DWORD AddressOfData;
} u1;
} IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
*/
PIMAGE_THUNK_DATA32 ThunkImg = (PIMAGE_THUNK_DATA32)((DWORD)pIATDesc->OriginalFirstThunk + (DWORD) structPE);
while(*(PDWORD)ThunkImg != 0)
{
/*
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME,*PIMAGE_IMPORT_BY_NAME;
*/
PIMAGE_IMPORT_BY_NAME pFuncName = (PIMAGE_IMPORT_BY_NAME)(ThunkImg->u1.AddressOfData + (DWORD)structPE);
printf("\n [+] Function : %s -> Address : 0x%x", pFuncName->Name, ThunkImg->u1.Function);
ThunkImg++;
}
pIATDesc++;
}
}
else
printf("\n[!]Not a PE format");
}
else
printf("\n[!]Not a DOS executable");
}
printf("\n\n");
system("pause");
return 0;
}
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Besoin d'un connaisseur en format PE/COFF [ par Kangourou_Nomade ]
Bonjour,je travaille sur un logiciel permettant de lister les dependances d'une image PE sous windows (DLL, EXE, OCX), exactement comme Depends, en mo
convertir format mac to dos [ par deutant ]
en compilant un fichier c++ que j ai récupére du net, l erreur suivante est apparue:error C4335: Format de fichier Mac détecté : convertissez le fichi
Transformer un char* en format Timestamp [ par IceFinger ]
Voila, mon probleme est simple, je suis totalement debutant en c, et je dois copier un data file dans une base de donnees. Seulement dans ce fichier l
fichier cso et Alcohol 120% [ par igore62 ]
bonjour avant je monté une image au format cso avec Alcohol 120% mais j ai du formaté mon pc cause de probleme après reinstallation de Alcohol 120% je
error pixel format [ par dark_naruto25 ]
Salut tout le monde !Je viens de me mettre à OpenGL et je rencontre déjà un problème à l'exécution du programme :GLUT: Fatal Error in Cube tournant.ex
Afficher JPEG avec DirectX [ par Roro8883 ]
Bonjour, je souhaite faire une mini visionneuse de photos pour un vieil ordinateur.Mais le problème c'est que jusqu'à maintenant, je n'utilisais que d
[C++ Builder] Comment charger un JPG puis le gérer ensuite comme un BMP ? [ par MikeGyver ]
Bonjour à tous !Je suis en train de concevoir un petit soft qui permettrait de redimensionner, recadrer, etc...des photos issues d'un APN afin de les
infos des boites de dialogue format et compression vidéo [ par steph12358 ]
Bonjour à tousquelqu'un connait-il un moyen de récupérer les informations qui peuvent être renseignées par l'utilisateur lors de l'appel de ? capDlgVi
ecriture d'un caractère au format exposant [ par toxjamescook ]
Bonjour,j'utilise borland c++ builder et j'aimerais pouvoir écrire un label du genre m3/h avec le trois sous format exposant.j'aimerais savoir quel es
format d'affichage d'un double [ par infodaoudi ]
bonjour,je veux afficher des doubles de facon à ce qu'il contiennent un nombre fixe de chiffre apres la virguleexp 0.2222je programme en c++, existe i
|
Derniers Blogs
SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|