2013-02-26 5 views
0

내 프로그램이 앱 검증기에서 충돌하고 있으며 충돌을 완전히 이해하지 못했습니다. dwSizeBytes (나는 크래시 덤프에서 볼 수 있습니다)App Verifier 오류 패턴`fafa`의 의미는 무엇입니까?

DWORD dwSizeBytes = (DWORD)liSize.QuadPart+2; 
TCHAR* JSONBufferW = new TCHAR [dwSizeBytes/sizeof(TCHAR)]; 
memset(JSONBufferW, 0, dwSizeBytes); 

38입니다 : 동적으로 파일의 바이트 수에서 이렇게 할당 된 버퍼를 가지고있다. 이후 나는 파일에서 일부 데이터를 읽어

if(!ReadFile(hFile, JSONBufferW, dwSizeBytes, &dwSizeBytes, NULL)) 
{ 
    status = GetLastError(); 
    TRACE_ERROR(g_hTrace, "ReadFile() failed for %S, error code=%d", strCompletePath, status); 
} 

36 버퍼가 NULL 종료되도록 버퍼 NULL의 마지막 2 바이트를 떠나 dwSizeBytes에 할당합니다. 그러나 응용 프로그램 검증 자 아래에서 버퍼에서 std::wstring을 생성하려고 시도하면 충돌이 발생합니다.

0:022> dd 0x00000000`07560fd0-0x48 0x00000000`07560fd0 
00000000`07560f88 00001000 00000000 abcdbbbb 00000000 
00000000`07560f98 07191000 00000000 00000026 00000000 
00000000`07560fa8 00001000 00000000 00000000 00000000 
00000000`07560fb8 00000000 00000000 0025a230 00000000 
00000000`07560fc8 00001000 dcbabbbb 0022007b 

참고가 내 버퍼를 보여줍니다 0x26의 크기가 38 있어야하는데 : 나는 WinDBG에서의 버퍼의 할당 블록을 볼 때

는 나는이처럼 보이는 것을 알 수있다. 지금은 버퍼 보면 그것은 자기의 볼 :

0:022> dc 0x00000000`07560fd0 
00000000`07560fd0 0022007b 006f006d 00650064 003a0022 {.".m.o.d.e.".:. 
00000000`07560fe0 006d0022 006e0061 00610075 0022006c ".m.a.n.u.a.l.". 
00000000`07560ff0 000a007d d0d0fafa d0d0d0d0 d0d0d0d0 }............... 

이 내 버퍼가 ReadFile에 의해 작성되었지만 NULL합니다 (memset 함수를 기억) buf[36]buf[37]에 남아 있어야하는 곳이다 앱 검증이 그래서 d0d0fafa 후 실제로 유니 코드 바이트 뒤집 기억 (코드 fafa을 채우기

을 내가 here를 검토 한 :.. 응용 프로그램 검증이이 코드를 할당 한 후 그러나 fafa가 표시되지 채우기 잎 어떻게 나에게 보여 주었다있는, 그래서 어떻게합니까 왜? 그리고 왜? memset이 정리해야하는 곳입니까?

+1

나는 디버깅을 잘 따르지 않는다는 것을 인정해야하지만, 내 눈을 사로 잡는 것은 새로운 TCHAR [dwSizeBytes/sizeof (TCHAR)]이다. 이 정수부는 *로 반올림되므로'dwSizeBytes'를 읽을 때'JSONBufferW'를 오버런시킵니다. 사실,'memset '조차도 할당 된 메모리 영역의 경계를 덮어 씁니다. – us2012

+0

이 경우 'dwSizeBytes'는 짝수이고 sizeof (TCHAR)는 2이므로 좋은 점입니다. 그래야 정상입니다. 파일은 UTF16으로 가득 차 있기 때문에 실제로는 문제가되지 않아야합니다. – Benj

+0

'ReadFile'과'wstring ctor' 사이에서 당신은 무엇을하고 있습니까? 'ReadFile' 다음에 버퍼 내용을 직접 확인 했습니까? 상식은'ReadFile'은 버퍼에 36 바이트 만 썼다는 것을 암시하지만 ReadFile이 나머지 버퍼 (마지막 두 바이트)를 수정하는 것을 금지하는 문서에서 문장을 찾을 수 없습니다. 그래서'ReadFile'을 호출하기 전에 dwSizeBytes를 36으로 설정할 때 어떤 결과가 나옵니까? –

답변

1

현재로서는 소스가 없지만 AppVerifier의 기능 중 하나는 ReadFile을 호출하기 전에 버퍼로 패턴을 완전히 채 웁니다. 38 바이트를 읽으라는 요청을하면 AppVerifier는 38 바이트의 패턴으로 버퍼를 채우고 ReadFile은 파일에서 36 바이트 만 읽습니다. 따라서 마지막 2 바이트는 예상 된 NULL 문자가 아닌 채우기 패턴입니다.

+0

흠, 그럴듯하게 들리 겠지만 이상한'fafa' 패턴을 설명 할 수 있습니다. 건배. – Benj