2012-04-15 12 views
1

Es gibt die ersten zwei zurück (die gleich ist, und es sollte anders sein [kann vom Debugger] ...) dann stürzt ab.C/C++ strcpy unbehandelte Leseverstoß

Es macht nur eine verkettete Liste. geschütztes Mitglied Data* _next ... eine Kette von ihnen.

Das unsigned char * ist von Windows-Funktion VirtualQueryEx Teil der MEMORY_BASIC_INFORMATION Datenstruktur, die es zurückgibt.

Es ist void *, aber ich sehe es in unsigned char * in anderen Codes umgewandelt. Im Debugger kann ich es als Hexadezimalzahl darstellen.

D1: + _address 0x7ffd5000 <Bad Ptr> unsigned char * 
D1->_next:+ _address 0x7f6f0000 "áå•ú`©" unsigned char * 
D1->_next->_next+ _address 0x7ffb0000 " " unsigned char * 
+1

Bitte den Quellcode der Funktion makealinkedlisthere() anzeigen – Flot2011

+0

Sie haben nicht genügend Informationen zur Verfügung gestellt. Was macht 'Data :: makealinkedlistthere'? –

+0

Sie müssen uns mehr Informationen über Daten zur Verfügung stellen, um herauszufinden, was hier vor sich geht. Insbesondere 'makealinkedlisthere' und' getNext'. Die Schleife sieht übrigens sehr verdächtig aus. – quamrana

Antwort

2

MEMORY_BASIC_INFORMATION.Base-Adresse ist die Lage der Region von Seiten und kein String und es gibt keine gurantee, dass es würde null beendet werden. Aus der MSDN-Website können Sie die MEMORY_BASIC_INFORMATION structure

typedef struct _MEMORY_BASIC_INFORMATION { 
    PVOID BaseAddress; 
    PVOID AllocationBase; 
    DWORD AllocationProtect; 
    SIZE_T RegionSize; 
    DWORD State; 
    DWORD Protect; 
    DWORD Type; 
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 

sehen die Daten zu kopieren, Sie memcpy mit Größe verwenden sollte = 255`.

, um Ihren Code Im Rückblick, sofern es keine anderen Probleme ist, es zu

Ändern
PVOID Data::getAddress(PVOID address,size) {  
    memcpy((address, (void *)this->_address, size); 
    address[size]=NULL; 
    return address; 
} 
int main() { 
    Data d; 
    d.makealinkedlisthere(); 
    while (d) { 
     unsigned char address[256]; 
     printf("Address: 0x%08x \n",d.getAddress((PVOID)address),sizeof(address)); 
     printf("Data: %s\n",(LPSTR)d.getAddress((PVOID)address),sizeof(address)); 
     d = d.getNext(); 
    } 
    return 0; 
} 

funktionieren sollte

Bitte beachten Sie auch, wäre es sicher RegionSize zu speichern und eine Überprüfung der Grenzen zu tun vor memcpy.

+0

Das OP verwendet tatsächlich nur BaseAddress, nicht die gesamte MEMORY_BASIC_INFORMATION-Struktur. Also '_address' sollte eine PVOID sein und kann durch einfache Zuweisung kopiert werden. –

+0

@MrLister: Ich habe es übersehen. Ich habe meine Antwort aktualisiert – Abhijit