2013-04-22 3 views
0

충돌 지침 (액세스 위반이 발생합니다 다음 중 하나) :FS 레지스터 액세스 위반 7

LODS BYTE PTR FS:[ESI] 
LODS WORD PTR FS:[ESI] 
LODS DWORD PTR FS:[ESI] 

나는 포트에 Windows 95 게임을 시도하는 클라이언트하지만 같은 충돌을 해결하기 위해 노력하고있다 사용할 수있는 소스 코드가 없습니다. 현재 어셈블리에서 디버깅 중입니다. 이 응용 프로그램은 Windows 7에서는 자주 발생하지만 임의로 충돌하지만 Windows XP에서는 정상적으로 작동합니다. 디버깅은 액세스 위반을 나타내며 FS 레지스터에 액세스하려고 할 때 발생합니다.

XP와 Windows 7 모두에서 디버깅 및 비교 작업을 수행했으며 ESI를 사용하여 FS 레지스터에 액세스 할 때 주소가 Windows 7에서 항상 범위를 벗어나기 때문에 액세스 위반이 발생한다는 사실을 발견했습니다. 또한 SEH 예외 처리기 어셈블리 코드 만 액세스 위반이도 발생 FS를 읽을 때 : [0] (데이터를 알 수 없음으로 표시됩니다이) :

PUSHAD 
PUSH 004DE918 
MOV EAX,DWORD PTR FS:[0] 
PUSH EAX

응용 프로그램이 레지스터 손상의 원인이 될 수 있지만, 무엇의 원인이 될 수 이 문제는 Windows 7에서만 발생하지만 XP에서는 발생하지 않습니다. Windows 7에서 53의 다른 FS 레지스터 선택기가이 작업과 관련이 있습니까? 시도해 볼만한 제안이나 해결책이 있습니까?

감사합니다.

+0

WinXP 호환 모드에서 앱을 실행하는 것은 어떻습니까? 아니면 XP 모드 (Win7에서 XP VM)에서? –

+0

나는 다른 호환성 설정을 시도했지만 충돌은 여전히 ​​발생합니다. – Atuyo

+0

XP 모드로 알려진 XP VM조차도? –

답변

0

FS 레지스터는 TEB (스레드 환경 블록)라고도하는 TIB (스레드 정보 블록)에 빠르게 액세스하기 위해 Windows에서 사용됩니다. 메모리의 TIB 데이터 구조를 포함하는 세그먼트의 FS 저장소 선택기. 이 세그먼트의 크기가 매우 작아서 TEB 크기를 벗어나는 주소로의 액세스로 인해 일반 오류 예외가 발생할 것으로 예상됩니다. 실제로 TEB 데이터 구조 레이아웃과 TEB의 주소를 FS에 저장하는 것은 문서화되지 않았으며 버전에 따라 Microsoft에서 변경할 수 있습니다. 아마도 Windows 7에서 TEB 크기가 줄어들었을 것입니다.

문제를 더 생산적으로 논의하기 위해 충돌 순간에 FS와 ESI의 가치를 제공하십시오.

+0

FS에서 충돌 할 때의 값은 항상 ?? OllyDbg에서 [FFFFFFFF]를 읽을 때 액세스 위반이 나타납니다 ... ESI의 경우 주소가 항상 변경되지만 대부분 데이터 세그먼트 범위를 벗어납니다 (값을 확인하기 위해 다시 디버깅해야 함). 내 데이터 세그먼트의 범위 내에서 가리키는 지침이 유효하지 않습니다. – Atuyo

+0

FS 및 ESI의 값을 가져 오기 위해 windbg를 사용해보십시오. 이 값이 무엇인지 잘못 이해하고 있는지를 아는 것이 중요합니다. – ZarathustrA