2013-05-26 2 views
0

기본적으로 압축 해제되는 (하드 코드 된) 데이터에 대한 포인터를 가져 오는 자체 압축 풀기 프로그램을 만들고 버퍼를 추가합니다. 여기에서 작업을 수행 할 때,Win32 C++ - Memcpy 함수 - 액세스 위반 오류

는 그러나, 나는 문제가 발생하여, 나는 내 방어 적이기 함수에서 버퍼 오버런 오류가 발생하는 것, 나는 memcpy_s을 시도했지만 같은 문제가 발생합니다 : 함수가 왜

난 정말 이해할 수 없다 내가 올바른 크기와 메모리에 할당 된 영역으로 데이터를 이동하고 같이 작동하지

LPVOID ExtractPayload(HINSTANCE _hInstance) 
{ 
DWORD m_ptr = NULL; 
PIMAGE_NT_HEADERS m_pntHeader; 
PIMAGE_DOS_HEADER m_pdosHeader; 
PIMAGE_SECTION_HEADER m_psectionHeader; 
m_pdosHeader = (PIMAGE_DOS_HEADER)_hInstance; // we don't need to make checks 
m_pntHeader = (PIMAGE_NT_HEADERS)((DWORD)m_pdosHeader + m_pdosHeader->e_lfanew); 
m_psectionHeader = (PIMAGE_SECTION_HEADER)((DWORD_PTR)m_pntHeader + sizeof(IMAGE_NT_HEADERS) + (40 * 4)); // pointing to desired section header 

LPVOID m_pvFileBuffer = NULL; 

SYSTEM_INFO si; 
GetSystemInfo(&si); 
printf("Virtual size %d\n",m_psectionHeader->Misc.VirtualSize); 
int m_pageNumber = (m_psectionHeader->Misc.VirtualSize/si.dwPageSize); 
if ((m_psectionHeader->Misc.VirtualSize % si.dwPageSize) > 0) 
{ 
    m_pageNumber++; 
    printf("pages : %i\n",m_pageNumber); 
    printf("page size: %i\n", si.dwPageSize); 
} 

m_pvFileBuffer = VirtualAlloc(NULL, (si.dwPageSize*m_pageNumber), MEM_RESERVE, PAGE_NOACCESS); 

for (unsigned int i = 0; i < m_pageNumber*si.dwPageSize; i += si.dwPageSize) 
    { 
     // we need a char* to pointer arithmetic with 
     char* p = reinterpret_cast<char*>(m_pvFileBuffer); 

     // reserve the ith page 
     VirtualAlloc(p + i, si.dwPageSize, MEM_COMMIT, PAGE_READWRITE); 
    } 
printf("lpvoid : %d",m_pvFileBuffer); 
m_ptr = Rva2Offset(m_psectionHeader->VirtualAddress,m_psectionHeader,m_pntHeader->FileHeader.NumberOfSections); 

memcpy(m_pvFileBuffer,(DWORD*)m_ptr,m_psectionHeader->Misc.VirtualSize); 
//memcpy(&m_pvFileBuffer,&m_ptr,m_psectionHeader->Misc.VirtualSize); // buffer over-run here 
//VirtualFree(m_pvFileBuffer,m_psectionHeader->Misc.VirtualSize,MEM_RELEASE); 
cin.get(); 
return m_pvFileBuffer; 
} 
여기

오류입니다 : 또한

First-chance exception at 0x002f16f3 in Stub.exe: 0xC0000005: Access violation reading location 0x00002a00. A buffer overrun has occurred in Stub.exe which has corrupted the program's internal state. Press Break to debug the program or Continue to terminate the program. For more details please see Help topic 'How to debug Buffer Overrun Issues'. 

, 코드 나누기 여기로 이동 :

Code break

내가 읽을 수없는 부분의를 메모리 (읽기를 시도하고 있다는 의심을 데이터), 그러나 나는

이 시간 내 주셔서 감사, 확실입니다.

+1

도움이 될 것이다 당신의 오류 메시지가 표시 : VirtualSize는 dwPageSize()의 배수가되지 않을 수 있습니다 경우

그냥 경우, 분할은 다음과 같이해야한다. 아이디어 : 디버깅에 memcpy_s (가) 실행 각지에서 대상을 보호하는 데 도움이,하지만 및 방어 적이기()는 SRC 및 이명 령 포인터를 확인하지 않습니다. 한 번에 각 바이트를 역 참조 루프를함으로써 SRC의 유효성을 검사 대상과 동일 할. 이것에 대한 – chux

답변

0
int m_pageNumber = (m_psectionHeader->Misc.VirtualSize/si.dwPageSize); 

이 페이지 수 가능성을 뺀까지 크기를 반올림합니다. VirtualSize가 dwPageSize의 배수 여야합니까? 나중에 있기 때문에 당신이 할 :

memcpy(m_pvFileBuffer,(DWORD*)m_ptr,m_psectionHeader->Misc.VirtualSize); 

및 VirtualSize는 dwPageSize의 배수가 아닌 경우 다음까지 방어 적이기에 가고있다().

VirtualAlloc()이 모든 페이지를 적절하게 할당하는지 여부를 잘 알지 못하지만 다른 문제는 함수가 생각한 것을 수행하지 않아서 페이지 작성이 메모리를 생성한다는 것입니다. 위반.

int m_pageNumber = ((m_psectionHeader->Misc.VirtualSize + si.dwPageSize - 1)/si.dwPageSize); 
+0

덕분에, 나는 그것을 감사드립니다. 그러나 나는 여전히 memcpy 함수를 통해 에러를 얻었고 디버깅을 시도 할 것이다. – James