2013-06-07 4 views
0

나는 우회 라이브러리를 사용하여 튜토리얼을 만들려고 노력하고있다.DetourAttach()를 16 진수 함수의 포인터로 사용하는 방법은 무엇입니까?

이전 버전의 우회 라이브러리 v1.5에서는 DetourFunction 함수를 사용하여 주소를 정의 했으므로 DLL이 함수를 찾을 위치를 알 수 있습니다. 그것은 예로써 사용될 수

다음 :

  InsertDateTime = (int (__stdcall*)(int))DetourFunction((PBYTE)0x01006F10,  (PBYTE)MyInsertDateTime) 

그러나 최신 버전의 함수 ppPointer 대상 포인터이다

 LONG DetourAttach(
     PVOID * ppPointer, 
     PVOID pDetour 
    ); 

로 변경 http://www.moddb.com/groups/ibepex/tutorials/function-hooking

참조 우회로가 부착 될 포인터.

대상 함수의 주소를 16 진수 형식 0x01006F10으로 알고 있기 때문에 어떻게 든 그것을 ppPointer의 인수로 사용하고 싶습니다. 난 그냥 쓰려고했습니다 :

   InsertDateTime = (int (__stdcall*)(int))DetourAttach((PVOID*)0x01006F10, MyInsertDateTime); 

을하고 그것을 잘 컴파일하지만 생각만큼 내 프로그램이 작동하지 않습니다. 프로그램이 그 주소에서 기능을 포착하지 못하는 것 같습니다.

그래서 기본적으로 내 질문은 정확히 16 진수 주소에 대한 포인터를 사용 했나요? 그리고 두 번째로 DetourAttach()를 사용하는 방식에 근본적인 실수가 있습니까?

+0

대신 EasyHook을 사용하는 것이 좋습니다 ... http://easyhook.codeplex.com/ – TCS

답변

3

DetourAttach을 잘못 사용 중입니다. 귀하의 경우 올바른 사용법은 다음과 같습니다

int(__stdcall* InsertDateTime)(int) = (int(__stdcall*)(int))(0x01006F10); 

LONG errorCode = DetourAttach((PVOID*)(&InsertDateTime), (PVOID)MyInsertDateTime); 
if(!errorCode) { 
    //Detour successful 
} 

참고 ASLR 같은 기술의 존재; 런타임에 함수의 주소를 검색하려면 GetProcAddress과 같은 것을 사용해야합니다. 그렇지 않으면 손상이나 충돌을 일으킬 수 있습니다.

+0

첫째, 좋은 답변입니다! 그래서 여러분이 작성한 첫 번째 줄은 시작 주소가 0x01006F10 인 함수에 대한 포인터입니다. 나는이 일을 시도했지만 그 주소로 그 기능을 활성화 할 때 아무 일도 일어나지 않는다. Winject를 사용하여 DLL을 프로세스에 주입합니다. 이제 함수를 후크에 삽입하려고 시도하는 프로세스가 32 비트 메모장입니다. IDL Pro에서 찾은 기능 주소가 유효하지 않도록 ASLR을 사용할 수 있습니까? – Euklides