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);
}
을 적용하고 있는지 확인하기 위해 우회 한 후 대상 기능을 덤프 수 있습니다. 가장 먼저 할 일은 스택을 변경하는 것입니다. 그 좋지 않다. 귀하의 코드는 스택을 손상시키지 않고 CPU 레지스터 * 및 *를 보존해야합니다. 그건 자소하지 않아서,이 코드를 직접 쓰지 않는 것이 가장 좋습니다. 그것은 이미 끝났습니다. 이미 [detours]로 질문에 태그를 지정 했으므로 이미 좋은 해결책을 알고 있습니다. 다른 것을 기대하는 데는 작은 포인트가 있습니다. –
@HansPassant : 자신의 코드를 작성해야 할 이유가 없다는 것에 전심으로 동의하지만, 위에서 PUSH 작업이 POP 작업과 일치하기 때문에 스택이 위에 메시지를 전달한다는 주장은 적용되지 않습니다. 원래 함수 호출이 아닙니다. 아마'// 여기 내 행동 '이 어떻게 든 망가져있을 수도 있습니다 (또는'원래'는 올바른 주소를 포함하지 않을 수도 있습니다). –
[물론 이것이 32 비트 코드 용으로 컴파일되었다고 가정하겠습니다.]하지만 어쨌든 인라인 어셈블러는 64 비트 모드에서 지원되지 않습니다. 인라인 어셈블러는 PUSHFD 및 POPFD와 PUSHAD 및 POPAD가 작동하지 않는다는 것을 알아야합니다. x86-64. –