2012-04-15 1 views
1
unsigned char* Data::getAddress(unsigned char* address) 
{ 
    strcpy((char*)address, (char*)this->_address); 
    return (unsigned char*)address; 
} 

int main() 
{ 
    Data d; 
    d.makealinkedlisthere(); 
    while (d) 
    { 
     unsigned char address[256]; 
     printf("0x%08x \r\n",d.getAddress(address)); 
     d = d.getNext(); 
    } 
    return 0; 
} 

처음 두 개를 반환합니다 (동일하며 디버거와 다를 수 있습니다 ...) 다음 충돌이 발생합니다.C/C++ strcpy 처리되지 않은 읽기 위반

그냥 링크 된 목록을 만듭니다. 보호 된 회원 Data* _next ... 그들 체인.

unsigned char *는 데이터 구조의 일부인 Windows 기능 VirtualQueryEx의 일부입니다.

this->_address = (unsigned char*)meminfo->BaseAddress; // casted from void* 

void *이지만 다른 코드에서는 unsigned char *로 변환되어 나타납니다. 디버거에서 16 진수로 표시되는 것을 볼 수 있습니다.

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

makealinkedlisthere() 함수의 소스 코드를 표시하십시오. – Flot2011

+0

충분한 정보를 제공하지 않았습니다. 'Data :: makealinkedlistthere'는 무엇을합니까? –

+0

여기에서 무슨 일이 일어나고 있는지 알아보기 위해 데이터에 대한 자세한 정보를 제공해야합니다. 특히'makealinkedlisthere'와'getNext'. 루프가 매우 의심스러워 보입니다. – quamrana

답변

2

MEMORY_BASIC_INFORMATION.Base 주소는 페이지의 영역의 위치가 아닌 문자열, 그것이 null 종료 될 수없는 것은 보증은 없습니다. 은 MSDN 사이트에서 당신은 당신이 크기로 memcpy = 255` 사용해야의 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; 

데이터를 복사하려면 볼 수 있습니다. 코드로 다시 찾고

은, RegionSize를 저장하는 것이 안전 할 것입니다 및 경계 확인을 할

도 있습니다 작동합니다

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; 
} 

로 변경, 다른 문제가없는 제공 memcpy 전.

+0

OP는 실제로 MEMORY_BASIC_INFORMATION 구조체가 아닌 BaseAddress 만 사용합니다. 따라서 '_address'는 PVOID 여야하며 간단한 할당으로 복사 할 수 있습니다. –

+0

@ MrLister : 나는 그것을 간과했다. 내 대답을 업데이트했습니다. – Abhijit