이 보드의 첫 번째 질문과 이미 꽤 긴 질문 - 죄송합니다. (이 플랫폼에서 얻은 훌륭한 팁에 대해 모두 감사드립니다.) .어셈블러 "호출"명령어가 포함 된 Microsoft Detour - Hook 함수
여러 기능을 연결하려고합니다. (플러그인 코드가 많아서 내가 훅을 쓰고 싶지 않은 기능을 쓰거나 변경할 수 없지만 동일한 프로세스/스레드에서 직접 액세스 할 수 있습니다) Microsoft Detours.
C 스타일 컴파일러에 의해 생성되는 중독 항상 다음 어셈블러 "시작"코드가되어야 모든 기능 :
045A1A85 push ebp
045A1A86 push ebx
045A1A87 push esi
045A1A88 push edi
045A1A89 call 045A1A8E
045A1A8E pop eax
045A1A8F mov ebx,eax
//go on with a little bit more assembler code
을 일부 레지스터는 스택에 푸시하고 있습니다 볼 수 있듯이 호출 명령어는 다음 줄로 호출됩니다 (이미 생성 된 코드에 액세스 할 수 없다고 말한 것처럼 이것을 변경하지 말아주십시오). 호출 명령은 스택 변경 -이 스택 변화가 EAX 레지스터에 저장하고 추가 처리를 위해 사용된다 (!)
이 방법은 푹한다 :
045A1A85 jmp hooking_function (528040h)
045A1A8A int 3
045A1A8B int 3
045A1A8C int 3
045A1A8D int 3
045A1A8E pop eax
후킹 함수로 정의 트램펄린 기능으로 점프하는 알몸 기능.
031F0060 push ebp
031F0061 push ebx
031F0062 push esi
031F0063 push edi
031F0064 call 045A1A8E
031F0069 jmp 045A1A8E
주요 문제, 트램폴린 어셈블러 코드 1)에서 호출 명령이 경우 (스택에 잘못된 값을 추가하는 031f0064을 행 다음 나토 기능으로
__inline __declspec(naked) void hooking_function()
{
//more code in future
__asm {
jmp org_func_trampoline
}
}
045A1A89 대신) -> eax를 사용한 추가 프로세싱은 잘못된 결과를받습니다. 2) 다음 "ret"가 "031F0069"로 다시 돌아갈 때 스택 프레임을 다소 파괴합니다. ==> 동일한 처리가 두 번 수행됩니다. ret가 다시 호출되어 잘못된 함수로 연결됩니다.
내가 원하는 모든 기능이 위에서 설명한 서문으로 시작한다는 것을 보장하지 않습니다. 따라서 후킹 기능을 다시 쓸 수없고 무시합니다. trampoline 메서드 ...
이 텍스트의 기본 질문은 다음과 같습니다. 함수의 처음 5 바이트에서 호출 명령이 호출되는 Microsoft Detour와 함 수를 연결할 수 있습니까? (하지 않을 경우, 어떤 대안이 있습니까?)
이 (당신의 도움에 대한 희망과) 읽어 주셔서 대단히 감사 는
주소와 모든 것이 상대적으로 정확합니까? 후킹하려는 함수가 다음 명령어를 호출하는 이유는 무엇입니까 ('call 045A1A8E')? –
아, 예, 트램 폴린을 올바르게 호출하는 한 Detours는 처음 5 바이트가 호출되는 곳의 기능을 연결할 수 있습니다. –
@Seth Carnegie 답변을 주셔서 감사합니다. 지금까지 보았 듯이이 함수는 레지스터 eip에 액세스하려고 시도합니다. 레지스터 eip는 다음 행을 호출하여 가능하며 스택을 읽지 않습니다 (직접이 아님). – TechMuc