기본적으로 압축 해제되는 (하드 코드 된) 데이터에 대한 포인터를 가져 오는 자체 압축 풀기 프로그램을 만들고 버퍼를 추가합니다. 여기에서 작업을 수행 할 때,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'.
, 코드 나누기 여기로 이동 :
내가 읽을 수없는 부분의를 메모리 (읽기를 시도하고 있다는 의심을 데이터), 그러나 나는
이 시간 내 주셔서 감사, 확실입니다.
도움이 될 것이다 당신의 오류 메시지가 표시 : VirtualSize는 dwPageSize()의 배수가되지 않을 수 있습니다 경우
그냥 경우, 분할은 다음과 같이해야한다. 아이디어 : 디버깅에 memcpy_s (가) 실행 각지에서 대상을 보호하는 데 도움이,하지만 및 방어 적이기()는 SRC 및 이명 령 포인터를 확인하지 않습니다. 한 번에 각 바이트를 역 참조 루프를함으로써 SRC의 유효성을 검사 대상과 동일 할. 이것에 대한 – chux