2012-02-12 4 views
1

응용 프로그램의 클래스에 상주하는 함수가 있습니다. 내 목표는 dll을 대상 프로세스에 삽입하고 해당 멤버 함수를 해당 주소로 호출하는 것입니다.주소에서 멤버 함수를 호출하는 방법

void GameAudio::StopAllSounds(void) // this is at address 0x004A0656 

내가 모든 것을 사용한이

typedef void(__stdcall * caller)(void); 
caller call = (caller)0x004A0656; 

처럼 호출 시도 : __stdcall는, __cdecl, __thiscall 당신이 그것을 이름을 다음은 기능입니다.

+0

항상 같은 주소입니까? –

+0

예 확실합니다 :) –

+0

전화를 걸면 어떻게됩니까? 디버거에서 호출을 시도 했습니까? 또한 모든 클래스 멤버 함수에는 암시적인 'this'인수가 있음을 기억하십시오. –

답변

1

클래스의 비 - static 구성원 함수 서명이 일반 함수와 다릅니다. 상기의 경우 예를 들면 X::foo() ,

class X { 
public: 
    void foo(); 
}; 
void foo(); 

::foo()과는 서로 다르다. 후드 아래 X::foo()이 somewaht처럼, 기억 : 당신이 정의되지 않은 동작 초래 할 시도 따라서 어떤

void X::foo (X* const this); 
      ^^^^^ implicitly added 

합니다.

주소를 사용하여 멤버 함수를 호출하려는 경우 static 멤버 함수로 설정하는 것이 좋습니다. X::foo()::foo()에 대한

class X { 
public: 
    static void foo(); 
}; 
void foo(); 

서명은 동일합니다.

: 귀하의 의견에 따르면 귀하는 소스 코드를 제어 할 수없는 것 같습니다. 하드 코딩 된 주소 대신 함수 서명에 적절한 호출 규칙을 사용하는 것이 좋습니다. 의사 코드

typedef void (GameAudio::*caller_type)(); 
caller_type caller = &GameAudio::StopAllSounds; 
GameAudio object; 
(object.*caller)(); 
+0

그래서 그 bassicaly 불가능? –

+0

네,하지만이 함수는 소스 코드가없는 응용 프로그램에 있다는 것을 기억해야합니다. 따라서 함수를 정적 멤버 함수 –

+0

@ user1205008로 변경할 수는 없습니다. 일반 멤버 함수 -> "하지 말아야 할 사항"이 있습니다. 'static' 멤버 함수 나'namespace' 스코프의 함수를 위해서 할 수 있습니다. 그러나 나는 아직도 주소를 사용할 필요가 있는지 의심 스럽다. 왜 주소를 사용하고 싶습니까? 코드를 이식 할 수 없도록 만듭니다. – iammilind

1

현재 수행중인 작업에 대한 구문이 없습니다. 함수가 가상 일 수도 있으므로 잘못된 함수를 호출 할 수 있습니다.

가장 쉬운 방법은 GameAudio* 매개 변수가있는 비 멤버 함수 또는 정적 멤버 함수를 변경/추가/추가하는 것입니다. 이 함수는 pointer-to 함수를 사용하여 쉽게 호출 할 수 있습니다.

멤버 함수를 직접 호출하려면 어셈블러를 사용하는 것이 가장 좋습니다. 문제는 이식성입니다. 솔루션은 컴파일러, SO, 아키텍처 및 심지어 ABI 버전에 달려 있습니다.

+0

괜찮습니다.이 응용 프로그램에 대한 소스가 없으므로 클래스/구조체에있는이 함수를 호출하는 것은 불가능할 것입니까? btw 나는 함수가 가상인지 여부를 알 수 있으며이 특정 함수는 –

+0

@user1205008이 아닙니다. 가상인지 여부는 쉽게 알 수 없습니다. 그리고 그것이 맞다하더라도 포인터는 실제 함수 나 vtable-entry 또는 vtable-thunk에 대한 포인터가 될 수 있습니다 ... 그 번호를 발견 한 위치에 따라 다릅니다. 가장 좋은 방법은 프로그램을 분해하고 그 주소를 둘러 보는 것입니다. 그리고 어셈블러에서 호출을 작성하는 경우 컴파일러 에서처럼 호출하는 것은 확실히 불가능하지 않습니다. 그것은 단지 까다 롭습니다. – rodrigo

+0

나는 dissasembler를 사용했다. –

관련 문제