2011-08-01 5 views
3

keyst로 정의 된 메서드는 내 자신의 처리를 수행하고 내 값을 반환하므로 kext가 메서드를 호출 할 때마다 내 것으로 라우트됩니다. 그래서 내가하고 싶은 것은이 방법을 내 자신의 커널 확장에서 정의하고로드하는 것이다. 문제는 내가 대신에 메신저를 호출하는 방법을 바꿀 방법을 모른다는 것입니다.다른 kext로 정의 된 메서드를 재정의 하시겠습니까?

/* basically, I need to override the isPinDigital method of AppleHDAPathSet */ 
AppleHDAPathSet::isPinDigital(void) 
{ 
    /* I also need to be able to call the superclass' method */ 

    /* return my own value */ 
    return 0; 
} 

쉬운 방법이 있나요? VTables을 통해 모든 커널 확장이 같은 주소 공간에서 실행된다는 것을 알고 있습니다. (유일한 방법이라고 생각하지만, 어떻게해야할지 모르겠습니다).

답변

2

vtable을 해킹하여이 목표를 달성 할 수 있습니다.하지만 어떻게 할 것인지 구체적인 생각이 없습니다. C++ kext로드 및 언로드 메커니즘이 vtable 및 vtable 버전 관리를 관리한다는 것을 알고 있습니다. 근원은 유효해야한다, 그래서 그것을보십시오.

그러나 vtable 패치가 실제로 최후의 수단이되어야합니다. AppleHDAPathSet을 하위 클래스 화하여이 작업을 수행 할 수 없습니까? IOKit 성격 클래스가 아니라고 가정하면 하위 클래스도 하위 클래스로 분류해야하고 하위 클래스 성격이 기본보다 높은 프로브 점수를 갖도록 info.plist를 설정해야합니다. isPinDigital 해킹이 적용되어야하는지 여부를 결정하려면 probe() 방법을 사용하십시오. 그런 다음 원래 어떤 방법 으로든 AppleHDAPathSet 객체를 인스턴스화하고 서브 클래 싱 된 버전의 인스턴스를 만듭니다.

+0

'AppleHDAPathSet' 클래스는'AppleHDA' kext 안에 생성됩니다. 하위 클래스를 만들면 어떻게'AppleHDA'가 생성하고'AppleHDAPathSet'의 인스턴스를 만들 때마다 내 하위 클래스가 생성되는 것을 보장 할 수 있습니까? –

+0

앞에서 말했듯이 관련 성격 클래스의 메서드를 재정의해야합니다. AppleHDA.kext의 info.plist를 보면, 두 개의 퍼스낼리티 클래스 인'AppleHDADriver'와'AppleHDACodecGeneric'을 가지고 있습니다. 인스턴스가 생성 된 클래스와 메서드 중 어느 것이 있는지 파악한 다음이를 재정의해야합니다. 소스는 이러한 클래스에서 사용할 수있는 것 같지 않으므로 디스 어셈블리를 통해 넘어갈 필요가 있습니다. – pmdj

+0

나는 이미 그것을 분해했다. 그래서'PathSet' 인스턴스를 생성하는 메소드를 서브 클래스 화하고, 원하는대로 동작하는'PathSet's의 서브 클래스를 리턴하게 만드시겠습니까? –

관련 문제