2011-07-26 4 views
1

나는 dll을 프로그래밍한다. 이 dll에서는 메모리에로드 된 다른 dll 함수를 연결하려고합니다. 이것은 많은 근무 시간의 결과입니다.C++ function hook (dll, asm)

typedef int (__fastcall *def_cry)(int a,int b,int fromlen); 
def_cry Real_cry; 
int __fastcall custom_cry(int a,int b,int fromlen) { 
    Log("cry ..."); 
    __asm nop; 
    return Real_cry(a, b, fromlen); 
} 
DWORD imageBaseOtherDll = 0x39500000; 
DWORD functionOffset = 0x395742F8; 
DWORD imageBase = (DWORD)GetModuleHandle("otherDll.dll"); 
DWORD functionOffset = imageBase + (functionOffset - imageBaseOtherDll); 
Real_cry = (def_cry)DetourFunction((PBYTE)functionOffset,(PBYTE)&custom_cry); 

내 걸음이 작동하지 않는 것처럼 보입니다. 나는 코드에 논리적 인 오류를 넣었다고 생각하지만 초보자이고 단도직입 적 도움이된다!

+0

asm - 지금까지 시도한 내용과 문제가 무엇인지 생각해보십시오. 문제의 초점을 좁히십시오. 당신이 "이걸보고 고칠 수 있니?"라고 물으면 귀하의 질문은 투표로 마감됩니다. – Josh

+0

(+1) - 녀석은 새로운 사람이고, 그를 "-1ing"하여 stackoverflow에서 도망 치고 싶지는 않습니다. 나는 그 질문이 꽤 분명하다고 생각합니다. – Cipi

답변

3

연결 기능이 __fastcall 호출 규칙을 사용하고 있습니까?

DLL에서 내 보낸 함수를 연결하려면 또는이라고하는 모든 모듈 (dll/exe)의 가져 오기 테이블을 패치해야합니다. 런타임시 함수 엔트리 포인트를 다시 작성하십시오. 가져 오기 테이블을 패치하는 방법에 대한 기사는 CodeProject here에서 확인할 수 있습니다. MS Detours 사용에 관한 좋은 지침서는 here입니다.

DetourFunction을 호출 할 때 연결할 함수의 주소를 제공해야합니다. 이 값은 DLL이 특정 주소에서로드되는 것이 보장되지 않으므로 하드 코딩하지 않아야합니다. 다음 코드를 사용하면이 작업을 매우 쉽게 수행 할 수 있습니다.

// Get the module containing the function to hook 
HMODULE targetModule = GetModuleHandle("otherDll.dll"); 
// Get the address of the function to hook 
FARPROC targetFunction = GetProcAddress(targetModule, "cry"); 
// Go hook it. 
Real_cry = (def_cry)DetourFunction((PBYTE)targetFunction,(PBYTE)&custom_cry);