2013-08-03 5 views
0

kernel32 함수 중 하나를 후킹 할 때 왜 프로그램을 실행할 수 없는지 아십니까? 나는 스레드를 사용하고 있기 때문에 더 많은 것을 최적화하고 싶습니다.하지만 뭔가 잘못되었습니다 ...kernel32.dll 함수를 후킹하면 프로그램이 작동하지 않습니다.

OpenProcess는 이전에이 문제와 동일한 문제를 시도했기 때문에 작성되었습니다.

typedef HANDLE (WINAPI * pOpenProcess)( _In_ HANDLE hProcess, 
             _In_ LPSECURITY_ATTRIBUTES lpThreadAttributes, 
             _In_ SIZE_T dwStackSize, 
             _In_ LPTHREAD_START_ROUTINE lpStartAddress, 
             _In_ LPVOID lpParameter, 
             _In_ DWORD dwCreationFlags, 
             _Out_ LPDWORD lpThreadId); 

pOpenProcess original; 

__declspec(naked) void hOpenProcess() 
{ 
    __asm PUSHAD 
    __asm PUSHFD 
     //my actions here 
    __asm POPFD 
    __asm POPAD 
    __asm JMP[original] 
}; 

void ZPerformHook() 
{ 
    DWORD Address = (DWORD)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "CreateRemoteThread"); 
    original = (pOpenProcess)DetourFunction((PBYTE)Address, (PBYTE)hOpenProcess); 
} 
+0

을 적용하고 있는지 확인하기 위해 우회 한 후 대상 기능을 덤프 수 있습니다. 가장 먼저 할 일은 스택을 변경하는 것입니다. 그 좋지 않다. 귀하의 코드는 스택을 손상시키지 않고 CPU 레지스터 * 및 *를 보존해야합니다. 그건 자소하지 않아서,이 코드를 직접 쓰지 않는 것이 가장 좋습니다. 그것은 이미 끝났습니다. 이미 [detours]로 질문에 태그를 지정 했으므로 이미 좋은 해결책을 알고 있습니다. 다른 것을 기대하는 데는 작은 포인트가 있습니다. –

+0

@HansPassant : 자신의 코드를 작성해야 할 이유가 없다는 것에 전심으로 동의하지만, 위에서 PUSH 작업이 POP 작업과 일치하기 때문에 스택이 위에 메시지를 전달한다는 주장은 적용되지 않습니다. 원래 함수 호출이 아닙니다. 아마'// 여기 내 행동 '이 어떻게 든 망가져있을 수도 있습니다 (또는'원래'는 올바른 주소를 포함하지 않을 수도 있습니다). –

+1

[물론 이것이 32 비트 코드 용으로 컴파일되었다고 가정하겠습니다.]하지만 어쨌든 인라인 어셈블러는 64 비트 모드에서 지원되지 않습니다. 인라인 어셈블러는 PUSHFD 및 POPFD와 PUSHAD 및 POPAD가 작동하지 않는다는 것을 알아야합니다. x86-64. –

답변

1

"// 여기 내 행동"은 흥미로울 것입니다. 아마도 스택을 손상시킬 수 있습니다. 또는 오류가 DetourFunction에있을 수 있습니다. 프로그램이 어떻게 실패합니까? 액세스 위반이있을 수 있습니까?

네이 키드 기능을 사용하지 않아도됩니다. 당신은 당신의 목표와 똑같은 서명을 가진 함수에 연결 만하면됩니다. 필요하지 않습니다. 그거 ...이 수정 경우

HANDLE __stdcall hOpenProcess( HANDLE hProcess, 
           LPSECURITY_ATTRIBUTES lpThreadAttributes, 
           SIZE_T dwStackSize, 
           LPTHREAD_START_ROUTINE lpStartAddress, 
           LPVOID lpParameter, 
           DWORD dwCreationFlags, 
           LPDWORD lpThreadId) 
{ 
    // do your stuff here 
    std::cout << "From hook" << std::endl; 

    return original(hProcess, lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId); 
} 

는 나던 작업은 GetProcAddress를의 반환 값을 확인, 당신의 DetourFunction에서 뭔가 잘못 갈 수 있다면.

당신은 또한 beaengine 같은 디스어셈블러를 사용하고 후크가 제대로 OpenProcess에 대한 인수가 스택에 전달됩니다