왜 ( 0x0C
일반적으로 0x08
모르겠습니까? 어떤 종류의 응용 프로그램 보다) 더 일반적인 것처럼 보이는가 에 관해서 는 가상 메서드 테이블 포인터와 관련이있을 수 있습니다. 이것은 실제로 더 많은 주석 (야생 질량 추측 :)이지만 다소 큽니다. 여기서 가상 메서드가있는 클래스가 있으면 자체 필드가로 바뀝니다 0x04
. 예를 들어, 다른 가상 클래스에서 상속 된 클래스는 다음과 같은 메모리 레이아웃을 가질 수 있습니다.
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
이것이 일반적인 시나리오입니까, 아니면 가까운가? 잘 모르겠습니다. 그러나 64 비트 응용 프로그램에서는이 기능이 훨씬 더 흥미롭게 0x0C
값 으로 전환 될 수 있습니다 .
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
따라서 실제로 응용 프로그램이 널 포인터 오프셋에서 크게 겹치는 경우가 많이 있습니다. 하위 클래스의 첫 번째 필드 또는 가상 메소드 테이블 포인터 일 수 있습니다. 인스턴스에서 가상 메소드를 호출 할 때마다 필요하므로 포인터에서 가상 메소드를 호출하면 해당 클래스에 대한 null
액세스 위반이 발생합니다. VMT 오프셋. 이 특정 값의 유병률은 유사한 상속 패턴을 갖는 클래스를 제공하거나 특정 인터페이스 (DirectX 게임과 같은 일부 응용 프로그램 클래스에서 가능)를 제공하는 공통 API와 관련이있을 수 있습니다. 이와 같은 간단한 일반적인 원인을 추적하는 것이 가능할 수도 있지만 null 역 참조를 매우 빠르게 수행하는 응용 프로그램을 제거하는 경향이 있습니다.
0000000C
것입니다 방법 보다 더 일반적인00000008
, 그러나 대답 것도 주소로 보이지 않는다 모든시 : /