2010-02-10 4 views
0

사용자 지정 recv() winsock2.0 메서드를 원격 프로세스에 연결하여 프로세스 내 함수 대신 내 함수를 실행하려고했습니다. 난 정말 좋은 예를 발견,하지만 그들은 부족 설명원격 프로세스에 Winsock2 recv() 후크

typedef (WINAPI * WSAREC)(SOCKET s, char *buf, int len, int flags) = recv; 

이제 내 질문이 무슨 뜻, 또는 무엇을,이 실제 RECV() 함수에 대한 포인터의 일종이다?

그리고이 질문은 정말 기본적인 소리 경우

int WINAPI Cus_Recv(SOCKET s, char *buf, int len, int flags) 
{ 
    printf("Intercepted a packet"); 

    return WSAREC(s, buf, len, flags); // <- What is this? 
} 

죄송합니다, 나는 단지 2 ~ 3 주 전에 배우기 시작 사용자 정의 함수에 대한 코드의 다른 부분

. 감사합니다. .

답변

1

그런 예가 어디 있었습니까?

첫 줄은 recv()과 같은 서명을 가진 함수에 대한 포인터 인 새로운 유형의 WSAREC를 정의하려고합니다. 불행하게도이 타입의 변수를 선언하여 recv() 함수의 주소를 저장하려고합니다. 함수가 리턴 타입이 없기 때문에 typedef가 잘못되었습니다. 그래서 2003

당신이 사용하여 더 많은 행운이있을 수 있습니다 비주얼 스튜디오에서 컴파일되지 않습니다 다음 recv()의 주소를 저장 "기능을하는 포인터"타입의 변수를 선언

int (WINAPI * WSAREC)(SOCKET s, char *buf, int len, int flags) = &recv; 

합니다.

이제 두 번째 코드 단편은 메시지를 인쇄 한 후 recv() 함수와 동일한 서명을 가진 함수이며 위에서 선언 한 함수 포인터를 통해 recv()을 호출합니다.

여기의 코드는 포인터를 통해 함수를 호출하는 방법 만 보여줍니다. 현재 프로세스에서 아무 것도 대체하지 않습니다.

또한 다른 프로세스를 방해하고 사용자의 의지로 하나의 기능을 바꿀 수 있는지 확신하지 못합니다. 그것은 시스템의 보안에 큰 위협이 될 것입니다. 그러나 당신은 왜 그것을 첫번째 장소에서 할 것입니까?

+0

온라인 게임에서 게임 가드를 만들기 위해 일부 패킷을 받으려고합니다. 그러나이 코드는 컴파일되고 완벽하게 작동하며 보안 기능을 대체하지 않았으며 API 누락으로 인해 코드가 누락되었습니다 (누락 된 코드) 패킷을 수신하는 원래 프로세스의 함수. 제 질문은 전적으로 그 개념에 관한 것이 었습니다. 어떻게 작동합니까, 어쨌든 당신의 답변에 감사드립니다. – SimpleButPerfect