트러블슈팅/Windbg, Debugging

Dump의 신뢰하기 어려운 값

TheShield 2021. 3. 21. 19:38
반응형

1. 최적화가 되어 있다. 

>> 소스코드에 존재하는 모든 지역변수가 '반드시' 다 보이는 것은 아니다. 

그러므로 dv 혹은 로컬변수 출력창에서 memory access error 등 보이지 않을 수 있다. 

저장되지 않은 변수는 레지스터에서 일시적으로 저장된다. 그러므로 레지스터를 추적해야 한다.

당연히 이전 함수 프레임의 레지스터는 휘발되었으니 이 때부터는... 디서셈을 시작하지. 

 

2. x64의 함수 호출에서의 파라메터

>> x86은 함수 호출 시 파라메터를 4개까지 스택에 저장하지만, 

x64의 경우엔 레지스터가 늘어난 대신에 최대한 레지스터를 활용하여 함수 호출 시 파라메터를

레지스터에 저장해서 넘겨준다. 그렇기 때문에 마찬가지로 레지스터를 추적해야 한다.

>> 하지만 컴파일 옵션 중에 파라메터를 스택에 저장하는 옵션도 있다, 이는 고려해봐야 한다. 

 

즉, 최적화가 된 x64의 덤프 분석은, 헬 모드일 가능성이 높다.

>> 지역변수가 제대로 안보인다, 파라메터도 확신할 수 없다. 

 

그러나 우리는 단 한가지는 그래도 어느정도는 확신할 수 있다.

클래스의 함수호출에서 대부분 첫번 째는 this 포인터이다.

(레지스터라면 ecx 를 보자, 주로 여기에 저장된다 > 확인해볼 수 있다)

> 하지만 이 또한 마찬가지로 100%는 아니기 때문에 확인을 해야 한다.

 

정확한 것을 찾으려면 디서셈블을 해서 파라메터를 어떻게 넘기고, 어떤 레지스트리에서

옮겨갔는지 찾아내야 한다. 

 

정말 너무 어렵다면 디서셈블러를 쓰거나, 

최적화를 모두 끈 후에 재현시켜서 덤프를 확인해야 한다. 

 

 

 

 

반응형