2010-03-08 4 views
1

이것은 간단한 질문 일뿐입니다. 나는 DetourAttach(&(PVOID &)BindKeyT, BindKeyD);을 사용하여 서브 루틴의 메모리 주소에 부착 된 소스를 읽었습니다. 여기서 BindKeyT은 메모리의 서브 루틴에 대한 주소입니다. 나는 궁금한데, 정확히 (&(PVOID &)는 영어로 무엇을 의미합니까? 나는 PVOID이 무효 포인터라는 것을 알고 있지만 어떻게 우회로를 부착하는 데 사용할 수있는 함수로 변환됩니까?DetourAttach (& (PVOID &) BindKeyT, BindKeyD)는 무엇입니까? 평균? 메모리 주소에 우회 연결하기

답변

2

테리 Mahaffey가 맞다는 당신이 전달하는 것은 함수에 대한 포인터에 대한 포인터입니다. 이 함수는 포인터를 전달하는 함수 (이 경우 DetourAttach)가 두 개 이상의 값을 반환하려고 할 때마다 일반적으로 사용되며 반환 값 중 하나는 포인터입니다. C/C++의 함수는 단일 값만 반환 할 수 있기 때문에 여러 값을 얻는 유일한 방법은 포인터를 사용하는 것입니다.

간단한 예는 할당 된 메모리 블록에 대한 포인터를 반환하려는 경우입니다. 같은 그러던 어느 함수를 작성할 수 있습니다

int allocstr(int len, char **retptr) 
{ 
    char *p = malloc(len + 1); /* +1 for \0 */ 
    if(p == NULL) 
    return 0; 
    *retptr = p; 
    return 1; 
} 

함수로 사용하는 방법에 대한 설정 메모리 주소의, 다른 질문에 대답하기 위해, 하나는 지금처럼 작업을 수행 할 수 있습니다

void* (void * BindKeyT)(const char* key) = actual_BindKeyT; 

// actual_BindKeyT is a pointer to a function that will be defined elsewhere, 
// and whose declaration you will include in your project through a header file 
// or a dll import 

void * BindKeyD(const char* key) 
{ 
    // Code for your hook function 
} 

DetourAttach(&(PVOID&)BindKeyT, BindKeyD); 

(http://zenersblog.blogspot.com/2008/04/api-hooking-with-detours-part-1.html에서 가져옴)

BindKeyT 및 BindKeyD에 대한 선언이 일치해야합니다.

+0

BindKeyT를 함수로 사용하려면이 주소가 "x"인데 실제 BindKeyT 대신 x *를 전달한다고 가정 해 봅시다. – Gbps

+0

& x를 넘깁니다. x *는 함수를 가리키며 & x는 x의 주소입니다. DetourAttach는 참조에 대한 참조를 원합니다. – Amey

1

버그가없는 내 머리글의 C++ 파서는 BoidKeyT의 C 스타일 캐스트 (void (PVOID &) 부분에 대한 참조)를 말한 다음 그 주소를 사용합니다 - 앞에 &. 따라서 표현식의 결과는 함수에 대한 포인터에 대한 포인터입니다. 여기 본론에 대한 소개가

+0

이제 포인터가 함수 포인터에 대한 포인터라고 가정하면 메모리 주소를 단순히 함수가되도록 호출하여 호출 할 수 있습니까? – Gbps

+0

AFAIK DetourAttach 함수에 대한 포인터를 포인터가 필요하므로 구문을 사용하거나 임시 포인터를 소개하고 그 주소를 사용해야합니다. –