이것은 간단한 질문 일뿐입니다. 나는 DetourAttach(&(PVOID &)BindKeyT, BindKeyD);
을 사용하여 서브 루틴의 메모리 주소에 부착 된 소스를 읽었습니다. 여기서 BindKeyT
은 메모리의 서브 루틴에 대한 주소입니다. 나는 궁금한데, 정확히 (&(PVOID &)
는 영어로 무엇을 의미합니까? 나는 PVOID
이 무효 포인터라는 것을 알고 있지만 어떻게 우회로를 부착하는 데 사용할 수있는 함수로 변환됩니까?DetourAttach (& (PVOID &) BindKeyT, BindKeyD)는 무엇입니까? 평균? 메모리 주소에 우회 연결하기
답변
테리 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에 대한 선언이 일치해야합니다.
버그가없는 내 머리글의 C++ 파서는 BoidKeyT의 C 스타일 캐스트 (void (PVOID &) 부분에 대한 참조)를 말한 다음 그 주소를 사용합니다 - 앞에 &. 따라서 표현식의 결과는 함수에 대한 포인터에 대한 포인터입니다. 여기 본론에 대한 소개가
이제 포인터가 함수 포인터에 대한 포인터라고 가정하면 메모리 주소를 단순히 함수가되도록 호출하여 호출 할 수 있습니까? – Gbps
AFAIK DetourAttach 함수에 대한 포인터를 포인터가 필요하므로 구문을 사용하거나 임시 포인터를 소개하고 그 주소를 사용해야합니다. –
BindKeyT를 함수로 사용하려면이 주소가 "x"인데 실제 BindKeyT 대신 x *를 전달한다고 가정 해 봅시다. – Gbps
& x를 넘깁니다. x *는 함수를 가리키며 & x는 x의 주소입니다. DetourAttach는 참조에 대한 참조를 원합니다. – Amey