2010-06-03 6 views
0

J'ai un problème mon pointeur src de memcpy pointe malC++ problème memcpy :(

unsigned char* lpBuffer est un tampon qui contient mes octets,

J'ai vérifié avec olly Le code:.

IMAGE_DOS_HEADER iDOSh; 
memcpy(&iDOSh,lpBuffer,sizeof(iDOSh)); 

Le problème est que les points lpBuffer mauvais, la sortie du débogueur est

dest = 002859E8 RIGHT 
src = 000001D8 FALSE 

src est invalide POINTAGE :(Je ne sais pas pourquoi

Merci pour la lecture

+0

Comment obtenez-vous les valeurs de dest et src? –

+4

@ Simon, le code que vous avez là n'explique pas votre problème. Si votre pointeur est mauvais, ce n'est pas la faute de 'memcpy'. –

+0

Les valeurs de dest et de src ont été vérifiées avec olly, juste BPed memcpy et ont regardé la pile – Simon

Répondre

4

Pourquoi vous vérifiez avec ollydbg mais pas quelque chose de plus pratique ?? Suivez vos étapes dans votre IDE. La valeur d'un pointeur ne peut pas changer devenir invalide lorsque vous le passez à la fonction memcpy (car elle est transmise par valeur), donc cela signifie qu'elle a été invalide juste avant cet appel memcpy.

Malheureusement, votre code ne couvre que l'appel évident memcpy"rien ne peut aller mal".

également mentionner, cette valeur 0x00000YY étrange pour votre pointeur signe en fait que quelque chose a mal tourné et probablement vous avez jeté type non valide quelque part dans votre code (ou quelque chose comme ça).

0

Vérifiez immédiatement la valeur de lpBuffer avant d'appeler memcpy et de nouveau immédiatement après. Est-ce que ça change? Si elle change, la seule chose qui aurait pu changer la valeur dans lpBuffer est le memcpy, ce qui signifie que vous l'écrasez dans l'appel (c'est-à-dire qu'il ne fait pas ce que vous pensez qu'il fait ... vérifiez vos paramètres).

Ma conjecture, cependant, en regardant votre code est que cela ne change probablement pas dans l'appel à memcpy. C'est-à-dire que si vous vérifiez la valeur de lpBuffer immédiatement avant et après montre qu'elle reste inchangée, vous la modifiez par inadvertance avant d'appeler le memcpy. Vous devrez suivre ce changement.

1

Je pense que vous êtes en train de déboguer dans l'assemblage appelant des fonctions C et essayant de tracer cela avec ollydbg (j'ai juste cherché ce que c'est et basé cette hypothèse sur leur liste de fonctionnalités). C'est très difficile à faire.

Je vous suggère de faire:

... 
void print_ptr(void * p) { 
    fprintf(stderr, "%p\n", p); 
} 
... 
    IMAGE_DOS_HEADER iDOSh; 

    print_ptr(lpBuffer); 
    memcpy(&iDOSh,lpBuffer,sizeof(iDOSh)); 
    print_ptr(lpBuffer); 

Si vous n'êtes pas réellement en mesure d'imprimer des choses qui seront ok. Faites simplement les fonctions extern dans le fichier avec le memcpy en question et cela forcera le compilateur à charger la valeur dans l'emplacement qui contient le premier paramètre. Vous devriez être capable d'observer ceci dans votre débogueur.

La probabilité que le memcpy (de toute bibliothèque C raisonnable) soit en train de faire quelque chose de mal est très très faible.

Si je devais deviner ce qui ne va pas, il se pourrait que lpBuffer ne soit pas censé être un void * mais une étiquette de liaison pour un emplacement de mémoire. Dans ce cas, vous pourriez devriez essayer déclarer comme:

extern char lpBuffer[]; 

et faites votre memcpy comme

memcpy(&iDOSh,lpBuffer,sizeof(iDOSh)); 

ou

extern IMAGE_DOS_HEADER lpBuffer; 

et faites votre memcpy comme

memcpy(&iDOSh,&lpBuffer,sizeof(iDOSh)); 
Questions connexes