2011-10-28 2 views
2

Windows DLL에서 핫 패칭을위한 메커니즘을 사용하여 API 후킹 방법을 연구했습니다. 누군가가 그 같은 DLL의 내부 내부 클래스의 C++ 생성자로 비 보낸 함수를 후킹하는 확장하는 방법을 알고한다면핫 패칭을 통한 후킹 ... dll의 내 보낸 클래스 메서드 없음

http://www.codeproject.com/KB/winsdk/0xF9EB_Hooking.aspx

궁금 해서요. 내가 dis-assembly를 통해 주소를 이미 알고있다 ... 내가 가지고있는 문제는 올바른 호출 규칙을 설정하여 내 함수 내에서 원래 함수를 호출 할 수있는 방법이다.

내 후크 함수가 호출되는 지점에 이미 왔습니다 ... 원래 함수를 호출 한 결과를 반환 할 수 없어 프로그램이 중단됩니다. 당신은 일반적으로 그들의 각각의 상대 또는 절대 주소를 덮어 쓸 수 있습니다

public __thiscall <class_name>::<class_name>(<single pointer arg to another object>) 

답변

3

이 모듈이로드 방식에 따라

우리가이 같은 프로토 타입 뭔가 내부 클래스 생성자 후킹에 대해 이야기하고 있다고 가정하자 전화 사이트, 그렇지 않으면 MS Detours와 같은 것을 사용하기 쉬운 트램펄린 기능을 만들어야합니다.

__thiscall 기반 클래스 멤버 함수의 올바른 프로토 타입에 관해서는 일반적으로 __thiscall 클래스를 외부 클래스로 사용할 수 없으므로 약간의 트릭이 필요합니다. 가장 빠르고 쉬운 방법은 __fastcall을 사용하고 두 번째 매개 변수를 무시하는 것입니다. 첫 번째 정의는 void __fastcall myctor(myobj* pObj)이됩니다.

+0

무엇을 하든지, 우회로는 피하십시오. 무료 버전 ($ 10k가 아닌)은 다양한 재미 있고 창의적인 segfault 및 기타 충돌을 일으킬 수 있습니다 (32 비트 프로세스에서도 64 비트 시스템에서 작동하지 않는 경향이 있음). EasyHook은 문서가 매우 부족한 반면 훨씬 안정적인 대안입니다 (그리고 다소 안전합니다). – ssube

+0

@peachykeen : 왜 내가 * 같은 것을 말했습니까? 나는 우회로의 팬이 아니기 때문에 우연히 만난 것입니다 ... – Necrolis

-1

레지스터에 this 포인터가 있어야한다는 점을 제외하고는 일반적인 __stdcall 기능으로 정의하십시오. 당신이 전화의 시작 부분에이 작업을 수행해야합니다

void __stdcall HookedConstructor(SomeObject *pObject){ 
    HookedClass *pClass; 
    __asm mov pClass, ecx; 
    ... 
} 

참고 :이 포인터를해야하는 경우, 값을 얻기 위해 __asm 키워드를 사용합니다. 그렇지 않으면 ecx 레지스터의 값을 덮어 쓸 수 있습니다.

+0

대부분의 클래스 함수 정의는 특별히 말하지 않는 한'__thiscall'을 사용합니다 그래서'__cdecl'을 임의로 사용하면 스택 손상 문제가 발생합니다. – Necrolis

+0

@ 네크로리스 당신 말이 맞아요. – JosephH

+0

후크/스텁 클래스를 제공하는 것이 훨씬 안전하고 깨끗합니다. 멤버에 대한 정보가있는 경우 멤버와 함께 사용하고 그 안에 함수를 구현 한 다음 후크에서 포인터를 멤버로 사용하십시오. – ssube