BOOL hook_by_code(LPCTSTR szDllName, LPCTSTR szFuncName, PROC pfnNew, PBYTE pOrgBytes)
{
FARPROC pfnOrg;
DWORD dwOldProtect, dwAddress;
BYTE pBuf[5] = {0xE9,0,};
PBYTE pByte;
// 후킹대상 API 주소를 구한다
pfnOrg = (FARPROC)GetProcAddress(GetModuleHandle(szDllName), szFuncName);
pByte = (PBYTE)pfnOrg;
// 만약 이미 후킹되어 있다면 return FALSE
// OpCode 0xE9 는 JMP 이므로
if(pByte[0] == 0xE9)
return FALSE;
// 5byte 패치를 위하여 메모리에 WRITE 속성 추가
VirtualProtect((LPVOID)pfnOrg, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
// 기존 코드 5byte 백업
memcpy(pOrgBytes, pfnOrg, 5);
// JMP 주소계산 (E9 XXXXXXXX)
// XXXXXXXX => 점프할 주소 - 현재 명령어 주소 - 5
// 마지막에 5를 빼주는 이유는 JMP 명령어 자체 길이 5 Byte를 보정해주는것임
dwAddress = (DWORD)pfnNew - (DWORD)pfnOrg - 5;
memcpy(&pBuf[1], &dwAddress, 4);
// HOOK - 5 byte 패치(JMP XXXXXXXX)
memcpy(pfnOrg, pBuf, 5);
//메모리 속성 복원
VirtualProtect((LPVOID)pfnOrg, 5, dwOldProtect, &dwOldProtect);
return TRUE;
}
BOOL unhook_by_code(LPCTSTR szDllName, LPCTSTR szFuncName, PBYTE pOrgBytes)
{
FARPROC pFun;
DWORD dwOldProtect;
//API 주소를 구한다
pFun = GetProcAddress(GetModuleHandle(szDllName), szFuncName);
// 원래 코드 5 byte를 덮어쓰기 위하여 메모리에 WRITE 속성을 추가한다
VirtualProtect((LPVOID)pFunc, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
// unhook
memcpy(pFunc, pOrgBytes, 5);
//메모리 속성 복원
VirtualProtect((LPVOID)pFunc, 5, dwOldProtect, &dwOldProtect);
return TRUE;
}
이함수가 함수후킹 강좌로 나와있었는데요
dll을불러와서 함수를 가저오는거같은데
함수를 가저오는거 같은데 이함수를 쓰면 함수후킹이 되는거 맞나요?
함수후킹이 메모리에서 하는행동일거라 예산햇는데
dll에서 가저오는거같네요 사용한다해도 해당dll에 어떤함수가 있는지를 모르는데
어떻게 가저와야할가요? 이걸모르겠네요
|