N-PN White-Hat Project
[C++] Problème d'entier non signé - Version imprimable

+- N-PN White-Hat Project (https://dev.n-pn.fr/forum)
+-- Forum : Programmation (https://dev.n-pn.fr/forum/forumdisplay.php?fid=72)
+--- Forum : Langages compilés (https://dev.n-pn.fr/forum/forumdisplay.php?fid=25)
+--- Sujet : [C++] Problème d'entier non signé (/showthread.php?tid=2003)



[C++] Problème d'entier non signé - Illu6 - 18-04-2012

Salut à tous,
Voilà j'ai un petit problème avec le format PE et le C++, j'essaye de récupérer et d'afficher la "signature" d'un fichier, mais ça cause une erreur, pas à la compilation mais quand je le lance (... a cessé de fonctionner...)
Voilà le code qui, je pense, génère cette erreur:
Code PHP :
                std::cout << "[*] IMAGE_NT_HEADERS\n";
                
std::cout << "\t Signature: " << static_cast<unsigned int>(pNTHeaders->Signature) << "\n " << std::endl
Le "pNTHeaders" vient de
Code PHP :
                PIMAGE_NT_HEADERS pNTHeaders GetPEHeaders(argv[1]); 
et enfin la fonction GetPEHeaders:
Code PHP :
PIMAGE_NT_HEADERS GetPEHeaders(HANDLE hBinary)
{
    
PIMAGE_NT_HEADERS pNTHeaders NULL;
    
PIMAGE_DOS_HEADER pDOSHeader GetDOSHeader(hBinary);
    
pNTHeaders = (PIMAGE_NT_HEADERS)((PUCHAR)pDOSHeader pDOSHeader->e_lfanew); 
    return 
pNTHeaders;

Merci d'avance
(Compilé sous Visual C++, lancé sous Windows 7 64bits)
EDIT: La fonction GetDOSHeader:
Code PHP :
PIMAGE_DOS_HEADER GetDOSHeader(HANDLE hBinary)
{
    
PIMAGE_DOS_HEADER pDOSHeader NULL;
    
pDOSHeader static_cast<PIMAGE_DOS_HEADER>(hBinary);
    return 
pDOSHeader;




RE: Problème d'entier non signé (C++) - supersnail - 18-04-2012

Bonjour,

Ton code ne pourra jamais marcher, étant donné que argv[1] est un pointeur vers le premier caractère de ton argument...
Du coup tu essaies de parser le PE header de ta chaîne de caractère (ou de la stack qu'il y a derrière), ce qui risque de se révéler assez difficile Wink


RE: Problème d'entier non signé (C++) - Illu6 - 18-04-2012

Salut, ça me paraît bizarre, car les deux première fonctions:
Code PHP :
std::cout << "[*] IMAGE_DOS_HEADER\n";
std::cout << "\t e_magic: " << pDOSHeaders->e_magic << std::endl;
std::cout << "\t e_lfanew: " <<  static_cast<int>(pDOSHeaders->e_lfanew) << " \n" <<  std::endl
me retournent bien:
Citation :
[*] IMAGE_DOS_HEADER
e_magic: 14915
e_lfanew: 1



RE: Problème d'entier non signé (C++) - supersnail - 18-04-2012

Ton e_magic en hexa donne 0x3A43, ce qui donne en little-endian 0x43 0x3A (tu peux vérifier à la calculette) qui correspond à "C:" au lieu du "MZ" attendu.

Et je suppose que "C:" est le début du path du fichier dont tu veux explorer le PE header ce qui rejoint ce que je disais (tu parses le PE header de ta chaîne de caractères ) :')

Ihmo tu devrais faire un LoadLibrary ou un CreateFile/MapViewOfFile pour avoir un handle exploitable Wink


RE: Problème d'entier non signé (C++) - Illu6 - 18-04-2012

Merci de ton aide, c'était bien le problème.