2014-11-14 14 views
2

EasyHook을 사용하여 라이브러리에서 시스템 API 루틴 (C++)을 후킹하는 데 성공했습니다. 이러한 라이브러리는 항상 플랫하고 기본적으로 전역 호출 가능 루틴으로 채워져 있습니다.GetProcAddress 및 EasyHook을 사용하여 클래스 메서드 및 생성자를 후킹

HMODULE hUser32 = GetModuleHandle (L"User32"); 
FARPROC TrampolineMethod; // This would have been set to my new replacement trampoline method. 
TRACED_HOOK_HANDLE hHook = new HOOK_TRACE_INFO(); 
NTSTATUS status; 

status = LhInstallHook(
      GetProcAddress(hUser32, "MessageBeep"), 
      TrampolineMethod, 
      (PVOID)0x12345678, 
      hHook); 

이 모두가 좋은 작품입니다 : 여기에서 User32.dll 라이브러리 (마이너스 설정 코드)에서 MessageBeep()를 사용하여 작은 샘플입니다. 문제는, 이제 전역 함수가 아니라 클래스에서 메서드를 후크 할 필요가 있다는 것입니다. 나는 그 객체 자체에 대해 정말로 신경 쓰지 않는다. 나는 그 메소드의 매개 변수를 조사하는데 정말로 관심이있다. GetProcAddress()에 대한 함수 이름 매개 변수에서 구문 론적으로 루틴을 식별하는 방법을 모르겠습니다. GetProcAddress()가 지원하는지 확실하지 않습니다. 예를 들어, 나는 gdiplus.dll을 라이브러리 밖으로 Pen::SetColor() 방법 후크 싶습니다

HMODULE hGDIPlus = GetModuleHandle (L"Gdiplus"); 
FARPROC TrampolineMethod; // This would have been set to my new replacement trampoline method. 
TRACED_HOOK_HANDLE hHook = new HOOK_TRACE_INFO(); 
NTSTATUS status; 

status = LhInstallHook(
      GetProcAddress(hGDIPlus, "Pen.SetColor"), // this is probably wrong or not possible here 
      TrampolineMethod, 
      (PVOID)0x12345678, 
      hHook); 

GetProcAddress를 (hGDIPlus을 이것은 물론 작동하지 않습니다와 나는 생각하지 않는다 "Pen.SetColor을 ")이 정확합니다. GetProcAddress()에 클래스의 멤버 함수를 어떻게 지정합니까? 이것은 가능한가? 또한 Pen::Pen()과 같은 생성자를 연결하려는 경우 어떻게 보이나요?

답변

0

Windows에서 사용하는 PE (Portable Executable) 형식은 개체 나 메서드를 내보내거나 가져올 수 없으므로 GdiPlus (또는 다른 DLL)가 내부적으로 사용하는 형식이 아닙니다. 객체 표기법은 DLL의 가져 오기 라이브러리에서 구현 된 추상화 일 것입니다. 당신은 종속성 워커 도구 (윈도우 SDK), 또는 유사한과에는 GDIPlus의 수출 테이블을 살펴 경우

, 당신은 그래서 MessageBeep처럼, 기본적으로 기존의 수출 다르지 않다

GdipGetPenColor 
GdipSetPenColor 
etc. 

을 볼 수 있습니다.

+0

흥미 롭습니다. 정확히 내 질문에 대답하지 않습니다. 그러나 잠재적으로 동일한 결과를 얻는 대체 경로입니다. 고마워, 내가 이것을 추구하고 그것이 나에게 효과가 있다면 다시보고 할 것이다. – Ultratrunks